x86 - 在 x86 中断处理程序期间使用什么页面目录?
问题描述
我目前正在编写一个使用分页和多任务处理的小型操作系统,因此正在运行用户模式应用程序。分页已经工作得非常好。
但是有一件事我还不明白:假设我的操作系统正在用户模式下执行并且发生了中断。处理器是否在该用户的虚拟地址空间内处理该中断处理程序,或者中断处理程序是否使用物理寻址?还是我必须主动切换到内核页面目录?
处理器如何知道在哪里切换?
解决方案
中断不会改变页表。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 位内核绝对是一个好主意。)
推荐阅读
- android - 如何在 Kotlin 中使用 ViewPager2 和选项卡?
- android - 如何从 API 显示数据以颤振多选表单字段
- java - GUI 内的缓冲图像
- react-native - 准备就绪时从导航器/父组件导航
- javascript - Salesforce-JS 路径显示为空
- c++ - 我如何在 C++ 中使用带有 mbed 的附加函数
- string - 无法将 Unicode16 数据的字节数组转换为字符数组
- python - python gspread 舍入大数
- javascript - Typescript - 键到类型和值的类型安全映射
- mysql - MYSQL如何从String中获取最后第二个单词