【问题标题】:What page directory is used during an x86 interrupt handler?在 x86 中断处理程序期间使用什么页面目录?
【发布时间】:2019-05-01 09:56:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: x86 operating-system paging virtual-memory osdev


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 正是我想要的。谢谢!
    猜你喜欢
    • 2012-03-05
    • 2013-11-21
    • 2015-03-02
    • 1970-01-01
    • 2019-08-02
    • 2015-12-25
    • 2017-10-16
    • 2020-12-09
    • 2016-03-26
    相关资源
    最近更新 更多