您的位置:首页 > 运维架构 > Linux

Linux Highmem的使用

2013-02-20 17:19 1091 查看
Linux kernel zone有如下类型:ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM。

每一种zone类型适合不同的使用类型:

ZONE_DMA是低端物理内存范围适合于ISA设备的请求,ZONE_DMA的物理页框映射到kernel线性地址空间。

ZONE_NORMAL则被直接映射到kernel线性地址空间,常见的内核操作都发生在ZONE_NORMAL。

ZONE_HIGHMEM则是剩余的可用内存,内核不会对这部分内存做直接映射。

由于内核地址空间有限,不会对HIGHMEM做直接地址映射,因此内核是无法直接操作HIGHMEM空间内的页框。但是内核可以通过以下方式把HIGHMEM映射到kernel地址空间:

1. 使用pkmap临时映射

2. fixmap固定地址映射

3. vmalloc 分配非连续内存区

此外进程可以把Highmem映射到进程的用户地址空间。

使用pkmap做临时映射

内核在fixmap 线性地址前保留了一个2M/4M的线性地址空间,通过pkmap把高端内存临时映射到这个空间,pkmap是一段很小的地址空间:只有2M或者4M。

使用fixmap映射做固定地址映射

Fixmaps是内核预留的一块虚拟地址空间,可以映射到任意的物理内存,因此我们可以认为fixmap也会使用到highmem,fixmaps地址空间也非常有限,典型的地址范围为0xFFC00000~0xFFFFF000。

kernel 分配非连续内存区

vmalloc会优先使用HIGHMEM zone来分配页框,只有从HIGHMEM zone分配失败,才会从Normal zone分配。

用户空间映射

虽然内核地址空间有限,但是每个进程的用户地址空间都可以达到3G,Highmem的页框可以不受限制的映射到用户线性地址空间。当访问用户地址空间地址发生缺页异常时,内核的page allocator会优先从highmem zone分配页面,只有当highmem zone没有足够的空闲页面时,才会选择Normal或者DMA zone进行分配。

因此highmem内存的主要使用者是应用进程的页面映射,内核kernel通过pkmap fixmap方式,同时使用的Highmem内存,理论上最多2MB/4MB + 3.xMB;由于Highmem的存在,使得应用地址空间缺页异常处理,文件映射,堆分配等操作优先使用highmem zone的内存,减轻了Normal zone的分配压力,某种程度上避免了Normal区的碎片化。我们甚至可以禁止用户空间地址的HIGH_MEM分配使用Normal zone和 DMA zone,使得Normal DMA只用于内核地址空间内存的分配,尽量减少碎片化,避免内存分配失败。我想这就是HighMem存在的意义吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: