扩展 (4MB) 和常规 (4KB) 分页如何共存?

tel*_*enn 6 memory virtual-memory linux-kernel

在 x86 架构上,“扩展分页”允许页框(物理内存)为 4 MB 而不是 4 KB。

“Understanding the Linux Kernel, 3rd”一书第2章“Memory Addressing”,子章“Paging in Linux”,“Kernel Page Tables”部分,解释了当RAM大小小于896 MB时的最终内核页表:

[...] 内核可以通过使用大页来寻址 RAM(参见本章前面的“扩展分页”部分)。

但是,在“扩展分页”部分(“硬件分页”子章节)中,它是这样写的:

扩展分页与常规分页共存。

我实际上不知道扩展和常规分页是如何共存的。请有人解释这些问题:

  • 在哪些情况下内核使用 4 MB 页面?或 4 KB 页面?
  • kmalloc 操作将使用哪种页框大小?对于 vmalloc?
  • 如果我们假设初始代码和数据(内核段、临时页表和 128 KB 用于动态数据)适合前 8 MB 的 RAM(如书中给出的示例),如果实际代码量和数据只有 5MB:内核会浪费 8 - 5 = 3 MB 吗?

小智 2

1. 内核在什么情况下使用 4 MB 页?或者 4 KB 页面?

应用程序可以申请大页,内核不会确定页大小,除非将PAGE_SIZE编译到内核源代码中。使用 mmap 标志可以确定应用程序源代码中的页面大小。

2. kmalloc 操作将使用哪个页框大小?对于vmalloc?

kmalloc使用Linux内核中的默认页大小,即内核中的PAGE_SIZE,它是编译或运行时确定的。vmalloc 也一样。

3. 如果我们假设初始代码和数据(内核的段、临时页表和 128 KB 的动态数据)适合前 8 MB RAM(如本书给出的示例),那么如果实际的数量会怎样呢?代码和数据只有 5MB:内核会浪费 8 - 5 = 3 MB 吗?

浪费内存的大小由PAGE_SIZE和数据决定,如果页面大小为4MB,数据为5MB,则浪费的内存大小将为(PAGE_SIZE*N) - 5MB= 3MB。