local_flush_tlb_all 函数作用?(又遇到新的问题)
本帖最后由 leslielg 于 2014-04-29 13:23 编辑arm linux 2.6.35
kernel启动时,setup_arch->paging_init->devicemaps_init 在最后两行调用了这个函数:
static inline void local_flush_tlb_all(void)
{
const int zero = 0;
const unsigned int __tlb_flag = __cpu_tlb_flags;
if (tlb_flag(TLB_WB))
dsb();
if (tlb_flag(TLB_V3_FULL))
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_V4_U_FULL | TLB_V6_U_FULL))
asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_V4_D_FULL | TLB_V6_D_FULL))
asm("mcr p15, 0, %0, c8, c6, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_V4_I_FULL | TLB_V6_I_FULL))
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_V7_UIS_FULL))
asm("mcr p15, 0, %0, c8, c3, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_BTB)) {
/* flush the branch target cache */
asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc");
dsb();
isb();
}
if (tlb_flag(TLB_V7_IS_BTB)) {
/* flush the branch target cache */
asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc");
dsb();
isb();
}
}
谁能帮忙解读一下么? 从函数名字看就大概猜出干什么了
arm管理cache也是通过协处理器的,看看spec把 对v7,展开的操作是:
SMP: dsb();
asm("mcr p15, 0, %0, c8, c3, 0" : : "r" (zero) : "cc");
dsb();
isb();
即是:“Invalidate entire unified TLB Inner Shareable ”
UP: dsb();
asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
dsb();
isb();
即是:Invalidate unified TLB all entries
根据Kernel的doc,调用的时机是:
This is usually invoked when the kernel page tables are changed, since such translations are "global" in nature.
在kernel运行的时候,一般在flush_context的情况下才会调用。
回复 3# omycle
查了手册,是让tlb失效,不过不知道失效后tlb的行为又是什么,mmu和cache, tlb是一整套机制,我还是慢慢了解吧,多谢了。 回复 4# leslielg
恩,建议 稍微了解一些ARM 系统结构方面的内容 又遇到个该函数的问题,在arm beagleboard xm rev C板子上,kernel启动后停在这个函数里的这行上:if (tlb_flag(TLB_V4_U_FULL | TLB_V6_U_FULL))
--> asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");我使能了early printk,从打印的内容看到进了该if分支,然后系统挂在这行。
为什么flush tlb会挂?从代码看zero确实赋值为0,对p15的操作其他还有要求? 内核版本2.6.35 另外一个信息,这个函数之前是调用的MACHINE_START定义的map_io函数,如果不调用该函数,flush tlb就会挂在这一句上;如果在map_io里创建omap3的L4 peripheral的对应页表项,映射到vmalloc_end之后,我随便选了两个虚拟地址作映射都可以,flush tlb就不会挂。
但是不明白这个map跟flush tlb能有关系?
页:
[1]