陷阱指令:为什么必须以原子方式更改程序计数器和处理器状态寄存器?

时间:2018-05-07 00:11:58

标签: kernel-mode program-counter status-register

我在操作系统类的上一次考试中遇到了以下问题。

考虑一种体系结构,其中TRAP指令有两个作用:加载预定义的处理器状态寄存器(PCR)值,该值包含用户/内核模式位,将程序计数器(PC)的值保存到特殊保存PC寄存器并将预定义值加载到PC中。解释为什么加载PCR的新值而不在相同的指令周期中更改PC将是不安全的。

我知道PCR将被设置为内核模式,关闭内存管理。它是不安全的,因为PC仍在用户程序中?如果是这样,哪里出错了?如果不是为什么不安全?为什么首先改变PC也不安全?

1 个答案:

答案 0 :(得分:0)

此外:没有理由假定通过加载新的处理器状态将“内存管理”关闭。实际上,以我的经验在CPU中是不会发生的。但这与这个答案无关。

我们正在用户模式下执行,并且已提取TRAP指令。然后,程序计数器(例如)指向TRAP之后的指令。

现在,处理器执行TRAP。它加载新的处理器状态,从而将CPU切换到内核模式。假设这本身并不能阻止设备中断。

现在...设备中断。硬件或软件机制保存处理器状态(=内核模式)和程序计数器(= TRAP之后指令的用户模式地址)。设备中断服务程序执行其任务,并执行从中断返回的操作以恢复程序计数器和处理器状态。我们无法继续执行“ TRAP指令的一半”-唯一可能发生的事情是,我们开始执行PC指向的指令,即,我们在TRAP之后但以内核模式执行该指令。

确切的问题取决于系统架构:

如果内核地址映射是用户地址映射的超集(通常在用户空间为总地址空间一半的OS上),那么我们将在内核模式下执行用户提供的代码,这至少具有严重的特权问题,如果无法处理,可能会由于页面错误而导致我们失败。

如果内核地址映射不包括用户空间(通常在虚拟地址大小受限的系统中就是这种情况),那么这等效于将狂跳转移到内核中。

摘要是,您需要处理器状态和程序计数器来定义“执行位置”,并且它们都需要一起保存/更新;或换句话说,不允许在中间进行控制更改(例如中断)。