- 论坛徽章:
- 3
|
64位的地址太长了,算起来真头疼
查了下3.12.5的内核代码, 在x86_64下,最大的物理内存是64T, 是hardcode的限制, 不是逻辑炸弹(以前看过的难道记错了),
1. 在e820_end_of_ram_pfn中已经限制了最大物理内存为MAX_ARCH_PFN,也就是64T, max_pfn的最大值只能为64T
2. 在init_mem_mapping会线性映射所有的物理内存,因为最大的物理内存是64T,所以此时内核地址空间最大也是64T, 因此在PAGE_OFFSET与__START_KERNEL_map之间留下了一个将近64T的洞
3. x86_64下HIGHMEM是没有定义的,在arch/x86/Kconfig
config HIGHMEM
def_bool y
depends on X86_32 && (HIGHMEM64G || HIGHMEM4G)
4. 因为CONFIG_HIGHMEM没有定义,在zone_sizes_init就不会定义高端内存区,只会定义DMA,DMA32和低端内存。
5. 内核空间和用户空间的分界线是STACK_TOP, 是0xffff880000000000, 低于这个地址都是用户内存。
6. 用户空间默认从高端内存分配所需内存,虽然x86_64没有高端内存也没关系,内核设计了适当的回退机制, 用户空间一样可以分配在低端内存分配内存, 只不过需要二次映射,浪费了一点点效率。
7. 在pgtable_64_types.h定义了内核空间的一些子分区细节 |
|