免费注册 查看新帖 |

Chinaunix

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

[内存管理] 分页管理之全局目录表、页表项的初始化的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-02-20 00:00 |只看该作者 |倒序浏览
本帖最后由 wo3002807 于 2016-02-20 00:08 编辑

通过阅读/arch/x86/kernel/head_32.s里的初始化分页代码:代码如下,

  1. /*
  2. * Initialize page tables.  This creates a PDE and a set of page
  3. * tables, which are located immediately beyond __brk_base.  The variable
  4. * _brk_end is set up to point to the first "safe" location.
  5. * Mappings are created both at virtual address 0 (identity mapping)
  6. * and PAGE_OFFSET for up to _end.
  7. */
  8. #ifdef CONFIG_X86_PAE
  9. .......
  10. #else        /* Not PAE */

  11. page_pde_offset = (__PAGE_OFFSET >> 20);

  12.         movl $pa(__brk_base), %edi
  13.         movl $pa(initial_page_table), %edx
  14.         movl $PTE_IDENT_ATTR, %eax
  15. 10:
  16.         leal PDE_IDENT_ATTR(%edi),%ecx                /* Create PDE entry */
  17.         movl %ecx,(%edx)                        /* Store identity PDE entry */
  18.         movl %ecx,page_pde_offset(%edx)                /* Store kernel PDE entry */
  19.         addl $4,%edx
  20.         movl $1024, %ecx
  21. 11:
  22.         stosl
  23.         addl $0x1000,%eax
  24.         loop 11b
  25.         /*
  26.          * End condition: we must map up to the end + MAPPING_BEYOND_END.
  27.          */
  28.         movl $pa(_end) + MAPPING_BEYOND_END + PTE_IDENT_ATTR, %ebp
  29.         cmpl %ebp,%eax
  30.         jb 10b
  31.         addl $__PAGE_OFFSET, %edi
  32.         movl %edi, pa(_brk_end)
  33.         shrl $12, %eax
  34.         movl %eax, pa(max_pfn_mapped)

  35.         /* Do early initialization of the fixmap area */
  36.         movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,%eax
  37.         movl %eax,pa(initial_page_table+0xffc)
  38. #endif
复制代码
/*
* Initialize page tables.  This creates a PDE and a set of page
* tables, which are located immediately beyond __brk_base.  The variable
* _brk_end is set up to point to the first "safe" location.
* Mappings are created both at virtual address 0 (identity mapping)
* and PAGE_OFFSET for up to _end.
*/
从上述的代码,我绘制了如下图:

__brk_base开始到__brk_base+4K,该区间存储全局目录项,里面的值为:0x1003,0x2003,..,0x4003(每一项是4byte,共1024项,故占4K)
接下来是页表项:0x401003,0x402003,..,0x800003
假设一个线性地址是0x0c040009,转换成二进制:11,0000000100,000000001001.从中得到pgd=0x3,pte=0x4,offset=0x9
那么根据线性地址转换成物理的规则:获取全局目录项的索引=0x3-0x001,然而无法获取pte的偏移量,即是说0x4-0x401,则为负,这样不合理。
那么我错在哪里?麻烦了!!!!!

无标题1.png (18.29 KB, 下载次数: 34)

无标题1.png

论坛徽章:
0
2 [报告]
发表于 2016-02-20 00:04 |只看该作者
理想情况下:
全局目录表:0x1003,0x2003,...,0x400003.
页表项:0x1003,0x2003,.....,0x400003。这样才合理。
如果是这样的话,上面的代码中的%eax的值是一值增大的,而不会回流。所以,不可能页表项的内容跟全局目录表的内容一样。

论坛徽章:
0
3 [报告]
发表于 2016-02-20 18:44 |只看该作者
之前理解错误了,我知道错在哪里了。。。
上面的图是正确的,上面的图只是写了一部分的数据。初始化的PDT和PTE,里面共有一个PDE,1024个PTE,每个PTE拥有1024个。即是说,初始化页表、页目录共占4M+4K大小的内容。
那么PDT里面的值:0x1003,0x2003,0x3003,....,0x400003。
那么第一个PTE的值:0x401003,0x402003,0x403003,....,0x800003。
第二个PTE:0x801003,0x802003,0x803003,....,0xc00003
根据上面的线性地址:0x0c040009,转换成二进制:11,0000000100,000000001001.从中得到pgd=0x3,pte=0x4,offset=0x9
从得到物理地址:3*1024*1024+4*1024+9 = 3162121 = 0x0304009
请问这个是否正确?

论坛徽章:
0
4 [报告]
发表于 2016-02-20 18:44 |只看该作者
之前理解错误了,我知道错在哪里了。。。
上面的图是正确的,上面的图只是写了一部分的数据。初始化的PDT和PTE,里面共有一个PDE,1024个PTE,每个PTE拥有1024个。即是说,初始化页表、页目录共占4M+4K大小的内容。
那么PDT里面的值:0x1003,0x2003,0x3003,....,0x400003。
那么第一个PTE的值:0x401003,0x402003,0x403003,....,0x800003。
第二个PTE:0x801003,0x802003,0x803003,....,0xc00003
根据上面的线性地址:0x0c040009,转换成二进制:11,0000000100,000000001001.从中得到pgd=0x3,pte=0x4,offset=0x9
从得到物理地址:3*1024*1024+4*1024+9 = 3162121 = 0x0304009
请问这个是否正确?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP