很多人接触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文章
11196浏览量
208659 -
内存
+关注
关注
8文章
2959浏览量
73792 -
C语言
+关注
关注
180文章
7589浏览量
135767 -
函数
+关注
关注
3文章
4274浏览量
62302
发布评论请先 登录
相关推荐
评论