免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3961 | 回复: 7
打印 上一主题 下一主题

[内存管理] local_flush_tlb_all 函数作用?(又遇到新的问题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-19 20:08 |只看该作者 |倒序浏览
本帖最后由 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();
        }
}

谁能帮忙解读一下么?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2012-11-19 21:44 |只看该作者
从函数名字看就大概猜出干什么了
arm管理cache也是通过协处理器的,看看spec把

论坛徽章:
0
3 [报告]
发表于 2012-11-20 10:04 |只看该作者
对v7,展开的操作是:
SMP:
  1. dsb();
  2. asm("mcr p15, 0, %0, c8, c3, 0" : : "r" (zero) : "cc");
  3. dsb();
  4. isb();
复制代码
即是:“Invalidate entire unified TLB Inner Shareable ”

UP:
  1. dsb();
  2. asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
  3. dsb();
  4. 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的情况下才会调用。

论坛徽章:
0
4 [报告]
发表于 2012-11-20 12:51 |只看该作者
回复 3# omycle


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

论坛徽章:
0
5 [报告]
发表于 2012-11-20 13:38 |只看该作者
回复 4# leslielg


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

论坛徽章:
0
6 [报告]
发表于 2014-04-29 13:19 |只看该作者
又遇到个该函数的问题,在arm beagleboard xm rev C板子上,kernel启动后停在这个函数里的这行上:
  1. if (tlb_flag(TLB_V4_U_FULL | TLB_V6_U_FULL))
  2. -->                asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
复制代码
我使能了early printk,从打印的内容看到进了该if分支,然后系统挂在这行。
为什么flush tlb会挂?从代码看zero确实赋值为0,对p15的操作其他还有要求?

论坛徽章:
0
7 [报告]
发表于 2014-04-29 13:53 |只看该作者
内核版本2.6.35

论坛徽章:
0
8 [报告]
发表于 2014-04-30 13:37 |只看该作者
另外一个信息,这个函数之前是调用的MACHINE_START定义的map_io函数,如果不调用该函数,flush tlb就会挂在这一句上;如果在map_io里创建omap3的L4 peripheral的对应页表项,映射到vmalloc_end之后,我随便选了两个虚拟地址作映射都可以,flush tlb就不会挂。
但是不明白这个map跟flush tlb能有关系?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP