linux内存管理之zone

由于硬件的限制,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的物理地址空间布局:

linux内存管理之zone_第1张图片

这些zone是在“linux/mmzone.h”中被定义的,每个zone都用struct zone来表示:

linux内存管理之zone_第2张图片

zone的结构虽然很大,但是由于系统中只有三个zone,因此也只有三个这种结构。在这个结构中有几个属性是比较重要的:

  • lock属性是一个自旋锁,用来在并行存取时保存这个结构。需要注意的是它保护的只是这个结构,而不是在这个zone中所放置的所有pages。不会存在某个特定的锁只保护某些个别的pages,尽管部分kernel可能会碰巧锁住位于上述pages中的数据。
  • free_pages属性是在这个zone中free pages的数目。通过置换,kernel会尽可能保持至少pages_min个free pages。
  • name属性是一个空结尾字符串,用来表示这个zone的名称。kernel在调用”mm/page_alloc.c”时会初始化name值,这三个zone的name分别为”DMA”, “Normal”和”HighMem”。

你可能感兴趣的:(操作系统)