ZONE_DMA32

Linux系统通常将主内存划分为三个区域。大多数内存分配到ZONE_NORMAL区域 。 在低端,有16MB的内存被分区到DMA区域ZONE_DMA中,该内存被保留用于特定需要的情况。DMA内存最常见的用户是较旧的外设,它只能寻址24位内存。在高端,ZONE_HIGHMEM包含内核无法直接寻址的所有内存。

并非所有系统都实现所有这些区域。一些较新的体系结构不支持古老的外围设备,而忽略了区域 ZONE_DMA。
一般来说,64位系统没有寻址问题,也不需要ZONE_HIGHMEM。
IA64体系结构决定了ZONE_DMA的另一种实现方式,将其定义为覆盖4GB以下的所有内存。

事实证明,4GB区域有很多用途。相当多的设备在访问不能用32位寻址的内存时遇到问题。这些设备的驱动程序已经被强制使用ZONE_DMA、I/O存储器管理单元(在有ZONE_DMA的系统上)或缓冲区。这些解决方案都不是理想的:ZONE_DMA是一个小而稀缺的资源,IOMMU空间也可能稀缺,反弹缓冲区也很慢。如果在4GB边界下可靠地分配DMA内存,所有这些问题都可以避免。

在64位Linux操作系统上,分区如下:
最开始的16M内存是DMA ZONE 内存,用slab分配器的kmalloc分配获取。
DMA32 ZONE为16M~4G,高于4G的内存为Normal ZONE。

你可能感兴趣的:(Linux)