关于Linux 中high memory,网上已经有好多人讲解,在这里把我收集到的资料归纳总结一下,同时加入一些自己的理解,如有不正确之处欢迎指正。
一: 为什么需要high memory
32位的CPU,最大寻址范围2^32-1, 也就是虚拟内存空间的范围为0~4G。 Linux一般吧0~3G划分为用户地址空间,3G到4G为内核地址空间。
图1: 用户和内核地址空间分布
最高的1GB虚拟空间由所有进程和内核共享,因此内核最多寻址1G的虚拟地址空间。如果物理内存超过1G,内核该如何映射呢?
Linux采取的策略内核空间的前“896M”(注:896M是一个笼统的概念,详细参照第二节)采用固定映射(也可以称为静态映射,直接映射),这部分页表是固定的,虚拟地址 - PAGE_OFFSET = 物理地址(PAGE_OFFSET 一般为3G,0xC0000000),这部分的映射是系统刚刚初始化的时候就建立的,这段物理内存被称为Low Memory。而虚拟地址空间的后“128M”,也就是3G+“896M” ~ 4G-1部分采用动态映射。这样如果物理内存