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(参见本章前面的“扩展分页”部分)。
但是,在“扩展分页”部分(“硬件分页”子章节)中,它是这样写的:
扩展分页与常规分页共存。
我实际上不知道扩展和常规分页是如何共存的。请有人解释这些问题:
小智 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。