免费注册 查看新帖 |

Chinaunix

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

创建内核最终页表的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-05 15:25 |只看该作者 |倒序浏览
看了下新版本的内核,3.0.8,创建内核最终页表时,会用find_early_table_space()估算一下页目录页表这些需要多少空间,但是它这种估算方法好像是不够的,请高手发表下意见:

不够的原因是映射时是为考虑了mtrr的影响, 最前面的是不按gbpages 或是大页面映射的。

比如说X86_32, PAE关闭,PSE打开,物理地址0~4MB并不是按4MB的大页面映射的,而是一级级的老老实实映射的,见init_memory_mapping()函数。便是计算页目录页表所占的空间时,却是按大页面映射计算的,明显应该是不足的。 唯一能弥补的可能就是PAGE_SIZE对齐时所多出来的点空间,但是也不一定够啊,是算法的问题。。



老版本的内核如何? 还是我哪里理解出问题了?
static void __init find_early_table_space(unsigned long end, int use_pse,
                                          int use_gbpages)
{
        unsigned long puds, pmds, ptes, tables, start = 0, good_end = end;
        phys_addr_t base;

        puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
        tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);

        if (use_gbpages) {
                unsigned long extra;

                extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);
                pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;                       ////不止这个extra需要,0~PUD_SIZE也需要啊,因为0~2/4MB是老老实实一级级映射的。2/4MB~PUD_SIZE必然是大PSE映射,不是GB pages映射的。
        } else
                pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;

        tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);

        if (use_pse) {
                unsigned long extra;

                extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT);
#ifdef CONFIG_X86_32
                extra += PMD_SIZE;
#endif
                ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
        } else
                ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;

        tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE);

#ifdef CONFIG_X86_32
        /* for fixmap */
        tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE);
#endif
        good_end = max_pfn_mapped << PAGE_SHIFT;               
        base = memblock_find_in_range(start, good_end, tables, PAGE_SIZE);
        if (base == MEMBLOCK_ERROR)
                panic("Cannot find space for the kernel page tables");

        pgt_buf_start = base >> PAGE_SHIFT;
        pgt_buf_end = pgt_buf_start;
        pgt_buf_top = pgt_buf_start + (tables >> PAGE_SHIFT);

        printk(KERN_DEBUG "kernel direct mapping tables up to %lx @ %lx-%lx\n",
                end, pgt_buf_start << PAGE_SHIFT, pgt_buf_top << PAGE_SHIFT);
}
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-06 12:47 |只看该作者
顶一顶。。

论坛徽章:
0
3 [报告]
发表于 2011-12-07 14:07 |只看该作者
看2.6.2x的达人们,瞄一眼代码啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP