大空间分配:页分配器
小于页的分配:slab(伙伴系统)
LInux的内存分区:Linux支持多个内存节点,一个节点用node表示,节点的内存空间分为:DMA ,DMA32,ZONE_NORMAL,ZONE_HIGHMEM,ZONE_MOVABLE,ZONE_DEVICE这几个区域
DMA区域:因为ISA总线的直接内存存取(DMA)处理器有一个严格的限制:他们只能针对RAM的前16M寻址,在具有大容量的现代32位计算机中,CPU不能直接访问所有的物理内存,因为线性地址空间太小
所以DMA区域就是内存的0-16M的空间
DMA32区域:适用于64位系统,如果纪要支持只能直接访问16M以下内存的设备,又要支持只能直接访问4GB以下内存的32位设备,那么必须使用DMA32区域
ZONE_NORMAL:直接映射到内核虚拟地址空间的内存区域,直译为“普通区域”,意译为“直接映射区域”或“线性映射区域”。内核虚拟地址和物理地址是线性映射的关系,即虚拟地址 =(物理地址 + 常量)。
是否需要使用页表映射?不同处理器的实现不同,例如ARM处理器需要使用页表映射,而MIPS处理器不需要使用页表映射
ZONE_HIGHMEM:这是32位时代的产物,内核和用户地址空间按1 : 3划分,内核地址空间只有1GB,不能把1GB以上的内存直接映射到内核地址空间,把不能直接映射的内存划分到高端内存区域。
通常把DMA区域、DMA32区域和普通区域统称为低端内存区域。64位系统的内核虚拟地址空间非常大,不再需要高端内存区域
这是ARM架构的区域:
x86的内存区域为
ZONE_DMA 0~15MB
ZONE_NORMAL 16MB~895MB
ZONE_HIGHMEM 896MB~物理内存结束
对于高端内存:896M-1024M这一段作为内核空间,需要通过映射到1G-4G这一段物理空间来达到访问大于1G地址内存的目的
而对于64位系统,因为可以线性映射的区域达到了512G,是完全可以不用高端内存的,
之前一直有个问题:32位的内核和用户地址空间按1:3划分,内核地址空间只有1G,不能映射1G以上的内存,那么内核地址空间为什么要映射1G以上的内存呢,其实这里需要映射1G以上的内存,是因为内存的管理是需要交给内核的,他需要管理,那么他就需要维护映射关系,比如分配和回收,页表也是管理的一种方式。