免费注册 查看新帖 |

Chinaunix

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

[内存管理] 当RAM大于4096MB时的内核页表初始化的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-12 19:09 |只看该作者 |倒序浏览
  1. pgd_idx = pgd_index(PAGE_OFFSET); /* 3 */
  2. for (i=0; i<pgd_idx; i++)
  3. set_pgd(swapper_pg_dir + i, _ _pgd(_ _pa(empty_zero_page) + 0x001));
  4. /* 0x001 == Present */
  5. pgd = swapper_pg_dir + pgd_idx;
  6. phys_addr = 0x00000000;
  7. for (; i<PTRS_PER_PGD; ++i, ++pgd) {
  8. pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
  9. set_pgd(pgd, _ _pgd(_ _pa(pmd) | 0x001)); /* 0x001 == Present */
  10. if (phys_addr < max_low_pfn * PAGE_SIZE)
  11. for (j=0; j < PTRS_PER_PMD /* 512 */
  12. && phys_addr < max_low_pfn*PAGE_SIZE; ++j) {
  13. set_pmd(pmd, _ _pmd(phys_addr | pgprot_val(_ _pgprot(0x1e3))));
  14. /* 0x1e3 == Present, Accessed, Dirty, Read/Write,
  15. Page Size, Global */
  16. phys_addr += PTRS_PER_PTE * PAGE_SIZE; /* 0x200000 */
  17. }
  18. }
  19. swapper_pg_dir[0] = swapper_pg_dir[pgd_idx];
复制代码
以上代码是《深入理解linux内核》第二章中当RAM大于4096MB时的内核页表初始化的代码。
其中代码pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);可知pmd是一个页地址。
代码set_pmd(pmd, _ _pmd(phys_addr | pgprot_val(_ _pgprot(0x1e3))));应该是设置一个pmd项,那么其中第一个参

数pmd应该是第几项,但这里上面的代码中却表示pmd是一个地址。而且看下面的代码pmd并无变化,那么所有的设

置在重复设置同一项,所以这里的pmd是不是应该改为变量j呢?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-08-13 08:09 |只看该作者
回复 1# stuman

这里pmd表示页中间目录,本身就是一个变量。你把一个含义明确的变量名修改为j有什么好处吗?
   

论坛徽章:
0
3 [报告]
发表于 2013-08-13 19:12 |只看该作者
本帖最后由 stuman 于 2013-08-13 19:51 编辑

设置为j的确不对,但是设置了一个pmd之后,应该设置下一个,也就是pmd应该加1,但是这里pmd根本毫无变化呀

http://blog.csdn.net/lukuen/article/details/6953753
这里有一段内核页表设置的代码,其中pmd变量是自增的

论坛徽章:
0
4 [报告]
发表于 2013-08-14 03:42 |只看该作者
你觉得alloc_bootmem_low_pages每次都会分配到同一个地址吗?

论坛徽章:
0
5 [报告]
发表于 2013-08-14 19:26 |只看该作者
我的问题与alloc_bootmem_low_pages无关,这个函数在第一个大循环中被调用,我的问题在于第二层小循环中pmd没有变化

论坛徽章:
0
6 [报告]
发表于 2014-01-04 11:51 |只看该作者
stuman 发表于 2013-08-13 19:12
设置为j的确不对,但是设置了一个pmd之后,应该设置下一个,也就是pmd应该加1,但是这里pmd根本毫无变化呀
...


同意, 我觉得pmd++。不然第二个循环没法初始化 512个pmd entris. 这段代码来源于ULK中,可能作者忘加了。

论坛徽章:
1
白羊座
日期:2014-01-05 12:42:56
7 [报告]
发表于 2014-01-05 10:38 |只看该作者
内核页表中加入分析表的大小的代码段,
就可以合并内存空间,转换成物理空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP