免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wth0722
打印 上一主题 下一主题

[内存管理] 更改 page table entry屬性,卻未生效 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2014-06-09 22:42 |显示全部楼层
本帖最后由 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。
这也符合这两个接口的设计目的。

论坛徽章:
0
2 [报告]
发表于 2014-06-09 22:43 |显示全部楼层
本帖最后由 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。
这也符合这两个接口的设计目的。

论坛徽章:
0
3 [报告]
发表于 2014-06-10 11:47 |显示全部楼层
回复 13# wth0722


    你好。我看了下ioremap的实现,确实是没关联vma的。

    还有,你说的hw pte是怎么回事? 页表项不就是在内存中的数据结构吗?还有硬件页表项这一说?不知是什么架构。能不能解释下?谢谢!

    最后,关于vivt, 多谢指正 :)

论坛徽章:
0
4 [报告]
发表于 2014-06-10 12:06 |显示全部楼层
回复 17# wth0722


    多谢。明白了。 这也是为了弥补linux通用多级页表和硬件支持页表之间的差异。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP