前言:第一遍看Linux
源码时,对高端内存的作用耿耿于怀,第二遍再看时,默认将CONFIG_HIGHMEM
选项关闭再看,网上也看了许多文章,对于高端内存的定义无非就是所谓的3G+896MB~4G
,而没有什么通俗易懂的解释。
庞大的Linux
源码,不管是在各种视频讲解中,还是各类书籍中,对它的描述,都是单纯的分出各个模块来讲,而很少或者几乎没有各个模块是怎么相互连接工作的,这一点很难,极其难,要自己去理解,去实践才能得出自己的所谓的理解。
高端内存的模块化理解
默认是4G+
这一块被理解为高端内存
为什么4G+是高端内存,是VA还是PA?
VA
,此处的4G+
指的是虚拟地址
我们知道,在IA-32
架构中,虚拟地址空间按照1:3
划分,内核占据中上1G
,即3G~4G
(注意此处内核是不管0~3G
的进程地址空间的),32
跟地址线,当CPU
分析指令时,虚拟地址空间永远只能按照4G
来取址,而内核占据中上1G
假设内核这1G
虚拟内存都是直接映射物理内存的(在不管进程地址空间的基础上),那么此时映射的最大物理地址范围应当是0~1G
,此处如果物理内存大于1G
怎么办?(虚拟地址空间最大只能是4G
,不能再往上加了)
那么此时高端内存的概念就登场了。将物理内存高于1G
的物理内存全部划分为高端内存,可是具体怎么用呢?
从源码中可知,在内核初始化过程中,初始化了一个伙伴系统(buddy system
)和内存位图和内存页图(struct page
),它们管理着全部的物理内存的分配,当然也包括高端内存
此处就不讨论高端内存的三种映射方式了。当要访问对3G+896MB~4G
的虚拟地址时,即采用临时映射或者页表技术等方式从伙伴系统中获得物理页并建立映射。
总结下来就:虚拟地址空间不变,物理内存可变。
星光不问赶路人,岁月不负有心人,大家加油