免费注册 查看新帖 |

Chinaunix

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

请教arm中pmd_page_vaddr函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-27 15:21 |只看该作者 |倒序浏览
这个函数定义在arch\arm\include\asm\pgtable.h
通常在pte_offset_map中被调用:

  1. #define pte_offset_map(dir,addr)        (pmd_page_vaddr(*(dir)) + __pte_index(addr))
复制代码

pmd_page_vaddr()本身很小,贴在这里了:

  1. static inline pte_t *pmd_page_vaddr(pmd_t pmd)
  2. {
  3.         unsigned long ptr;

  4.         ptr = pmd_val(pmd) & ~(PTRS_PER_PTE * sizeof(void *) - 1);
  5.         ptr += PTRS_PER_PTE * sizeof(void *);

  6.         return __va(ptr);
  7. }
复制代码

我看了下,内核中如果需要得到最后一级页表项pte时需要会最终调用到pte_offset_map(),我的理解,在arm中硬件上只用到了一级页表,内核再次基础上又加了一级二级页表。
pmd_page_vaddr()函数似乎就是返回二级页表的地址,但这个页表的位置似乎很奇怪,pmd_val(pmd)得到的是真正的物理地址,按照代码,二级页表放在了这个物理地址后2k(512*4 byte)的地方。
我的理解不一定正确,大家看看这样理解正确不?

论坛徽章:
0
2 [报告]
发表于 2009-09-28 10:29 |只看该作者
LZ比我早5天.
不知道LZ是哪个版本,我在2.6.13.2中没找到那个文件...
pmd_val(pmd)得到的是真正的物理地址,,,这句话我还真不信...

论坛徽章:
0
3 [报告]
发表于 2009-09-28 11:33 |只看该作者

回复 #2 epegasus 的帖子

我的版本比较新,2.6.29的。关于“pmd_val(pmd)得到的是真正的物理地址”,我的理解也不一定正确。
我的理解是, 在arm中一般情况下硬件只用了一级页表,因为在paging_init()中对大部分内存只初始化了一级页表,具体过程在create_mapping()中。
如果只用了一级页表,那么pmd就是一个段描述符,高位表示了段基地址,也就是真正的物理地址。
我一直很奇怪的是,似乎Linux还为arm建立了二级页表,以兼容x86等平台,但我一直找不到这部分的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP