嵌入式Linux之虚拟内存地址空间布局(Virtual Memory Space)
虚拟内存地址空间
Linux内核属于微内核的范畴,内核控制计算机的硬件资源,运行在特权模式;用户态应用程序运行在普通用户模式,无法直接访问硬件资源,必须依托于内核提供的资源,如CPU资源、Memory资源、I/O资源等。
Linux采用沙箱机制,每一个进程运行在独立的虚拟地址空间,最大限度避免单个进程异常导致整个系统崩溃。
每一个进程的虚拟地址空间分为内核虚拟地址空间和用户虚拟地址空间两部分,内核虚拟地址空间为内核态代码和内核堆栈,所有进程的内核虚拟地址空间是复用的;用户虚拟地址空间则是各进程的代码段、数据段、BSS段、mmap段(动态加载库以及各库运行数据段、运行栈等)、堆、栈、环境变量等信息。
Linux中可以通过cat /proc/<pid>/maps命令查看指定进程的用户虚拟地址空间的映射,也可以通过pmap -x <pid>查看,该命令实质上是基于/proc/<pid>/maps实现的。
ARM32
用户虚拟地址空间范围:0x0000 0000 ~ 0xbfff ffff
内核虚拟地址空间范围:0xc000 0000 ~ 0xffff ffff
ARM64
ARMv7架构(32位CPU)早期CPU采用32位物理地址空间,支持最大物理内存为4GB。但是随着内存容量和软件的扩张,4GB物理内存寻址范围已经不够用了,所以引入了LPAE(Large Physical Address Extension)机制,用户可以通过CPU寄存器扩展物理地址宽度。
ARMv8架构(64位CPU)开始,ARM公司从长远地角度考虑,优化了LPAE机制,可以支持32~48位物理地址寻址,满足了物理内存寻址的要求。同时做了兼容32位应用程序的考虑。
ARMv8在硬件体系结构上支持4级的4KB页大小的页表转换,也支持3级的64KB页大小的页表转换。
在Linux ARM64中,如果页大小为4KB,使用3级或者4级页表转换,用户虚拟地址空间和内核虚拟地址空间都支持39位(512GB)或者48位(256TB)寻址范围。
如果页大小为64KB,就只有2级页表转换,用户虚拟地址空间和内核虚拟地址空间支持42位(4TB)寻址范围。
上面这张表格,整理了ARMv7和ARMv8的物理地址位宽、用户虚拟地址空间范围和内核虚拟地址空间范围。
ARMv8架构开始,Linux内核新增了几个内核配置选项用来设定虚拟地址位宽和页表层级以及页大小:
1)CONFIG_ARM64_64K_PAGES 可以使能64KB大页,如果没有使能,则延用4KB页;
2)CONFIG_COMPAT 设置是否兼容32位应用程序;
#ifdef CONFIG_COMPAT
#define TASK_SIZE_32 UL(0x100000000)
#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \
TASK_SIZE_32 : TASK_SIZE_64)
#else
#define TASK_SIZE TASK_SIZE_64
#endif /* CONFIG_COMPAT */
3)CONFIG_ARM64_VA_BITS 设置虚拟地址位宽,常用的虚拟地址位宽为39位或者48位;(实际生效的是内核VA_BITS宏)
ARM64内核虚拟地址空间布局可以通过arch/arm64/include/asm/memory.h文件查看,也可以查看也可以看看 arch/arm64/mm/init.c 和 arch/arm64/include/asm/pgtable.h。
pr_notice("Virtual kernel memory layout:\n"
" vmalloc : 0x%16lx - 0x%16lx (%6ld MB)\n"
#ifdef CONFIG_SPARSEMEM_VMEMMAP
" vmemmap : 0x%16lx - 0x%16lx (%6ld MB)\n"
#endif
" modules : 0x%16lx - 0x%16lx (%6ld MB)\n"
" memory : 0x%16lx - 0x%16lx (%6ld MB)\n"
" .init : 0x%p" " - 0x%p" " (%6ld kB)\n"
" .text : 0x%p" " - 0x%p" " (%6ld kB)\n"
" .data : 0x%p" " - 0x%p" " (%6ld kB)\n",
MLM(VMALLOC_START, VMALLOC_END),
#ifdef CONFIG_SPARSEMEM_VMEMMAP
MLM((unsigned long)virt_to_page(PAGE_OFFSET),
(unsigned long)virt_to_page(high_memory)),
#endif
MLM(MODULES_VADDR, MODULES_END),
MLM(PAGE_OFFSET, (unsigned long)high_memory), MLK_ROUNDUP(__init_begin, __init_end),
MLK_ROUNDUP(_text, _etext),
MLK_ROUNDUP(_sdata, _edata));
实例如下:
ARM64用户虚拟地址空间布局和ARM32类似,但是地址范围略有差异。
ARM64兼容ARM 32位应用程序,所以ARM 32位应用程序可以无需修改运行在ARMv8上。为了运行ARM 32位应用程序,Linux内核仍然从init进程创建一个64位的进程(clone系统调用)、但是将其用户虚拟地址空间限制到4GB。通过这种方式,64位的Linux内核可以同时运行32位和64位应用程序。
需要注意到,ARM64上32位应用程序仍然拥有512GB的内核地址空间,并且不与内核共享自己的4GB用户虚拟地址空间;但是ARM32上,32位应用程序只有3GB用户虚拟地址空间。
嵌入式Linux之虚拟内存地址空间布局(Virtual Memory Space)的更多相关文章
- JVM virtual memory
This has been a long-standing complaint with Java, but it's largely meaningless, and usually based o ...
- Extended paging tables to map guest physical memory addresses from virtual memory page tables to host physical memory addresses in a virtual machine system
A processor including a virtualization system of the processor with a memory virtualization support ...
- Linux Process Virtual Memory
目录 . 简介 . 进程虚拟地址空间 . 内存映射的原理 . 数据结构 . 对区域的操作 . 地址空间 . 内存映射 . 反向映射 .堆的管理 . 缺页异常的处理 . 用户空间缺页异常的校正 . 内核 ...
- 深入虚拟内存(Virtual Memory,VM)
我们应该知道物理内存(Physical Memory)指的是硬件上的内存,即 RAM.它通常指的是插在主板上的内存条,给进程提供临时数据存储的设备.因为 CPU 可以直接从物理内存中读取数据和指令,所 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十三)kafka+spark streaming打包好的程序提交时提示虚拟内存不足(Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical memory used; 2.2 GB of 2.1 G)
异常问题:Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical mem ...
- LDAP实例异常停止日志提示虚拟内存virtual memory不足
[05/Oct/2014:20:50:37 +0800] - ERROR<5135> - Resource Limit - conn=-1 op=-1 msgId=-1 - Memory ...
- 嵌入式linux启动信息完全注释
嵌入式linux启动信息完全注释 from:http://www.embedlinux.cn/ShowPost.asp?ThreadID=377 摘要 我们在这里讨论的是对嵌入式linux系统的启动过 ...
- 《嵌入式Linux基础教程学习笔记一》
常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...
- 《嵌入式Linux内存使用与性能优化》笔记
这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...
随机推荐
- spring循环依赖是怎么解决的?
回答:循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleA,则它们最终反映为一个环. Spring如何解决循环依赖? ...
- Requests的基本使用
Requests库 r=requests.get(url) #返回一个包含服务器资源的Response对象 #构造一个向服务器请求资源的Request对象 格式:requests.get(url,pa ...
- [BZOJ3451]Normal(点分治+FFT)
[BZOJ3451]Normal(点分治+FFT) 题面 给你一棵 n个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 分析 根据 ...
- HDUSTOJ-1559 Vive la Difference!(简单题)
1559: Vive la Difference! 时间限制: 3 Sec 内存限制: 128 MB提交: 18 解决: 14[提交][状态][讨论版] 题目描述 Take any four po ...
- IDEA闪退问题
这段时间经常遇到IDEA闪退的问题,在网上搜了一大堆的博客,无外乎是说让修改下面两个文件,但是改来改去没什么卵用,最后重装IDEA,一样的,没什么用.持续时间有几个月了,内心也有点崩溃,昨天下午彻底心 ...
- 【问题解决方案】CentOS7替换yum的问题:使用yum makecache出现File contains no section headers
参考链接 CentOS7替换yum的问题:使用yum时出现File contains no section headers centos安装网络repo源及错误说明 一.centos替换yum的步骤 ...
- 【NOIP2016A组模拟7.13】亚瑟王之宫
题目 分析 我们定义\(dis_{x,y,x1,y2}\)表示\((x,y)\)到\((x1,y1)\)的距离.这个用spfa求. 接着,枚举两个集合点\((x,y).(x1,y1)\), 得出这两个 ...
- python frozenset集合(17)
在前一篇文章中我们对 python set集合 做了详细的讲解,而本文讲解的 frozenset集合 其实和set集合类似!区别在于frozenset集合不能修改/添加/删除,其他功能和set集合一样 ...
- 3D打印格式STL
STL格式及其转换 近期接触了3D打印的一些东西,也制作了一个vrml转stl的插件,对该领域多了一些认识. 目前尚没有打印机直接支持stl.obj等格式,在打印之前需使用厂家提供的软件将stl等格式 ...
- asp.net (web)选择文件夹 上传文件
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...