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