免费注册 查看新帖 |

Chinaunix

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

[操作系统] ARM linux下的页表问题,百思不得其解。 [复制链接]

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

ARM处理器的一级页表有4096个描述符。开启MMU后,虚拟地址的高12位作为索引值(虚拟地址>>20可得到)加上存放在CP15的C2里的页表地址可得到一级页表项的地址。

而linux里arm处理器的获取页表项却是这么定义的,如下:
  1. #define PMD_SHIFT        21
  2. #define PGDIR_SHIFT        21

  3. #define pgd_index(addr)        ((addr) >> PGDIR_SHIFT)  /* 虚拟地址 >> 21 取出虚拟地址对应的页表项? */
  4. #define pgd_offset(mm, addr)    ((mm)->pgd + pgd_index(addr)) /* addr是传入的欲取得页表项的虚拟地址;mm->pgd是页表基地址 */
复制代码
linux里为什么要把虚拟地址右移21位?不应该是右移20位吗(刚才弄错了,汇编里才需要右移20再左移2位)?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2014-08-23 16:19 |只看该作者
因为linux里面是一次映射两个entry

论坛徽章:
0
3 [报告]
发表于 2014-08-23 16:34 |只看该作者
本帖最后由 求linux注释 于 2014-08-23 16:40 编辑

回复 2# arm-linux-gcc

一次映射两项我是知道的,但是在 prepare_page_table 这个函数中初始化页表的时候欲映射虚拟地址是以2M递增的,也就是说他在循环的时候已经以2个表项为单位进行递增操作了,如下:

  1. static inline void prepare_page_table(void){

  2.         unsigned long addr;
  3.         for (addr = 0; addr < MODULES_VADDR; addr += PGDIR_SIZE) //这个PGDIR_SIZE大小为2M,即虚拟地址以2M递增。
  4.                 pmd_clear(pmd_off_k(addr));

  5.         for ( ; addr < PAGE_OFFSET; addr += PGDIR_SIZE)
  6.                 pmd_clear(pmd_off_k(addr));

  7.         for (addr = __phys_to_virt(bank_phys_end(&meminfo.bank[0])); addr < VMALLOC_END; addr += PGDIR_SIZE)
  8.                 pmd_clear(pmd_off_k(addr));
  9.        
  10. }
复制代码
既然在循环里已经以2M为单位进行递增了,那么我们取出虚拟地址>>20+页表基地址对应的表项地址后,直接初始化他和他后面的那个表项就可以了(pmd_clear中实现),而如果我们把虚拟地址右移21位,那原来定位到第2000个页表项的虚拟地址不就指向第1000个页表项了吗?这不就出错了吗?



论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-08-24 13:32 |只看该作者
本帖最后由 arm-linux-gcc 于 2014-08-24 13:32 编辑

typedef pmdval_t pgd_t[2];

#define pmd_clear(pmdp)                        \
        do {                                \
                pmdp[0] = __pmd(0);        \
                pmdp[1] = __pmd(0);        \
                clean_pmd_entry(pmdp);        \
        } while (0)











您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP