0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux系统为什么需要引入虚拟地址

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:Jasonangel 2023-10-07 17:28 次阅读

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

图片

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

图片

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

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

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

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

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

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

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

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

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72772
  • 地址
    +关注

    关注

    1

    文章

    31

    浏览量

    10607
  • 系统
    +关注

    关注

    1

    文章

    981

    浏览量

    21036
收藏 人收藏

    评论

    相关推荐

    linux虚拟地址如何转物理地址

    linux虚拟地址转物理地址
    发表于 05-13 09:31

    物理地址虚拟地址的转换步骤

    上是不行的,在Linux上,如果想要操作硬件,需要先把物理地址转换成虚拟地址,因为Linux使能了MMU,所以我们在
    发表于 12-24 07:42

    探讨一下ARM中的MMU虚拟地址

    、连续的虚拟地址空间呈现给应用程序。虚拟地址也有利于软件开发人员,他们在编写应用程序时不知道系统的确切内存地址。使用虚拟地址,软件开发人员不
    发表于 04-08 17:17

    linux kernel实现物理地址虚拟地址空间的切换方法

    1、arm linux 临时页表的建立linux kernel的主要特点之一就是运行在虚拟地址空间上,但是怎么才能实现物理地址虚拟地址空间
    发表于 05-13 10:21

    ARM处理器使用虚拟地址来提供cache index和cache tag

    cache。这对于那些需要频繁修改页表映射的多任务系统具有显著优势。使用虚拟地址作为index也有一些硬件优势,这意味着cache硬件在进行cache look up时不需要进行
    发表于 06-20 15:22

    用户态得到虚拟地址对应的物理地址

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。
    的头像 发表于 10-10 14:10 2178次阅读
    用户态得到<b class='flag-5'>虚拟地址</b>对应的物理<b class='flag-5'>地址</b>

    鸿蒙内核中虚拟地址与物理地址之间是如何映射的

    虚拟地址(VA): 就是线性地址 鸿蒙内存部分全是VA的身影 是由编译器和链接器在定位程序时分配的,每个应用程序都使用相同的虚拟内存地址空间,而这些虚拟内存地址空间实际上分别映射到不同
    发表于 11-19 14:45 9次下载
    鸿蒙内核中<b class='flag-5'>虚拟地址</b>与物理<b class='flag-5'>地址</b>之间是如何映射的

    内核逻辑地址和内核虚拟地址到底有什么区别

      1) 凡是通过MMU页表访问的地址都叫虚拟地址,而一旦启用了MMU,那CPU发出的所有地址都是虚拟地址内核用到的地址范围是3G-4G(不
    发表于 03-11 10:10 6次下载

    虚拟地址和逻辑地址的区别是什么?

    懵逼。 在《深入理解 Linux 内核》这本书中终于找到了确切的答案,这里我就不写出来了,扣概念的话这俩确实是有些区别的,不过对于我们日常使用以及理解操作系统来说的话,暂且可以把虚拟地址和逻辑
    的头像 发表于 06-17 14:08 2.1w次阅读
    <b class='flag-5'>虚拟地址</b>和逻辑<b class='flag-5'>地址</b>的区别是什么?

    虚拟地址物理地址等众多地址及MMU相关知识

    虚拟地址物理地址等众多地址及MMU相关知识先聊聊存储器STM32单片机存储器关于编译器生成的文件数据在存储器上的存储结构物理地址虚拟地址
    发表于 12-08 12:36 12次下载
    <b class='flag-5'>虚拟地址</b>物理<b class='flag-5'>地址</b>等众多<b class='flag-5'>地址</b>及MMU相关知识

    为什么要用MMU?为什么要用虚拟地址

    既然MMU开启后,硬件会自动的将虚拟地址转换成物理地址,那么还需要我们软件做什么事情呢?即创建一个页表翻译都需要做哪些事情呢?或者说启用一个MMU
    的头像 发表于 04-26 14:37 3885次阅读

    虚拟地址翻译物理地址的流程有哪些呢?

    现代的操作系统将可执行文件加载后,创建了进程,进程中每一条指令和数据都被分配了一个虚拟地址,CPU获取到这个虚拟地址后,需要翻译成内存的物理地址
    的头像 发表于 08-14 10:30 570次阅读
    <b class='flag-5'>虚拟地址</b>翻译物理<b class='flag-5'>地址</b>的流程有哪些呢?

    Linux虚拟地址空间和物理地址空间的关系

    很多人接触Linux的内存管理是从malloc()这个C语言库函数开始,也是从那时开始就知道了虚拟内存的概念。但很多人可能并不知道虚拟地址是如何转换成物理地址的,今天带你搞懂
    的头像 发表于 10-08 11:40 509次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>虚拟地址</b>空间和物理<b class='flag-5'>地址</b>空间的关系

    Linux虚拟地址到物理地址转换过程

    offset两部分组成。 虚拟地址转换成物理地址时,需要将VPN转成PFN。PA offset通常就是VA offset。 所以物理地址 = PFN + VA offset 这里的核
    的头像 发表于 10-08 11:45 860次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>虚拟地址</b>到物理<b class='flag-5'>地址</b>转换过程

    MMU虚拟地址空间布局

    当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。 (1)-虚拟地址位宽 虚拟地址的最大宽度是48
    的头像 发表于 11-26 16:35 575次阅读