3

当我检查 pagetypeinfo

猫 /proc/pagetypeinfo

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

  • DMA
  • DMA32
  • 普通的

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

4

2 回答 2

4

这些内存区域仅针对 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. 使用 Intel 的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 虚拟地址拆分

于 2014-03-06T08:32:04.363 回答
1

对于每个内存分配请求(例如通过 kmalloc),内核根据传递给函数的标志选择内存区域。这些请求在内部触发内核函数 alloc_pages()。

zonelist 是传递给 alloc_pages() 的参数,它指向 zonelist 数据结构,按优先顺序描述适合内存分配的内存区域。

请参阅《Understanding the Linux kernel》一书中的内存管理章节

于 2013-08-06T12:15:46.027 回答