Linux内核如何决定使用哪个内存区域?

时间:2013-08-05 14:53:11

标签: linux memory memory-management linux-kernel

当我检查pagetypeinfo

  

cat / proc / pagetypeinfo

我看到三种类型的记忆区域;

  • DMA
  • DMA32
  • 正常

Linux如何选择内存区域来分配新页面?

2 个答案:

答案 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内核”一书中的内存管理章节