我在操作系统课上的一次考试中遇到了以下问题。
考虑一个架构,其中 TRAP 指令有两个效果:加载包含用户/内核模式位的处理器状态寄存器 (PCR) 的预定义值,将程序计数器 (PC) 的值保存到特殊的 Save PC注册并将预定义的值加载到 PC 中。解释为什么在同一指令周期内不改变 PC 就为 PCR 加载一个新值是不安全的。
我知道 PCR 将设置为内核模式,内存管理关闭。是否因为 PC 仍在用户程序中而不安全?如果是这样,哪里会出错?如果不是,为什么不安全?为什么先换电脑也不安全?
我在操作系统课上的一次考试中遇到了以下问题。
考虑一个架构,其中 TRAP 指令有两个效果:加载包含用户/内核模式位的处理器状态寄存器 (PCR) 的预定义值,将程序计数器 (PC) 的值保存到特殊的 Save PC注册并将预定义的值加载到 PC 中。解释为什么在同一指令周期内不改变 PC 就为 PCR 加载一个新值是不安全的。
我知道 PCR 将设置为内核模式,内存管理关闭。是否因为 PC 仍在用户程序中而不安全?如果是这样,哪里会出错?如果不是,为什么不安全?为什么先换电脑也不安全?
另外:没有理由假设“内存管理”通过加载新的处理器状态被“关闭”;事实上,根据我的经验,在 CPU 中不会发生这种情况。但这与这个答案无关。
我们在用户模式下执行并且获取了一条 TRAP 指令。然后(假设)程序计数器指向 TRAP 之后的指令。
现在处理器执行 TRAP。它加载新的处理器状态,将 CPU 切换到内核模式。假设这本身并不禁止设备中断。
现在...设备中断。硬件或软件机制保存处理器状态(=内核模式)和程序计数器(=TRAP之后指令的用户模式地址)。设备中断服务例程完成它的工作并执行中断返回以恢复程序计数器和处理器状态。我们不能恢复“TRAP 指令的中途”——唯一可能发生的事情是我们开始执行 PC 指向的指令,即我们在 TRAP 之后但在内核模式下执行指令。
确切的问题取决于系统架构:
如果内核地址映射是用户地址映射的超集(通常在用户空间占总地址空间一半的操作系统上),那么我们正在内核模式下执行用户提供的代码,这至少是一个严重的特权问题,并且当我们无法处理它时,可能会导致我们因页面错误而失败。
如果内核地址映射不包括用户空间(在虚拟地址大小有限的系统上通常是这种情况),那么这相当于疯狂跳转到内核。
总结是你需要处理器状态和程序计数器来定义“你在哪里执行”,它们都需要一起保存/更新;或者换句话说,在中间不允许改变控制(例如中断)。