由于硬件的限制,kernel很难将所有的pages同等看待。对于一些pages,因为它们的物理地址在内存中,导致并不能被应用于一些特定的任务。由于这些限制,kernel将pages分到了不同的zone中。kernel会判断pages的属性,将具有相似属性的pages分到同一个zone。还需注意的是,Linux还需要解决硬件关于内存地址两个问题:
- 有些硬件设备只能使用DMA(direct memory access)访问到特定的内存地址。
- 有一些结构物理地址可以访问到的内存比虚拟地址要多。
也由于这些限制,Linux分为了三个zone:
- ZONE_DMA(0-16 MB): 包含 ISA/PCI 设备需要的低端物理内存区域中的内存范围,这块区域由标准工业架构(Industry Standard Architecture)设备使用,适合DMA内存。这部分区域大小和CPU架构有关,在x86架构中,该部分区域大小限制为16MB。。
- ZONE_NORMAL(16-896 MB):由内核直接映射到高端范围的物理内存的内存范围。所有的内核操作都只能使用这个内存区域来进行,因此这是对性能至关重要的区域。
- ZONE_HIGHMEM(896 MB 以及更高的内存):系统中内核不能映射到的其他可用内存。
x86的物理地址空间布局: