专栏首页嵌入式Linux系统开发进程的虚拟地址空间

进程的虚拟地址空间

在 Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!在 Linux 系统中,每一个进程都在自己独立的地址空间中运行,在 32 位系统中,每个进程的逻辑地址空间均为 4GB,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的 1G 空间,如下所示:

虚拟地址会通过硬件 MMU(内存管理单元)映射到实际的物理地址空间中,建立虚拟地址到物理地址的映射关系后,对虚拟地址的读写操作实际上就是对物理地址的读写操作,MMU 会将物理地址“翻译”为对应的物理地址,其关系如下所示:

Linux 系统下,应用程序运行在一个虚拟地址空间中,所以程序中读写的内存地址对应也是虚拟地址,并不是真正的物理地址,譬如应用程序中读写 0x80800000 这个地址,实际上并不对应于硬件的 0x80800000 这个物理地址。

为什么需要引入虚拟地址呢?

计算机物理内存的大小是固定的,就是计算机的实际物理内存,试想一下,如果操作系统没有虚拟地址机制,所有的应用程序访问的内存地址就是实际的物理地址,所以要将所有应用程序加载到内存中,但是我们实际的物理内存只有 4G,所以就会出现一些问题:

⚫ 当多个程序需要运行时,必须保证这些程序用到的内存总量要小于计算机实际的物理内存的大小。

⚫ 内存使用效率低。内存空间不足时,就需要将其它程序暂时拷贝到硬盘中,然后将新的程序装入内存。然而由于大量的数据装入装出,内存的使用效率就会非常低。

⚫ 进程地址空间不隔离。由于程序是直接访问物理内存的,所以每一个进程都可以修改其它进程的内存数据,甚至修改内核地址空间中的数据,所以有些恶意程序可以随意修改别的进程,就会造成一些破坏,系统不安全、不稳定。

⚫ 无法确定程序的链接地址。程序运行时,链接地址和运行地址必须一致,否则程序无法运行!因为程序代码加载到内存的地址是由系统随机分配的,是无法预知的,所以程序的运行地址在编译程序时是无法确认的。

针对以上的一些问题,就引入了虚拟地址机制。程序访问存储器所使用的逻辑地址就是虚拟地址,通过逻辑地址映射到真正的物理内存上。所有应用程序运行在自己的虚拟地址空间中,使得进程的虚拟地址空间和物理地址空间隔离开来,这样做带来了很多的优点:

⚫ 进程与进程、进程与内核相互隔离。一个进程不能读取或修改另一个进程或内核的内存数据,这是因为每一个进程的虚拟地址空间映射到了不同的物理地址空间。提高了系统的安全性与稳定性。

⚫ 在某些应用场合下,两个或者更多进程能够共享内存。因为每个进程都有自己的映射表,可以让不同进程的虚拟地址空间映射到相同的物理地址空间中。通常,共享内存可用于实现进程间通信。

⚫ 便于实现内存保护机制。譬如在多个进程共享内存时,允许每个进程对内存采取不同的保护措施,例如,一个进程可能以只读方式访问内存,而另一进程则能够以可读可写的方式访问。

⚫ 编译应用程序时,无需关心链接地址。前面提到了,当程序运行时,要求链接地址与运行地址一致,在引入了虚拟地址机制后,便无需关心这个问题。

·················· END ··················

本文分享自微信公众号 - 嵌入式Linux系统开发(Jason_Linux_)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux可执行文件与进程的虚拟地址空间

    一个可执行文件被执行的同时也伴随着一个新的进程的创建。Linux会为这个进程创建一个新的虚拟地址空间,然后会读取可执行文件的文件头,建立虚拟地址空间与可执行文件...

    刘盼
  • Linux虚拟地址空间布局

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

    sunsky
  • 虚拟内存探究,深入理解进程地址空间

    想了解堆栈等虚拟内存相关知识吗? 想知道下面这张进程地址空间示意图是如何一步一步画出来的吗? 《虚拟内存探究》系列文章将通过实验的方式带你学习相关知识。

    coderhuo
  • DAY13:CUDA C Runtime之统一虚拟地址空间及进程间通信

    GPUS Lady
  • 根据crash学习ARM64虚拟地址空间布局

    可以看到出错提示是:Unable to hanle kernel paging requeset at virtual address ffffdfc7be9c...

    DragonKingZhu
  • linux系统编程之基础必备(五):Linux进程地址空间和虚拟内存

    一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: ? 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~...

    s1mba
  • 通过linux0.11源码理解进程的虚拟地址、线性地址、物理地址

    进程的地址有三种,分别是虚拟地址(逻辑地址)、线性地址、物理地址。在分析之前先讲一下进程执行的时候,地址的解析过程。在保护模式下,段寄存器保存的是段选择子,当进...

    theanarkh
  • 用户态进程如何得到虚拟地址对应的物理地址?

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。

    Linux阅码场
  • 「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系

    这里说的物理地址是内存中的内存单元实际地址,不是外部总线连接的其他电子元件的地址!

    用户8639654
  • 物理地址和虚拟地址的分布

    上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括:

    刘盼
  • 物理地址和虚拟地址的分布

    上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以...

    刘盼
  • 「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系2

    GDT在内存中的地址和大小存放在CPU的gdtr控制寄存器中,而LDT则在ldtr寄存器中。

    用户8639654
  • 如何将虚拟机的虚拟地址转化为宿主机的物理地址?

    一般情况下,Linux系统中进程的4GB内存空间被划分为2个部分-------用户空间和内核空间,大小分别为0~3G,3~4G。用户进程通常,只能访问用户空间的...

    半月弧
  • 逆向工程基础:从PE文件到进程地址空间

    对于确定的处理器,它能执行的指令是确定的,这就是CPU的指令集。CPU的指令集是机器码,于是人们为了容易编程,发明了使用助记符的汇编语言。后来,又出现 了高级语...

    范蠡
  • Linux内核如何私闯进程地址空间并修改进程内存

    进程地址空间的隔离 是现代操作系统的一个显著特征。这也是区别于 “古代”操作系统 的显著特征。

    Linux阅码场
  • 快速缓解 32 位 Android 环境下虚拟内存地址空间不足的“黑科技”

    背景 随着微信新业务的不断增长,因 32 位设备上虚拟内存地址空间限制导致的内存分配失败问题也越来越突出。目前市场上的存量 32 位设备数量仍然较多,且预计还...

    微信终端开发团队
  • 国内的虚拟空间提供商

    简单、
  • 虚拟地址(VA,virtual address)到物理地址(PA, ,physical address)的转换

    其实芯片和我们的生活场景有着很多共同之处,比如需求大于供应问题。PAD复用、仲裁等等都是因为多个输出需求只对应一个实际输出端口,这个时候选择哪个请求也是有讲究的...

    AsicWonder
  • Linux内核深入研究之进程的线性地址空间-传统版

      了解Linux环境下,进程的地址空间划分,对于我们理解Linux应用程序有很大的帮助,否则会被New与Malloc之类的指针操作弄的晕头转向,本文基于Lin...

    数据饕餮

扫码关注云+社区

领取腾讯云代金券