免费注册 查看新帖 |

Chinaunix

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

[内存管理] ARM架构中PMD,PTE与page之间的关系求解! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-30 16:04 |只看该作者 |倒序浏览
最近看ARM架构的内存页表的管理代码,有些疑问搞不清楚。

ARMv7采用的是2level的管理模式,所以PMD等同于PGD。当一个虚拟地址addr在kernel中映射时,先根据addr算出PGD,然后根据PGD得到PTE,在根据PTE如何能得到该虚拟地址addr的物理地址?

有如下一下疑问:
1. 根据pmd算pte时,一般使用的是kernel中的pte_offset_map函数
  1. static inline pte_t *pmd_page_vaddr(pmd_t pmd)
  2. {
  3.         return __va(pmd_val(pmd) & PHYS_MASK & (s32)PAGE_MASK);
  4. }

  5. #define __pte_map(pmd)                pmd_page_vaddr(*(pmd))

  6. #define pte_offset_map(pmd,addr)        (__pte_map(pmd) + pte_index(addr))
复制代码
根据代码看来,PMD指针指向的内存中保存的值低12位是没有使用的,因为分配pte时,同时分配的linux pt and h/w pt,刚好是1个page,理论上这个PMD指针指向的值应为是4k对齐才对,为何在去PTE时,需要& PAGE_MASK?

2. pte指针指向的值,低十二位用来表示该映射的page的属性值,高12位就为pfn,但是最终是如何映射到虚拟地址addr的物理地址的嗫?看网友有句话写的,感觉有点问题:PTE表中的高20bit的值 + 线性地址的低 12bit的值,就是具体的物理地址。是这么简单的映射吗?

论坛徽章:
0
2 [报告]
发表于 2014-10-31 17:01 |只看该作者
又研究了一下kernel,结合网友的分析,自己解释如下:
1. 确实地址是对齐的,但是kernel在实现时,为了节省mem,在低12bit中保存了该页目录的属性,所以在取值赋给PTE时需要clear低12bit;
2. 就是这样简单的映射,但是写了个程序,感觉非kernel线性地址的虚拟地址转换好像没有问题,但是相反线性地址范围不对;奇怪
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP