所有进程的虚拟地址空间在它们的“内核”部分是否具有相同的内容?

Tim*_*Tim 9 linux virtual-memory linux-kernel

Linux 编程接口显示了进程的虚拟地址空间的布局:

在此处输入图片说明

物理内存中的内核是否完全部分映射到每个进程的虚拟地址空间中从0xC0000000到0XFFFFFFFF顶部的“内核”部分?

如果部分,物理内存中内核的哪一部分映射到每个进程的虚拟地址空间中的“内核”部分,哪一部分不是?

进程的虚拟地址空间中的“内核”部分是否准确地存储了进程在内核模式下运行时可以访问的内核代码部分,而不是内核代码中不可访问的部分?

所有进程的虚拟地址空间在它们的“内核”部分是否具有相同的内容?

Ste*_*itt 8

答案取决于是否启用了内核页表隔离(这取决于体系结构以及它是否支持 KPTI)。

如果没有 KPTI,内核会在每个进程的地址空间中完全映射,但如图中所述,用户空间无法访问这些映射(除非存在侧信道泄漏)。

使用 KPTI,内核页表与用户空间页表是分开的,并且每个进程的地址空间中只剩下最小的一组映射,这是允许用户空间调用内核的需要,并使处理器能够给出处理中断或异常时由内核控制。

在这两种情况下,所有进程都具有相同的内核映射。

另请参阅LWN 关于 KAISER 的文章