【问题标题】:How Linux kernel decide to which memory zone to use?Linux内核如何决定使用哪个内存区域?
【发布时间】:2013-08-05 14:53:11
【问题描述】:

当我检查页面类型信息时

cat /proc/pagetypeinfo

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

  • DMA
  • DMA32
  • 正常

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

【问题讨论】:

标签: linux memory memory-management linux-kernel


【解决方案1】:

这些内存区域仅针对 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 主内存。内核的 1GB 到 Zone_DMAZone_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 virtual address split

【讨论】:

  • 这不太准确 - DMA32 区域存在于 x86-64 架构上,这里解释了它的介绍:lwn.net/Articles/152337 - 基本上,它相当于 DMA,用于需要它的驱动程序。其他内核内存使用将以正常模式结束,但如果没有足够的空间,将进入 DMA32(例如,如果只有 3GB,大部分可能在 DMA32 区域,所以它必须使用它)。
  • 是的,GreenReaper,我也注意到了。
  • @brokenfoot 但是在 x64 平台上,我仍然可以看到这些区域:“zone_DMA”、“zone_DMA32”和“zone_normal”。所以也许它不仅仅在 x32 平台上。
【解决方案2】:

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

zonelist 是传递给 alloc_pages() 的参数,即 指向一个 zonelist 数据结构,按优先顺序描述 mem- 适合内存分配的ory zone。

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

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多