|
|
Linux内核建立页表时,最多就建立了从PAGE_OFFSET(第3GB开始到4GB结束)的1G线性地址的映射供内核使用。
那么Linux是如何使用大于1GB的物理内存的呢?
答案是:通过物理内存区域。内核为了支持这种需求,特地的为每个cpu创建了不同的内存区域。有ZONE_DMA (0-16 MB),ZONE_NORMAL (16-896 MB)和ZONE_HIGHMEM (896 MB and higher)。内核通过每个区域的struct mem_map来创建所有物理页的信息。
如果一个应用程序进行了系统调用,请求分配内存,如果不是DMA的请求,如果ZONE_NORMAL的物理页表已经用尽。那么内核会通过kmap()自动去找ZONE_HIGHMEM区域把这个页面临时映射到内核所能管理的从3G到4G的虚拟地址空间中。但是kmap的映射是临时性的,并且有时会不可用。所以内核对大内存的支持还称不得上完美。
如果要使用内存区域的特性,必须要在编译内核时加上HIGHMEM_CONFIG选项。 |
|