- 论坛徽章:
- 0
|
本帖最后由 l4rmbr 于 2014-06-09 22:54 编辑
[非常抱歉,网络原因发了相同内容两次,麻烦版主删除这个帖子吧。谢谢!]
看了楼主的表述,楼主你应该是在更新页表项后忘了冲刷tlb缓存。正确用法应该像这样:
flush_cache_page(vma, addr, pfn); <--- 冲刷数据/指令缓存
set_pte(pte_pointer, new_pte_val); <--- 更新页表项
flush_tlb_page(vma, addr); <--- 冲刷tlb缓存
此外,多说两点.
1.
set_pte_at() 与 set_pte()功能基本相同,不过前者用来实现钩子,用以
冲刷相应的数据/指令缓存。
在大多数体系架构下,这两个函数一样。不过arm是个例外。因为它是vivt
架构(virtual indexed and virtual tagged), 所以更新了虚拟地址的页表项,
也要相应地刷新缓存。 x86就不用,因为它是pipi(physical indexed and physical tagged)
缓存一致性由cpu内在地保证,不需要程序员干预。
2.
我大概翻了下代码,发现set_pte一般用在第一次创建一个表项时,此时无所谓“更新”一说。
如果是要更新一个旧页表项,则用的是set_pte_at。
这也符合这两个接口的设计目的。 |
|