博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 52 linux-5.11 OK6410A linux内存管理相关配置
阅读量:4285 次
发布时间:2019-05-27

本文共 2717 字,大约阅读时间需要 9 分钟。

  • 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=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/

你可能感兴趣的文章
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>
Linux内核分析-1/反汇编(堆栈)
查看>>
Linux内核分析-2/时间片轮转多道程序
查看>>
Linux内核分析-4/5/系统调用
查看>>
c/c++常见关键字
查看>>
C++内存地址分配和内存区划分简介
查看>>
C++数值交换
查看>>
指针数组、数组指针、函数指针、指针函数
查看>>
float,double在内存中的存储方式
查看>>
int main(int argc,char* argv[])详解
查看>>
C++打印地址
查看>>
ARM处理器比较:A8/A9
查看>>
ARM处理器工作模式
查看>>
ARM处理器寄存器
查看>>
汇编语言学习
查看>>