在 x86 中断处理程序中使用什么页面目录?
What page directory is used during an x86 interrupt handler?
我目前正在编写一个使用分页和多任务处理的小型操作系统,因此是 运行 用户模式应用程序。分页已经工作得很好。
但是有一件事我还不明白:假设我的 OS 正在用户模式下执行并且发生中断。 处理器是在该用户的虚拟地址内处理该中断处理程序 space 还是中断处理程序使用物理寻址? 或者我是否必须主动切换到内核页面目录?
处理器如何知道切换到哪里?
中断不会更改页面 tables。 x86 页面 table 格式在每个页面目录条目 (https://wiki.osdev.org/Paging#Page_Directory) 中都有一个 U/S (user/supervisor) 位。仅限主管的映射仅适用于环 0,不适用于环 3。即它是仅限内核的映射,节省了在每次中断或系统调用时更改页面 tables 的开销。
(Meltdown 是一种硬件漏洞,可在最新的 Intel CPUs 上击败它,因此操作系统当前必须避免在 user-space 处于 运行ning 时保留内核内存映射,如果他们在易受攻击的 CPU. http://blog.stuffedcow.net/2018/05/meltdown-microarchitecture/)
上启动
因此内核可以保留每个进程的部分虚拟地址space供自己使用。例如 Linux 保留虚拟地址 space 的高半部分供内核使用。有关当前 x86-64 布局,请参阅 https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt。
出于显而易见的原因,这种设计被称为 "high half" 内核。
对于 32 位 x86,Linux 可以使用 3:1 拆分 3GiB 的用户-space 虚拟地址 space 并且只有 1 个用于内核。这意味着即使在 2GiB 机器上,内核通常也无法映射所有物理内存,这很糟糕。 (64 位内核绝对是一个好主意,即使你出于某种原因想要 运行 32 位用户space。)
我目前正在编写一个使用分页和多任务处理的小型操作系统,因此是 运行 用户模式应用程序。分页已经工作得很好。
但是有一件事我还不明白:假设我的 OS 正在用户模式下执行并且发生中断。 处理器是在该用户的虚拟地址内处理该中断处理程序 space 还是中断处理程序使用物理寻址? 或者我是否必须主动切换到内核页面目录?
处理器如何知道切换到哪里?
中断不会更改页面 tables。 x86 页面 table 格式在每个页面目录条目 (https://wiki.osdev.org/Paging#Page_Directory) 中都有一个 U/S (user/supervisor) 位。仅限主管的映射仅适用于环 0,不适用于环 3。即它是仅限内核的映射,节省了在每次中断或系统调用时更改页面 tables 的开销。
(Meltdown 是一种硬件漏洞,可在最新的 Intel CPUs 上击败它,因此操作系统当前必须避免在 user-space 处于 运行ning 时保留内核内存映射,如果他们在易受攻击的 CPU. http://blog.stuffedcow.net/2018/05/meltdown-microarchitecture/)
上启动因此内核可以保留每个进程的部分虚拟地址space供自己使用。例如 Linux 保留虚拟地址 space 的高半部分供内核使用。有关当前 x86-64 布局,请参阅 https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt。
出于显而易见的原因,这种设计被称为 "high half" 内核。
对于 32 位 x86,Linux 可以使用 3:1 拆分 3GiB 的用户-space 虚拟地址 space 并且只有 1 个用于内核。这意味着即使在 2GiB 机器上,内核通常也无法映射所有物理内存,这很糟糕。 (64 位内核绝对是一个好主意,即使你出于某种原因想要 运行 32 位用户space。)