[英]How Linux kernel decide to which memory zone to use?
当我检查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以上): 没有永久映射到内核的地址空间。
内核可以访问整个4GB主内存。 分别通过Zone_DMA
和Zone_Normal
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数据结构,该数据结构按优先顺序描述适合于内存分配的内存区域。
请参阅《了解Linux内核》一书中的内存管理一章。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.