当我检查pagetypeinfo
时cat / proc / pagetypeinfo
我看到三种类型的记忆区域;
Linux如何选择内存区域来分配新页面?
答案 0 :(得分:3)
这些存储区仅为32位系统定义,而不是在64位中定义。
记住这些是我们正在谈论的内核可访问main memory
。在32 bit
(4GB)系统中,内核和用户空间之间的分割是1:3
。意思是内核可以访问1GB,用户空间可以访问3GB。内核的1GB拆分如下:
Zone_DMA(0-16MB): 永久映射到内核地址空间。
出于兼容性原因,较旧的ISA设备只能处理较低的16MB主内存。
Zone_Normal(16MB-896MB): 永久映射到内核地址空间。
许多内核操作只能使用ZONE_NORMAL
进行,因此它是性能最关键的区域,并且是内核主要分配的内存。
ZONE_HIGH_MEM(896MB-above): 未永久映射到内核的地址空间。
内核可以访问整个4GB主内存。内核的1GB到Zone_DMA
& Zone_Normal
和用户的3GB到ZONE_HIGH_MEM
。使用英特尔的Physical Address Extension (PAE)
,可以获得4个额外的位来寻址主存,从而产生36位,总共可以访问64GB的内存。增量地址空间(36位地址 - 32位地址)是ZONE_HIGH_MEM
用于映射到用户访问的主存储器(即2GB - 4GB之间)的地方。
了解更多:
http://www.quora.com/Linux-Kernel/Why-is-there-ZONE_HIGHMEM-in-the-x86-32-Linux-kernel-but-not-in-the-x86-64-kernel
http://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory
Linux 3/1 virtual address split
答案 1 :(得分:0)
对于每个内存分配请求(例如通过kmalloc),基于传递给函数的标志,内核选择内存区域。这些请求在内部触发内核函数alloc_pages()。
zonelist是一个传递给alloc_pages()的参数 指向zonelist数据结构,按优先顺序描述mem- 适合内存分配的ory区域。
参考“了解Linux内核”一书中的内存管理章节