我目前正在编写一个使用分页和多任务处理的小型操作系统,因此正在运行用户模式应用程序。分页已经可以正常工作了。
但是我还不了解一件事:假设我的OS在用户模式下执行并且发生了中断。 处理器是在用户的虚拟地址空间中处理该中断处理程序,还是使用物理寻址?还是我必须主动切换到内核页面目录?
处理器如何知道在哪里切换?
答案 0 :(得分:3)
中断不会更改页表。 x86页表格式在每个页目录条目(https://wiki.osdev.org/Paging#Page_Directory)中都有一个U / S(用户/主管)位。仅限管理员的映射仅在环0上起作用,而不在环3上起作用。即,它是仅内核的映射,节省了在每次中断或系统调用时更改页表的开销。
(Meltdown是一种硬件攻击,可以在最新的Intel CPU上击败它,因此,如果OS在易受攻击的CPU上引导,则OS当前必须避免在用户空间运行时保留内核内存的映射。)< / p>
因此内核可以保留每个进程的虚拟地址空间的一部分以供自己使用。例如,Linux保留虚拟地址空间的上半部分供内核使用。有关当前的x86-64布局,请参见http://blog.stuffedcow.net/2018/05/meltdown-microarchitecture/。
出于明显的原因,这种设计被称为“上半部”内核。
对于32位x86,Linux可以使用3:1拆分和3GiB用户空间虚拟地址空间,而内核仅使用1。这意味着即使在2GiB计算机上,内核通常也无法映射所有物理内存,这很糟糕。 (即使出于某种原因要运行32位用户空间,64位内核绝对是个好主意。)