Linux Highmem的使用

http://blog.csdn.net/kickxxx/article/details/8595189


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存在的意义吧。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值