OK6410A 开发板 (八) 52 linux-5.11 OK6410A linux内存管理相关配置

  • 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版权协议,转载请附上原文出处链接和本声明。