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

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

3天内不再提示

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

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-10-08 11:40 次阅读

很多人接触Linux的内存管理是从malloc()这个C语言库函数开始,也是从那时开始就知道了虚拟内存的概念。但很多人可能并不知道虚拟地址是如何转换成物理地址的,今天带你搞懂虚拟地址到物理地址的转换过程,这其实也是MMU的工作原理

我们知道,在Linux中,每个进程都有自己独立的地址空间,且互不干扰。每个进程的地址空间又分为用户空间和内核空间,但这些地址空间使用的都是虚拟地址,它们和物理地址空间关系是怎样的呢?虚拟地址空间和物理地址空间的关系如下:

图片

对于不同的进程,面对的都是同一个内核,其内核空间的地址对应的物理地址都是一样的,因此进程1和进程2中内核空间都映射到了相同的物理内存PA1上。

而不同进程的用户空间是不一样的,即便相同的虚拟地址,也会被映射到不同的物理地址上。如图中两个进程相同用户空间的地址0x123456分别被映射到了PA2和PA3物理地址上。

那么如何完成上述虚拟地址到物理地址的转换呢?

完成虚拟地址到物理地址的转换,我们需要借助一个硬件——MMU。

MMU: Memory manager unit,内存管理单元,负责将虚拟地址(VA)转为物理地址(PA)。

分页机制

在Linux系统上,现在用到的内存管理机制,大部分是分页机制。在分页机制出现之前,还出现过动态分区法、分段机制。

动态分区法是还没用引入虚拟地址之前使用的,使用的都是物理内存,属于非常早期的机制。分段机制则引入了虚拟地址的概念,而分页机制在分段机制后出现,主要解决分段机制内存碎片的问题。本篇以分页机制讲解虚拟地址到物理地址的转换,下面介绍分页机制的一些基本概念。

分页机制的基本概念:

分页:将内存划分为固定长度的单元,每个单元就是一页

页:对于虚拟地址空间,将地址空间划分为固定大小单元的单元,每个单元称为一页

页帧:对于物理地址空间,将地址空间分为固定大小的单元,每个单元称为页帧

VPN:Virtual Page Number,虚拟页面号

PFN:Physical Frame Number,物理页帧号

分页管理内存的核心问题就是虚拟地址页到物理地址页帧的映射关系

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

    关注

    87

    文章

    10990

    浏览量

    206737
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72769
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128764
  • 函数
    +关注

    关注

    3

    文章

    3881

    浏览量

    61310
收藏 人收藏

    评论

    相关推荐

    鸿蒙内核源码分析:物理地址的映射

    到不同的实际物理内存空间上。CPU只知道虚拟地址,向虚拟地址要数据,但在其保护模式下很悲催地址信号在路上被MMU拦截了,MMU把
    的头像 发表于 11-03 10:28 1811次阅读

    请问ARM虚拟地址 物理地址 加载地址 运行地址的联系是什么?

    简单的理解:ARM的加载地址即程序在Flash的存储位置。运行地址即内存中运行时的位置。虚拟地址物理地址在MMU中映射,那么这四者之间的联系是什么?
    发表于 04-25 03:16

    虚拟内存管理的地址是怎么分配的

    看书时看到了linux虚拟内存管理:中间有用户虚拟地址物理地址,总线地址,内核逻辑地址,内核
    发表于 05-22 05:45

    为什么MMU的地址映射中物理地址会跳变?

    关于MMU的地址映射,32位的cpu有4G的虚拟地址空间,将它分为4096个小块,每个小块是1M,用描述符进行虚拟地址物理地址之间
    发表于 08-22 05:45

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

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

    【HarmonyOS】虚拟地址<->物理地址是如何映射的

    到不同的实际物理内存空间上。CPU只知道虚拟地址,向虚拟地址要数据,但在其保护模式下很悲催地址信号在路上被MMU拦截了,MMU把
    发表于 11-03 16:20

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

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

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

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

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

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

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

    内存空间上。CPU只知道虚拟地址,向虚拟地址要数据,但在其保护模式下很悲催地址信号在路上被MMU拦截了,MMU把虚拟地址换成了
    发表于 11-19 14:45 9次下载
    鸿蒙内核中<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相关知识

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

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

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

    ,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的1G 空间,如下所示: 虚拟地址会通过硬件MMU(内存管理单元)映射到实际的
    的头像 发表于 10-07 17:28 542次阅读
    <b class='flag-5'>Linux</b>系统为什么需要引入<b class='flag-5'>虚拟地址</b>

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

    虚拟地址物理地址转换过程 虚拟地址物理地址都被划分了两部分: 虚拟地址虚拟页面号VPN和
    的头像 发表于 10-08 11:45 859次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>虚拟地址</b>到<b class='flag-5'>物理地址</b>转换过程

    MMU虚拟地址空间布局

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