所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。

32位系统的进程地址空间

以IA-32处理器为例,其虚拟地址为32位,因此其虚拟地址空间的范围为

,Linux系统将地址空间按3:1比例划分,其中用户空间(user space)占3GB,内核空间(kernel space)占1GB。

假设物理内存也是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位),其虚拟地址空间的范围为

,按照1:1的比例划分,内核空间和用户空间各占128TB。

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. 两个不同的进程 虚拟地址相同_记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了...

    1 管道 学习软件工程规范的时候,我们知道瀑布模型,在整个项目开发过程分为多个阶段,上一阶段的输出作为下一阶段的输入.各个阶段的具体内容如下图所示 最初我们在学习Linux基本命令使用的时候,我们经常 ...

  2. linux进程--虚拟地址空间布局(十一)

    在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进 ...

  3. Linux 进程虚拟地址空间布局

    文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内 ...

  4. linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?进程虚拟地址4G指拥有4G的寻址能力,需要页表转换为实际物理地址,每个进程用到的内核是直接映射,地址的进程地址-3G的关系

    linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间 ...

  5. Linux操作系统~什么是虚拟地址?深度剖析进程地址空间

    目录 1.所以进程的地址空间是什么呢? 2.mm_struct内部有什么? 3.虚拟地址空间与物理内存如何关联 页表 4.为什么设计这样一个进程地址空间,不让程序直接访问内存 Q:为什么子进程修改值以 ...

  6. 进程虚拟地址为什么是4G大小?

    1.创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟 进程地址空间. 之所以是 4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节  (32位), 2的32次 方个地址寻 ...

  7. linux 父子进程 资源_linux 父子进程 资源_实验4 Linux父子进程同步

    实验 4  Linux 父子进程同步 [实验目的] ( 1 )熟悉在 c 语言源程序中使用 linux 所提供的系统调用界面的方法. ( 2 )理解同步的概念. ( 3 )使用系统调用 wait() ...

  8. stopped状态的进程 top 命令_Linux 进程管理之四大名捕

    一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手"无情".内功卓越的高手"铁手".腿 ...

  9. 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解

    1.操作系统(推荐查看书籍:现代操作系统)     操作系统是位于计算机硬件与软件之间的控制程序     作用:         1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用      ...

最新文章

  1. Tomcat 与 Resin PK大战
  2. 速学c++(2)-helloworld工程
  3. vxworks 实时操作系统
  4. instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)
  5. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享
  6. idea,eclipse创建多模块项目
  7. echarts 柱状图不显示y坐标轴_Python+matplotlib自定义坐标轴位置、颜色、箭头
  8. saveOrUpdate的使用
  9. uva 1291 - Dance Dance Revolution ( dp )
  10. mysql分表和分区的区别
  11. PHP里 date() 函数与 strtotime() 函数笔记
  12. 【UVA11795】 Mega Man's Mission
  13. CocosCreator2.3.1按钮节点防止多次连续点击
  14. 给Activity设置背景色
  15. android ndk怎样加载o文件_Android开发:JNI与NDK全面剖析与实战
  16. uniapp开发微信小程序-软考刷题小程序
  17. 我们无法创建新分区。【错误:0x80042468】
  18. 网络效应VS平台效应,如何选择主要价值引擎?
  19. 数字化时代,全方位解读商业智能BI
  20. java_facade

热门文章

  1. echarts asp mysql 源码_如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)...
  2. CodeForces - 589A
  3. Kubernetes中部署SpringBoot应用
  4. MySQL 基准测试(sysbench)工具安装时提示 automake 1.10.x (aclocal) wasn‘t found, exiting
  5. springboot获取静态图片路径_springboot为实体追加图片路径
  6. quartz集群重复调度的解决
  7. mysql数据库中文乱码解决
  8. 面向对象设计原则与设计模式
  9. tailf 命令安装
  10. apollo权限管理