免费注册 查看新帖 |

Chinaunix

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

[内存管理] 进程代码段缺页,填完页表后是否需要刷一下icache? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-14 11:14 |只看该作者 |倒序浏览
本帖最后由 chenyu105 于 2013-11-14 16:23 编辑

mips64 , kernel 2.6.32

下面讨论的都是固定某个CPU上的情况,如果有以下流程:

1)进程A、B所在的可执行文件位于nand flash,A和B的代码段虚拟地址空间一样;
2)A运行一段时间,A的代码段在A文件page cache,记作P, 此时icache有一条A代码段的记录,记作cache line (va,pa) ;
3)某个时候系统内存不足,P被系统回收到伙伴系统;
4)进程B得到运行,B发生代码段缺页,分配到页面P,将P添加到B文件page cache,并把nand flash上的B代码段内容,通过DMA写到P(即不经过cache);
5)B进程将P的地址设置进页表后,返回继续执行引发缺页的指令,由于icache是VIPT,所以会命中之前的记录cache line(va,pa),进而运行到A的代码,导致问题。


我的疑问是,B在缺页设置完页表后,是否应该刷一下icache来避免这种情况?
或者说,从A进程切换到B进程,是否会刷icache?

大家看看我是不是漏了什么?


论坛徽章:
0
2 [报告]
发表于 2013-11-15 15:32 |只看该作者
PS:对于大多数的icache来说,都是VIPT的,所以不会在第4步进程切换时刷icache。

终于找到一处刷icache的地方:
当__do_fault执行完vma->vm_ops->fault(vma, &vmf); 即filemap_fault,将代码段数据从nand flash读到
page cache后,在设置页表前有一句flush_icache_page(vma, page);
  1. /* Only go through if we didn't race with anybody else... */
  2.         if (likely(pte_same(*page_table, orig_pte))) {
  3.                 flush_icache_page(vma, page);
  4.                 entry = mk_pte(page, vma->vm_page_prot);
  5.                 if (flags & FAULT_FLAG_WRITE)
  6.                         entry = maybe_mkwrite(pte_mkdirty(entry), vma);
  7.                 if (anon) {
  8.                         inc_mm_counter(mm, anon_rss);
  9.                         page_add_new_anon_rmap(page, vma, address);
  10.                 } else {
  11.                         inc_mm_counter(mm, file_rss);
  12.                         page_add_file_rmap(page);
  13.                         if (flags & FAULT_FLAG_WRITE) {
  14.                                 dirty_page = page;
  15.                                 get_page(dirty_page);
  16.                         }
  17.                 }
  18.                 set_pte_at(mm, address, page_table, entry);

  19.                 /* no need to invalidate: a not-present page won't be cached */
  20.                 update_mmu_cache(vma, address, entry);
复制代码
但是在我们的mips架构里,flush_icache_page回调是空操作。

但是内核的cachetlb.txt文档又说,这个函数不需要执行什么:
  1. void flush_icache_page(struct vm_area_struct *vma, struct page *page) All the functionality of flush_icache_page can be implemented in flush_dcache_page and update_mmu_cache. In 2.7 the hope is to
  2.         remove this interface completely.
复制代码
难道还有其他地方会在缺页后刷icache么

论坛徽章:
0
3 [报告]
发表于 2013-11-16 09:17 |只看该作者
可能找到地方了,内核如果涉及到修改页表,标准的做法是:

           flush_cache_page(vma, addr, pfn);
          set_pte(pte_pointer, new_pte_val);
           flush_tlb_page(vma, addr);


经代码走查,如果出现上述情况,主楼的第3步和第5步会修改页表,然而第5步的刷新icache用的函数是flush_icache_page,这个函数
内核已经不建议使用,在我们的环境里mips64 xlp,这个回调设置为空操作;

在第3步,将页面P回收后,设置完毕各相关进程的页表项后,会调用flush_cache_page,这个函数内核是要求完全实现的。
具体调用路径是:
do_try_to_free_pages->
shrink_zone->
shrink_list->
shrink_inactive_list->
shrink_page_list->
try_to_unmap->
try_to_unmap_file->
try_to_unmap_one->
flush_cache_page

然而我们的mips64 xlp里的 flush_cache_page仍然是空操作,所以这里会导致问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP