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

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

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

在此输入图像描述

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

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

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

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

答案1

答案取决于是否内核页表隔离已启用(取决于架构以及是否支持 KPTI)。

如果没有 KPTI,内核将完全映射到每个进程的地址空间,但如图所示,这些映射无法从用户空间访问(除非出现侧通道泄漏)。

使用 KPTI,内核页表与用户空间页表分离,并且每个进程的地址空间中只保留最小的映射集,以允许用户空间调用内核,并使处理器能够提供处理中断或异常时将控制权交给内核。

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

也可以看看LWN 关于 KAISER 的文章

相关内容