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

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

3天内不再提示

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

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

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

虚拟地址和物理地址都被划分了两部分:

图片

虚拟地址由虚拟页面号VPN和虚拟地址偏移VA offset两部分组成。同样,物理地址由物理页帧号PFN和物理地址偏移PA offset两部分组成。

虚拟地址转换成物理地址时,需要将VPN转成PFN。PA offset通常就是VA offset。

所以物理地址 = PFN + VA offset

这里的核心就是VPN到PFN的映射,而VPN到PFN的映射关系是通过页表记录。就是说,页表存储了VPN和PFN的映射关系,MMU根据VPN,在页表中找到PFN,再把PFN和VA offset相加,就得到了物理地址,从而将虚拟地址转为物理地址。

这里要区分一下,页表存储了VA到PA的映射关系,所以说找到页表就找到了物理地址。但是这个页表是软件提供的,MMU只负责将虚拟地址翻译成物理地址,翻译的依据就是页表,MMU本身不负责创建页表。所以说,在开启MMU之前,系统就要提前建立好虚拟地址到物理地址的映射关系,然后保存到页表中,这样开启MMU时,MMU才能正确找到对应的物理地址。

页表在哪

页表都存储在物理内存中, MMU将虚拟地址转换为物理地址,需要访问物理内存中对应的页表。

实际上,页表通常就是用一个数组来表示。

这里可能会一些疑问:

疑问:放到物理内存,每次转换都要访问内存,速度不慢吗?

答:慢。怎么解决呢?如果有cache是不是就很快了?是的,这块cache就叫TLB。

疑问:都放到物理内存,占用物理内存空间不大吗?

答:大,怎么解决?多级页表+缺页异常!多级页表可以减少内存占用,而通常只需将一级页表存储到物理内存,查找的时候,找不到二级页表,触发一个缺页异常,这时再分配页表,从而节省内存。

关于页表放到物理内存的问题,涉及到cache和其他的一些知识,内容很多且比较复杂,暂时不深究,知道页表是放在内存中的即可。

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

    关注

    87

    文章

    10990

    浏览量

    206738
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72772
  • MMU
    MMU
    +关注

    关注

    0

    文章

    91

    浏览量

    17945
收藏 人收藏

    评论

    相关推荐

    操作系统中的逻辑地址物理地址

    本文是关于操作系统中逻辑地址物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址物理地址是内存的实际地址,如RAM,
    发表于 09-14 14:26 3159次阅读

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

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

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

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

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

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

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

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

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

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

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

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

    RT-Thread smart内存虚拟地址物理地址转换是一个什么样的流程

    ,rt_system_heap_init(RT_HW_HEAP_BEGIN,RT_HW_HEAP_END);RT_HW_HEAP_BEGIN RT_HW_HEAP_END 两个是物理地址。所以我实在理解不了虚拟地址
    发表于 10-19 10:41

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

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。
    的头像 发表于 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相关知识

    一级页表虚拟地址转换物理地址示例

    假设低2比特为2’b10,那么这个页表项中的内容就是实际指向的物理地址。页表项中除了指定了物理地址,还包含了页的内存属性(访问权限、cache属性、buffer属性等等)。
    的头像 发表于 07-28 17:58 2789次阅读
    一级页表<b class='flag-5'>虚拟地址</b><b class='flag-5'>转换</b>为<b class='flag-5'>物理地址</b>示例

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

    现代的操作系统将可执行文件加载后,创建了进程,进程中每一条指令和数据都被分配了一个虚拟地址,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 544次阅读
    <b class='flag-5'>Linux</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>空间的关系