免费注册 查看新帖 |

Chinaunix

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

[内存管理] 内核初始化映射时为什么要多映射”MAPPING_BEYOND_END“ ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-22 01:11 |只看该作者 |倒序浏览

为什么要映射到  _end + MAPPING_BEYOND_END 呢?映射到 _end不就就足矣了吗?

linux-3.6.x/arch/x86/kernel/head_32.S:

...
    /*
     * End condition: we must map up to the end + MAPPING_BEYOND_END.
     */
    movl $pa(_end) + MAPPING_BEYOND_END + PTE_IDENT_ATTR, %ebp
    cmpl %ebp,%eax
    jb 10b
...

根据 linux-3.6.x/arch/x86/kernel/vmlinux.lds.S:

SECTIONS
{
...
    . = ALIGN(PAGE_SIZE);
    .brk : AT(ADDR(.brk) - LOAD_OFFSET) {
        __brk_base = .;
        . += 64 * 1024;     /* 64k alignment slop space */
        *(.brk_reservation) /* areas brk users have reserved */
        __brk_limit = .;
    }

    _end = .;
...
}


其实,在 __brk_base之后,_end之前,也就是 brk 段中,已经有足够的空间保存 page tables 了,因为根据 linux-3.6.x/arch/x86/kernel/head_32.S 中的定义:

MAPPING_BEYOND_END = PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT

KERNEL_PAGES = LOWMEM_PAGES

INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE
RESERVE_BRK(pagetables, INIT_MAP_SIZE)

显然:

1 INIT_MAP_SIZE == MAPPING_BEYOND_END;
2 RESERVE_BRK(pagetables, INIT_MAP_SIZE) 在brk段中,告诉链接器分配了1M的空间,所以足够容纳映射内核的page tables。

所以,为什么还要映射到  _end + MAPPING_BEYOND_END 呢?映射到 _end不就就足矣了吗?





论坛徽章:
0
2 [报告]
发表于 2012-12-25 10:28 |只看该作者

UP! 希望有高手来回答啊。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-03-02 20:34 |只看该作者
up

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2014-03-03 14:34 |只看该作者
同问~~~

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2014-03-06 22:14 |只看该作者
_end这部份不在MAPPING_BEYOND_END范围内么?

论坛徽章:
0
6 [报告]
发表于 2014-12-13 18:18 |只看该作者
    . = ALIGN(PAGE_SIZE);
    .brk : AT(ADDR(.brk) - LOAD_OFFSET) {
        __brk_base = .;
        . += 64 * 1024;     /* 64k alignment slop space */
        *(.brk_reservation) /* areas brk users have reserved */
        __brk_limit = .;

brk中存放页表,但是一共64k大小,最大只支持64m空间。

但是LOW_MEM 通常为1G, 则需要1m的页表空间。所以增加了到MAPPING_BEYOND_END
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP