目录
Linux内核支持的三种内存模型
CONFIG_FLATMEM(平坦内存模型)
CONFIG_DISCONTIGMEM(不连续内存模型)
CONFIG_SPARSEMEM_VMEMMAP(稀疏的内存模型)
CONFIG_FLATMEM(平坦内存模型)
基本概念(以第一个为例,不在复述)
就像管理一个学校,我们一般不以个人为单位,而是选择以班级为单位进行管理。同理,一个4G的内存空间,为了更加有效率的管理,我们按4k的大小来进行划分,4k为一页(当然这个4k不是随便选的,这里不展开说),这就是内存页
一个班级,是不是都有自己的帮号,学生个数之内的信息?内存页,也有很多信息(当然这些信息对内存页本身没用,而且不是内存页自带的,这些是操作系统赋予的,可以简单理解为用来进行标记),这些信息我们通过一个数据结构进行管理,那就是Page frame
同样是,虚拟内存的管理,也是这么逻辑,Struct page就表示一页虚拟内存
所以说什么是平坦模型
如果物理地址空间是一个连续的,没有空洞的地址空间,那么这种计算机系统的内存模型就是Flat memory,如图所示,我们将内存分成一页一页的Page frame,然后通过一个类似数组的数据结构包含起来,通过简单地址偏移,就可以找个任何一页物理内存
所以说什么是不连续模型
顾名思义,物理地址空间,不是一个完完全全连续的地址空间,中间是由断层的(为啥出现断层?整个原始的物理空间是连续的,但一些物理空间是不能用来分配的,如DMA区,又或是存储原始数据的区域),这时候怎么来进行管理呢?我们可以通过一个数据结构node来标记Struct page,只要找到node就可以索引到Struct page,如下图所示
所以说什么是稀疏模型
简单来说,稀疏模型跟非连续模型一样,都是将一块连续内存当成一个整体,将整个不连续物理内存,分割一块一块的连续内存块。但不同是,非连续模型只是单纯对这块内存进行标记,并不进行维护,当热插拔出现之后,会使得原本连续的内存块变得不连续。而稀疏模型的块管理结构,就是可以对热插拔引起空洞,进行维护。如图下所示:
总结
本文只对,三种内存模型,根据自己的理解做了大概的区分,其具体的实现,远比我说的复杂…,大家当作参考就好,本文的图片来自参考文献第一篇