在 x86 架构上,“扩展分页”允许页帧(物理内存)为 4 MB,而不是 4 KB。
《Understanding the Linux Kernel, 3rd》一书的第 2 章“内存寻址”、“Linux 中的分页”子章、“内核页表”部分解释了当 RAM 大小小于 896 MB 时,对于最终内核页表:
[...]内核可以通过使用大页面来寻址 RAM(请参阅本章前面的“扩展分页”部分)。
然而,在“扩展分页”部分(“硬件分页”子章)中,写道:
扩展寻呼与常规寻呼共存。
我实际上不明白扩展和常规寻呼如何共存。请有人解释一下这些问题:
- 在什么情况下内核使用 4 MB 页面?或者 4 KB 页面?
- kmalloc 操作将使用哪个页框大小?对于vmalloc?
- 如果我们假设初始代码和数据(内核段、临时页表和 128 KB 的动态数据)适合前 8 MB RAM(如本书给出的示例),那么实际的代码量和数据量会怎样?数据只有 5MB:内核会浪费 8 - 5 = 3 MB 吗?
答案1
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。