leslielg 发表于 2012-11-19 20:08

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();
        }
}

谁能帮忙解读一下么?

amarant 发表于 2012-11-19 21:44

从函数名字看就大概猜出干什么了
arm管理cache也是通过协处理器的,看看spec把

omycle 发表于 2012-11-20 10:04

对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的情况下才会调用。

leslielg 发表于 2012-11-20 12:51

回复 3# omycle


    查了手册,是让tlb失效,不过不知道失效后tlb的行为又是什么,mmu和cache, tlb是一整套机制,我还是慢慢了解吧,多谢了。

omycle 发表于 2012-11-20 13:38

回复 4# leslielg


    恩,建议 稍微了解一些ARM 系统结构方面的内容

leslielg 发表于 2014-04-29 13:19

又遇到个该函数的问题,在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的操作其他还有要求?

leslielg 发表于 2014-04-29 13:53

内核版本2.6.35

leslielg 发表于 2014-04-30 13:37

另外一个信息,这个函数之前是调用的MACHINE_START定义的map_io函数,如果不调用该函数,flush tlb就会挂在这一句上;如果在map_io里创建omap3的L4 peripheral的对应页表项,映射到vmalloc_end之后,我随便选了两个虚拟地址作映射都可以,flush tlb就不会挂。
但是不明白这个map跟flush tlb能有关系?
页: [1]
查看完整版本: local_flush_tlb_all 函数作用?(又遇到新的问题)