- 论坛徽章:
- 0
|
为什么要映射到 _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不就就足矣了吗?
|
|