很多人接触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
+关注
关注
88文章
11628浏览量
218013 -
内存
+关注
关注
9文章
3173浏览量
76120 -
C语言
+关注
关注
183文章
7642浏览量
144638 -
函数
+关注
关注
3文章
4406浏览量
66853
发布评论请先 登录
鸿蒙内核源码分析:物理地址的映射
操作系统中的逻辑地址和物理地址
请问ARM虚拟地址 物理地址 加载地址 运行地址的联系是什么?
为什么MMU的地址映射中物理地址会跳变?
【HarmonyOS】虚拟地址<->物理地址是如何映射的
物理地址到虚拟地址的转换步骤
linux kernel实现物理地址到虚拟地址空间的切换方法
鸿蒙内核中虚拟地址与物理地址之间是如何映射的
虚拟地址物理地址等众多地址及MMU相关知识
虚拟地址翻译物理地址的流程有哪些呢?
Linux系统为什么需要引入虚拟地址

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