两个不同的进程 虚拟地址相同_Linux的进程地址空间[一]
所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。
32位系统的进程地址空间
以IA-32处理器为例,其虚拟地址为32位,因此其虚拟地址空间的范围为
假设物理内存也是4GB(事实上,虚拟地址空间的范围不一定需要和物理地址空间的大小相同),则虚拟地址空间和物理地址空间的转换如下图所示:
因为内核的虚拟地址空间只有1GB,但它需要访问整个4GB的物理空间,因此从物理地址0~896MB的部分(ZONE_DMA+ZONE_NORMAL),直接加上3GB的偏移(在Linux中用PAGE_OFFSET表示),就得到了对应的虚拟地址,这种映射方式被称为线性/直接映射(Direct Map)。
而896M~4GB的物理地址部分(ZONE_HIGHMEM)需要映射到(3G+896M)~4GB这128MB的虚拟地址空间,显然也按线性映射是不行的。
采用的是做法是,ZONE_HIGHMEM中的某段物理内存和这128M中的某段虚拟空间建立映射,完成所需操作后,需要断开与这部分虚拟空间的映射关系,以便ZONE_HIGHMEM中其他的物理内存可以继续往这个区域映射,即动态映射的方式。
用户空间的进程只能访问整个虚拟地址空间的0~3GB部分,不能直接访问3G~4GB的内核空间部分,但出于对性能方面的考虑,Linux中内核使用的地址也是映射到进程地址空间的(被所有进程共享),因此进程的虚拟地址空间可视为整个4GB(虽然实际只有3GB)。
64位系统的进程地址空间
在64位系统中,进程地址空间的大小就不固定了,以ARMv8-A为例,它的page大小可以是4KB, 16KB或者64KB(默认为4KB,选一种来用,不要混用),可采用3级页表或4级页表,因此可以有多种组合的形式。
以采用4KB的页,4级页表,虚拟地址为48位的系统为例(从ARMv8.2架构开始,支持虚拟地址和物理地址的大小最多为52位),其虚拟地址空间的范围为
256TB已经很大很大了,但是面对64位系统所具备的16EB的地址范围,根本就用不完。为了以后扩展的需要(比如虚拟地址扩大到56位),用户虚拟空间和内核虚拟空间不再是挨着的,但同32位系统一样,还是一个占据底部,一个占据顶部,所以这时user space和kernel space之间偌大的区域就空出来了。
但这段空闲区域也不是一点用都没有,它可以辅助进行地址有效性的检测。如果某个虚拟地址落在这段空闲区域,那就是既不在user space,也不在kernel space,肯定是非法访问了。使用48位虚拟地址,则kernel space的高16位都为1,如果一个试图访问kernel space的虚拟地址的高16位不全为1,则可以判断这个访问也是非法的。同理,user space的高16位都为0。这种高位空闲地址被称为canonical。
在64位系统中,内核空间的映射变的简单了,因为这时内核的虚拟地址空间已经足够大了,即便它要访问所有的物理内存,直接映射就是,不再需要ZONE_HIGHMEM那种动态映射机制了。
64位系统中用户空间的映射和32位系统没有太大的差别。
ARM公司宣称64位的ARMv8是兼容32位的ARM应用的,所有的32位应用都可以不经修改就在ARMv8上运行。那32位应用的虚拟地址在64位内核上是怎么分布的呢?事实上,64位内核上的所有进程都是一个64位进程。要运行32位的应用程序, Linux内核仍然从64位init进程创建一个进程, 但将用户地址空间限制为4GB。通过这种方式, 我们可以让64位Linux内核同时支持32位和64位应用程序。
要注意的是, 32位应用程序仍然对应128TB的内核虚拟地址空间, 并且不与内核共享自己的4GB虚拟地址空间, 此时用户应用程序具有完整的4GB虚拟地址。而32位内核上的32位应用程序只有3GB真正意义上的虚拟地址空间。
那进程地址空间到底是由哪些元素构成的呢?请看下文分解。
参考:
http://jake.dothome.co.kr/pt64/,里面对ARM64的各种page size和页表级数的组合做了详尽介绍。
https://www.kernel.org/doc/Documentation/arm64/memory.txt
http://thinkiii.blogspot.com/2014/02/arm64-linux-kernel-virtual-address-space.html, 这是本文后半部分的图片来源和主要参考。
原创文章,转载请注明出处。
两个不同的进程 虚拟地址相同_Linux的进程地址空间[一]相关推荐
- 两个不同的进程 虚拟地址相同_记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了...
1 管道 学习软件工程规范的时候,我们知道瀑布模型,在整个项目开发过程分为多个阶段,上一阶段的输出作为下一阶段的输入.各个阶段的具体内容如下图所示 最初我们在学习Linux基本命令使用的时候,我们经常 ...
- linux进程--虚拟地址空间布局(十一)
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进 ...
- Linux 进程虚拟地址空间布局
文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内 ...
- linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?进程虚拟地址4G指拥有4G的寻址能力,需要页表转换为实际物理地址,每个进程用到的内核是直接映射,地址的进程地址-3G的关系
linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间 ...
- Linux操作系统~什么是虚拟地址?深度剖析进程地址空间
目录 1.所以进程的地址空间是什么呢? 2.mm_struct内部有什么? 3.虚拟地址空间与物理内存如何关联 页表 4.为什么设计这样一个进程地址空间,不让程序直接访问内存 Q:为什么子进程修改值以 ...
- 进程虚拟地址为什么是4G大小?
1.创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟 进程地址空间. 之所以是 4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节 (32位), 2的32次 方个地址寻 ...
- linux 父子进程 资源_linux 父子进程 资源_实验4 Linux父子进程同步
实验 4 Linux 父子进程同步 [实验目的] ( 1 )熟悉在 c 语言源程序中使用 linux 所提供的系统调用界面的方法. ( 2 )理解同步的概念. ( 3 )使用系统调用 wait() ...
- stopped状态的进程 top 命令_Linux 进程管理之四大名捕
一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手"无情".内功卓越的高手"铁手".腿 ...
- 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解
1.操作系统(推荐查看书籍:现代操作系统) 操作系统是位于计算机硬件与软件之间的控制程序 作用: 1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用 ...
最新文章
- Tomcat 与 Resin PK大战
- 速学c++(2)-helloworld工程
- vxworks 实时操作系统
- instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)
- mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享
- idea,eclipse创建多模块项目
- echarts 柱状图不显示y坐标轴_Python+matplotlib自定义坐标轴位置、颜色、箭头
- saveOrUpdate的使用
- uva 1291 - Dance Dance Revolution ( dp )
- mysql分表和分区的区别
- PHP里 date() 函数与 strtotime() 函数笔记
- 【UVA11795】 Mega Man's Mission
- CocosCreator2.3.1按钮节点防止多次连续点击
- 给Activity设置背景色
- android ndk怎样加载o文件_Android开发:JNI与NDK全面剖析与实战
- uniapp开发微信小程序-软考刷题小程序
- 我们无法创建新分区。【错误:0x80042468】
- 网络效应VS平台效应,如何选择主要价值引擎?
- 数字化时代,全方位解读商业智能BI
- java_facade
热门文章
- echarts asp mysql 源码_如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)...
- CodeForces - 589A
- Kubernetes中部署SpringBoot应用
- MySQL 基准测试(sysbench)工具安装时提示 automake 1.10.x (aclocal) wasn‘t found, exiting
- springboot获取静态图片路径_springboot为实体追加图片路径
- quartz集群重复调度的解决
- mysql数据库中文乱码解决
- 面向对象设计原则与设计模式
- tailf 命令安装
- apollo权限管理