首页 > 解决方案 > 在 x86 中断处理程序期间使用什么页面目录?

问题描述

我目前正在编写一个使用分页和多任务处理的小型操作系统,因此正在运行用户模式应用程序。分页已经工作得非常好。

但是有一件事我还不明白:假设我的操作系统正在用户模式下执行并且发生了中断。处理器是否在该用户的虚拟地址空间内处理该中断处理程序,或者中断处理程序是否使用物理寻址?还是我必须主动切换到内核页面目录?

处理器如何知道在哪里切换?

标签: x86operating-systempagingvirtual-memoryosdev

解决方案


中断不会改变页表。x86 页表格式在每个页面目录条目 ( https://wiki.osdev.org/Paging#Page_Directory )中都有一个 U/S(用户/主管)位。仅主管映射仅适用于环 0,不适用于环 3。即,它是仅内核映射,节省了每次中断或系统调用时更改页表的开销。

(Meltdown 是一种硬件漏洞,可以在最新的 Intel CPU 上击败它,因此操作系统当前必须避免在用户空间运行时保留内核内存映射,如果它们在易受攻击的 CPU 上启动 。http://blog.stuffedcow.net/ 2018/05/meltdown-微架构/ )

因此内核可以保留每个进程的部分虚拟地址空间供自己使用。例如,Linux 保留虚拟地址空间的高半部分供内核使用。有关当前 x86-64 布局,请参阅https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt

出于显而易见的原因,这种设计被称为“高半”内核。

对于 32 位 x86,Linux 可以使用 3:1 的拆分与 3GiB 的用户空间虚拟地址空间,并且只有 1 个用于内核。这意味着即使在 2GiB 机器上,内核通常也无法映射所有物理内存,这很糟糕。(即使您出于某种原因想要运行 32 位用户空间,64 位内核绝对是一个好主意。)


推荐阅读