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

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

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

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

文章插图
随后快递小哥就会根据我们填写的收货地址找到我们的真实住所 , 将我们网购的商品送达到我们的手里 。

经验总结扩展阅读