arm linux虚拟内存布局
来源:互联网 发布:网络共享凭据如何删除 编辑:程序博客网 时间:2024/05/16 14:41
Documentation/arm/memory.txt中的描述:
以imx6dl为例看一下具体的虚拟地址空间如何分配的,源码参考自飞思卡尔基于linux-3.0.35版本发布的imx6内核代码),先上具体的映射布局直观感受一下:
图 imx6dl虚拟内存空间布局
具体地址及定义出处:
中断向量映射区:
0xffff0000 ~ 0xffff1000 ( 4 kB)
vector的起始地址在内核默认配置arch/arm/configs/qmx6_deconfig中定义CONFIG_VECTORS_BASE 为0xffff0000,该映射区占用一个页的大小。
固定映射区:
0xfff00000 ~0xfffe0000 ( 896 kB)
fixmap起始地址FIXADDR_START,结尾地址FIXADDR_TOP均定义在arch/arm/include/asm/fixmap.h,分别固定为0xfff00000和0xfffe0000
DMA映射区:
0xf4600000 - 0xffe00000 ( 184 MB)
起始位置CONSISTENT_BASE, 结束位置CONSISTENT_END均定义在 arch/arm/include/asm/memory.h,其中
CONSISTENT_BASE = CONSISTENT_END – CONSISTENT_DMA_ZISE
CONSISTENT_END固定为0xffe00000
CONSISTENT_DMA_ZISE的定义在arch/arm/plat-mxc/include/mach/memory.h中,cpu为MX6的开发板,大小为184*SZ_1M
vmalloc映射区与DMA映射区的pages gap
该区域被I/O映射所占用,调用ioremap()会映射到这个区域中,具体定义在arch/arm/plat-mxc/include/mach/mx6.h中,外设基地址PERIPABASE_VIRT定义为0xf2000000,为I/O映射的起始地址
vmalloc映射区:
0xc0800000 - 0xf2000000 ( 792 MB)
VMALLOC_START 定义在arch/arm/ include/asm/pgtable.h中,VMALLOC_START具体定义为
#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
high_memory由物理内存的结束地址转化而来,然后换算成虚拟地址,最后得到0xc0000000,也就是直接映射区(lowmem)的末尾。
VMALLOC_OFFSET为直接映射区到vmalloc的偏移量,大小8M,此page gap用于守护内存访问越界错误。VMALLOC_END定义在arch/arm/plat-mxc/include/mach/vmalloc.h中,固定为0xf2000000
直接内存映射区:
lowmem : 0x80000000 - 0xc0000000 (1024 MB)
起始地址PAGE_OFFSET,结束地址为high_memory,PAGE_OFFSET定义在.config中为0x8000000,high_memory的值在bootmem_init时候计算出来,在vmalloc中计算VMALLOC_START时也应用了该值。
内核镜像映射地址空间在lowmem 范围内,起始地址定义在vmlinx.lds.S中,为PAGE_OFFSET+TEST_OFFSET,TEST_OFFSET定义在arch/arm/Makefile中,值为0x00008000, 所以内核镜像所在的起始地址为0x80008000,其中又包括.init/.text/.data/.bss段等,就不详细说了。而0x80000000~0x80008000的空间用于存放内核页表,。
模块映射区 :
modules : 0x7f000000 - 0x80000000 ( 16 MB)
起始地址MODULES_VADDR = PAGE_OFFSET – 16*1024*1024
结束地址MODULES_END = PAGE_OFFSET
定义在arch/arm/include/asm/memory.h中
用户进程映射区
0x00000000 ~0x7f000000
TASK_SIZE = CONFIG_PAGE_OFFSET – 0x01000000
定义在arch/arm/include/asm/memory.h,CONFIG_PAGE_OFFSET在lowmem中已经说明为0x80000000,所减去的16M空间被modules所占用,所以TASK_SIZE实际为0x7f000000,而0x00000000为起始的第一页为CPU向量页/空指针陷阱。
参考资料:
Documentation/arm/memory.txt
Understanding The Linux Virtual Memory Manager (url https://www.kernel.org/doc/gorman/pdf/understand.pdf)
- arm Linux虚拟内存布局
- arm linux虚拟内存布局
- memory:arm 分区layout以及虚拟内存布局-小结
- Linux系统虚拟内存空间一般布局示意图
- 关于arm虚拟内存说明
- linux虚拟内存
- linux虚拟内存
- linux虚拟内存
- Linux 虚拟内存
- linux虚拟内存
- Linux虚拟内存
- Linux虚拟内存
- linux虚拟内存
- 进程的虚拟内存布局
- ARM linux内核在内存中的布局
- arm-linux启动过程中的内存布局
- CE6上的虚拟内存布局
- 查看linux虚拟内存大小
- Java WEB中文乱码问题
- MyBatisUtil.java.工具类,连接数据库库
- 用JAVA计算平方根
- java字符串问题详解
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- arm linux虚拟内存布局
- 银行运维手记----票据系统
- mybatis类型对应
- Ubuntu 查杀进程
- hdoj-【5908 Abelian Period】
- Servlet常用接口
- Reverse Integer(EASY)
- Deferred Shading vs. Deferred Lighting
- [转]程序员如何快速准备面试中的算法