当我检查 pagetypeinfo
猫 /proc/pagetypeinfo
我看到三种类型的记忆区;
- DMA
- DMA32
- 普通的
Linux如何选择一个内存区域来分配一个新的页面?
当我检查 pagetypeinfo
猫 /proc/pagetypeinfo
我看到三种类型的记忆区;
Linux如何选择一个内存区域来分配一个新的页面?
这些内存区域仅针对 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 虚拟地址拆分
对于每个内存分配请求(例如通过 kmalloc),内核根据传递给函数的标志选择内存区域。这些请求在内部触发内核函数 alloc_pages()。
zonelist 是传递给 alloc_pages() 的参数,它指向 zonelist 数据结构,按优先顺序描述适合内存分配的内存区域。
请参阅《Understanding the Linux kernel》一书中的内存管理章节