Linux 内核空间地址映射 高端内存 总结


内核空间映射到物理内存是从最低地址0x00000000开始,如下图所示


Linux 内核空间地址映射 高端内存 总结



假设内核地址空间的简单线性地址转换关系为:物理地址 = 虚拟地址  0xC0000000,内核虚拟地址空间对应的物理内存范围0x00000000~0x40000000,只有1G,显然不合理。

内核地址空间划分3部分:ZONE_DMA16M)、ZONE_NORMAL16~896M)和ZONE_HIGHMEM896~1024M)。

ZONE_DMAZONE_NORMAL线性映射属于线性映射区,高端内存ZONE_HIGHMEM0xF8000000~0xFFFFFFFF)动态映射属于vmalloc区,高端内存又分为几部分分别采用vmalloc、固定、临时映射(不详述了)。

内核想访问高于896M的物理地址时,从0xF8000000~0xFFFFFFFF虚拟地址空间中取一部分与想要访问的物理内存建立映射即填充内核PTE页表(内核页表),访问完成之后内核释放0xF8000000~0xFFFFFFFF中的虚拟地址空间,以便其它进程访问,如下图。(采用这128M的虚拟空间,建立临时地址映射,完成了对所有高于896M物理内存的访问


Linux 内核空间地址映射 高端内存 总结