【问题标题】:Is the change between kernel/user mode done by hardware or software?内核/用户模式之间的转换是由硬件还是软件完成的?
【发布时间】:2012-03-18 09:44:22
【问题描述】:
我只是想知道操作系统中内核模式和用户模式之间的切换是由硬件还是操作系统本身完成的。
我知道当用户进程想要进入内核模式时,它可以进行系统调用并执行一些内核代码。当进行系统调用时,进程进入内核模式,现在所有内存都可以访问,等等。为了实现这一点,我假设中断处理程序需要切换或更改页表。这是真的?如果不是,CPU怎么知道它是在内核模式下运行并且在访问受限(用户进程无法访问)内存时不需要分页错误?
谢谢!
【问题讨论】:
标签:
operating-system
paging
kernel
【解决方案1】:
这是一个宽泛的问题——每个硬件平台做的事情都会略有不同,但我认为基本的答案是它是通过利用硬件设施进行内存保护等的软件完成的。
【解决方案2】:
当用户进程想要进行系统调用时,它会执行一条特殊的 CPU 指令,CPU 从虚拟模式(对于用户进程,具有特定于进程的页表)切换到实模式(对于内核)并跳转到操作系统系统调用处理程序。然后内核就可以为所欲为。
需要 CPU 支持。 CPU 会跟踪它所处的模式、页表所在的位置、跳转指令指针等。它由执行系统调用的用户软件触发,并且依赖于内核为它尝试执行的任何操作提供支持做。与所有计算一样,它始终是硬件和软件。但是,我不能仅使用软件来完成,因为这样就无法阻止进行系统调用的进程滥用它获得的特权,例如它可以开始读取 /etc/shadow。
现代 x86 计算机有一条专门用于执行系统调用的指令。早期的 x86 处理器和一些当前的 RISC 处理器具有触发中断的指令。旧的架构有其他的切换控制方式。
【解决方案3】:
最后一个答案其实不是真的......
更改为内核模式不会通过“实模式”。实际上在完成启动过程后,计算机永远不会回到实模式。
在正常的 x86 系统中,切换到内核模式涉及调用“sysenter”(在某些寄存器中设置参数之后),这会导致跳转一个预定义的地址(保存在 CPU 的 MISR 寄存器中),该地址是在计算机启动时设置的,因为它只能在内核模式下完成(它是一个“特权”命令)。
所以它基本上涉及执行一个软件命令,硬件响应它的设置方式,当它处于内核模式时