本文共 2717 字,大约阅读时间需要 9 分钟。
前提为 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 以上的物理内存
如果 内核空间大小是 1G的话,那么 高端内存大小 + 低端内存大小 = 1G不是网上传言的 768M 或 760M 或 896M而是可以调节的 , 可通过 vmalloc_min 调节(实际上必须通过改变VMALLOC_END来改变vmalloc_min) , vmalloc_min 的值 对应了最大可能的低端内存地址低端内存和高端内存的界线地址 由 min(vmalloc_min,最大物理内存对应的虚拟内存地址) 决定另外,高端内存与低端内存间(arm32) 中间有VMALLOC_OFFSET(8MB)空闲HIGHMEM---------------------------------- 768M+8M=776MVMALLOC_OFFSET(8MB)---------------------------------- 该点的值为 min(vmalloc_min,最大物理内存对应的虚拟内存地址),如果为0xf000 0000 ,则为 768MLOWMEMarch/arm/include/asm/pgtable.h41 #define VMALLOC_OFFSET (8*1024*1024)...43 #define VMALLOC_END 0xff800000ULarch/arm/mm/mmu.c1126 static void * __initdata vmalloc_min = 1127 (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);// (240 << 20) = 0x0f00 0000// vmalloc_min = 0xf000 0000arch/arm/mm/mmu.cadjust_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 00005000 0000 - c0000 00006000 0000 - d0000 00007000 0000 - e0000 00008000 0000 - f0000 00009000 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
转载地址:http://tjigi.baihongyu.com/