我很好奇 x86_64 linux 内核页面的大小是多少。我听说它是 4KB,但其他一些消息来源说它是 2MB。
我也很好奇用户内核页面大小是否可以与内核页面大小不同。 Linux 可以使用 2MB 作为内核页面,4KB 作为用户页面吗?
谢谢
答案1
x86_64 架构上的页面大小(与 i386 或 IA-32 相同,即该架构的 32 位版本)为 4KiB。
您还会看到对 2MiB 的引用,因为这是 x86_64 架构中“大页面”的大小之一,它还允许 1GiB 大页面,在某些情况下 Linux 中也会使用这种大小。 (32 位变体 i386 或 IA-32 有 4MiB 大页面。)
此外,Linux 内核有一个称为“透明大页”的功能,许多现代 Linux 发行版通常默认启用该功能。每当进程分配大量内存时,Linux 内核可能会决定分配 2MiB 对齐的内存块,并设置页表来为进程提供大页。但是,如果系统遇到内存压力并且需要换出一些内存,它仍然能够将其分解为单独的页面,因此它可以换出其中一些并将其他内存保留在内存中。 (在某些情况下,它还能够从包含单页的分配中重新组装透明大页。)
关于内核与用户空间,页表的设置方式存在一些细微差别(安全功能,特别是在 Spectre 和 Meltdown 等最新安全问题之后引入的安全功能,尝试将页表映射与内核和用户空间隔离。)但通常内核和用户空间都会以相同的方式访问相同的内存区域,例如大页面(透明或其他)在内核模式下也将使用大页面映射。