- arm32 要不要配置 CONFIG_HIGHMEM
前提为 vmalloc_min 为 0xf000 0000 , 且 内核空间大小:用户空间大小 = 1:3
如果内存 <= 768MB
想全部内存做 线性映射
不配置CONFIG_HIGHMEM
//配置了也无所谓,如果是 vmalloc(基于vmap)会做映射,这样就是双重映射(同一个物理页,线性映射一次,vmap映射一次)
想一部分内存 做 线性映射,一部分做高端内存映射
配置 CONFIG_HIGHMEM
并将 vmalloc_min 设置为比0xf000 0000更低的值(具体取决于一部分与另一部分的比例)
// 举个例子,内存有768M,要 512M 用于 低端内存,256M 用于高端内存,需要改 vmalloc_min 为 0xe000 0000
如果 内存 > 768MB & 内存 <= 1GB
想访问 768M 以上的物理内存,配置 CONFIG_HIGHMEM 或 将 vmalloc_min 设置为比0xf000 0000更高的值(具体取决于总物理内存的大小)
不想访问 768M 以上的物理内存,不配置 CONFIG_HIGHMEM
如果 内存 > 1MB & 内存 <= 4GB
想访问 768M 以上的物理内存,配置 CONFIG_HIGHMEM
不想访问 768M 以上的物理内存,不配置 CONFIG_HIGHMEM
如果 内存 > 4GB
想访问 768M 以上的物理内存,配置 CONFIG_HIGHMEM // 不管怎么样,都无法访问 4G 以上的物理内存
不想访问 768M 以上的物理内存,不配置 CONFIG_HIGHMEM // 不管怎么样,都无法访问 4G 以上的物理内存
- arm32 怎么调整 低端内存 和高端内存大小
如果 内核空间大小是 1G的话,那么 高端内存大小 + 低端内存大小 = 1G
不是网上传言的 768M 或 760M 或 896M
而是可以调节的 , 可通过 vmalloc_min 调节(实际上必须通过改变VMALLOC_END来改变vmalloc_min) , vmalloc_min 的值 对应了最大可能的低端内存地址
低端内存和高端内存的界线地址 由 min(vmalloc_min,最大物理内存对应的虚拟内存地址) 决定
另外,高端内存与低端内存间(arm32) 中间有VMALLOC_OFFSET(8MB)空闲
HIGHMEM
---------------------------------- 768M+8M=776M
VMALLOC_OFFSET(8MB)
---------------------------------- 该点的值为 min(vmalloc_min,最大物理内存对应的虚拟内存地址),如果为0xf000 0000 ,则为 768M
LOWMEM
arch/arm/include/asm/pgtable.h
41 #define VMALLOC_OFFSET (8*1024*1024)
...
43 #define VMALLOC_END 0xff800000UL
arch/arm/mm/mmu.c
1126 static void * __initdata vmalloc_min =
1127 (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);
// (240 << 20) = 0x0f00 0000
// vmalloc_min = 0xf000 0000
arch/arm/mm/mmu.c
adjust_lowmem_bounds
vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET;
//= f000 0000 - c000 0000 + 5000 0000 = 8000 0000
// 也就是说物理地址 从5000 0000 开始(硬件决定的)
// 那么 理论上最大的物理地址 可达 8000 0000
lowmem_limit = min_t(u64, vmalloc_limit, block_end);
// 计算 block_end 为 6000 0000
// lowmem_limit = 6000 0000
arm_lowmem_limit = lowmem_limit;
// arm_lowmem_limit = 6000 0000
high_memory = __va(arm_lowmem_limit - 1) + 1;
// high_memory = d000 0000
5000 0000 - c0000 0000
6000 0000 - d0000 0000
7000 0000 - e0000 0000
8000 0000 - f0000 0000
9000 0000 - 00000 0000
这里实际内存 为 5000 0000 - 6000 0000 ,则 低端内存的界限为 d0000 0000,d0000 0000以上为 高端内存.(但是d0000 0000上不对应物理内存)
如果实际内存 为 5000 0000 - 8000 0000 ,则 低端内存的界限为 f0000 0000,f0000 0000以上为 高端内存(但是f0000 0000上不对应物理内存)
如果实际内存 为 5000 0000 - 9000 0000 ,则 低端内存的界限为 f0000 0000,f0000 0000以上为 高端内存(f0000 0000上对应256MB(8000 0000-9000 0000)物理内存)
如果实际内存 为 5000 0000 - A000 0000 ,则 低端内存的界限为 f0000 0000,f0000 0000以上为 高端内存(f0000 0000上对应512MB(8000 0000-A000 0000)物理内存)
...
- 内核空间与用户空间的比例
内核空间大小:用户空间大小 = 默认 1:3
设置 1:3 , CONFIG_VMSPLIT_3G
设置 1:3 ,且内核在0-1G CONFIG_VMSPLIT_3G_OPT
设置 2:2 CONFIG_VMSPLIT_2G
设置 3:1 CONFIG_VMSPLIT_1G
版权声明:本文为u011011827原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。