一步一图带你深入理解 Linux 虚拟内存管理

写在本文开始之前....从本文开始我们就正式开启了 Linux 内核内存管理子系统源码解析系列,笔者还是会秉承之前系列文章的风格,采用一步一图的方式先是详细介绍相关原理,在保证大家清晰理解原理的基础上,我们再来一步一步的解析相关内核源码的实现 。有了源码的辅证,这样大家看得也安心,理解起来也放心,最起码可以证明笔者没有胡编乱造骗大家 , 哈哈~~
内存管理子系统可谓是 Linux 内核众多子系统中最为复杂最为庞大的一个,其中包含了众多繁杂的概念和原理,通过内存管理这条主线我们把可以把操作系统的众多核心系统给拎出来,比如:进程管理子系统,网络子系统,文件子系统等 。
由于内存管理子系统过于复杂庞大,其中涉及到的众多繁杂的概念又是一环套一环 , 层层递进 。如何把这些繁杂的概念具有层次感地,并且清晰地,给大家梳理呈现出来真是一件比较有难度的事情,因此关于这个问题,笔者在动笔写这个内存管理源码解析系列之前也是思考了很久 。
万事开头难,那么到底什么内容适合作为这个系列的开篇呢 ?笔者还是觉得从大家日常开发工作中接触最多最为熟悉的部分开始比较好 , 比如:在我们日常开发中创建的类,调用的函数,在函数中定义的局部变量以及 new 出来的数据容器(Map,List,Set .....等)都需要存储在物理内存中的某个角落 。
而我们在程序中编写业务逻辑代码的时候,往往需要引用这些创建出来的数据结构,并通过这些引用对相关数据结构进行业务处理 。
当程序运行起来之后就变成了进程,而这些业务数据结构的引用在进程的视角里全都都是虚拟内存地址,因为进程无论是在用户态还是在内核态能够看到的都是虚拟内存空间,物理内存空间被操作系统所屏蔽进程是看不到的 。
进程通过虚拟内存地址访问这些数据结构的时候,虚拟内存地址会在内存管理子系统中被转换成物理内存地址 , 通过物理内存地址就可以访问到真正存储这些数据结构的物理内存了 。随后就可以对这块物理内存进行各种业务操作,从而完成业务逻辑 。

  • 那么到底什么是虚拟内存地址 ?
  • Linux 内核为啥要引入虚拟内存而不直接使用物理内存 ?
  • 虚拟内存空间到底长啥样?
  • 内核如何管理虚拟内存?
  • 什么又是物理内存地址 ?如何访问物理内存?
本文笔者就来为大家详细一一解答上述几个问题,让我们马上开始吧~~~~
一步一图带你深入理解 Linux 虚拟内存管理

文章插图
1. 到底什么是虚拟内存地址【一步一图带你深入理解 Linux 虚拟内存管理】首先人们提出地址这个概念的目的就是用来方便定位现实世界中某一个具体事物的真实地理位置,它是一种用于定位的概念模型 。
举一个生活中的例子,比如大家在日常生活中给亲朋好友邮寄一些本地特产时,都会填写收件人地址以及寄件人地址 。以及在日常网上购物时,都会在相应电商 APP 中填写自己的收获地址 。
一步一图带你深入理解 Linux 虚拟内存管理

文章插图
随后快递小哥就会根据我们填写的收货地址找到我们的真实住所,将我们网购的商品送达到我们的手里 。
收货地址是用来定位我们在现实世界中真实住所地理位置的 , 而现实世界中我们所在的城市,街道,小区,房屋都是一砖一瓦,一草一木真实存在的 。但收货地址这个概念模型在现实世界中并不真实存在,它只是人们提出的一个虚拟概念,通过收货地址这个虚拟概念将它和现实世界真实存在的城市 , 小区,街道的地理位置一一映射起来,这样我们就可以通过这个虚拟概念来找到现实世界中的具体地理位置 。
综上所述,收货地址是一个虚拟地址,它是人为定义的,而我们的城市,小区,街道是真实存在的,他们的地理位置就是物理地址 。
一步一图带你深入理解 Linux 虚拟内存管理

文章插图
比如现在的广东省深圳市在过去叫宝安县 , 河北省的石家庄过去叫常山,安徽省的合肥过去叫泸州 。不管是常山也好,石家庄也好,又或是合肥也好,泸州也罢,这些都是人为定义的名字而已,但是地方还是那个地方,它所在的地理位置是不变的 。也就说虚拟地址可以人为的变来变去,但是物理地址永远是不变的 。
现在让我们把视角在切换到计算机的世界 , 在计算机的世界里内存地址用来定义数据在内存中的存储位置的,内存地址也分为虚拟地址和物理地址 。而虚拟地址也是人为设计的一个概念 , 类比我们现实世界中的收货地址,而物理地址则是数据在物理内存中的真实存储位置,类比现实世界中的城市,街道,小区的真实地理位置 。

推荐阅读