谁决定对哪些指令保密?是硬件制造商还是 OS 开发商

Who decides which instructions are to be kept privileged? Is it the hardware manufacturer or the OS developers

我读到我们的系统中有一些特权指令可以在内核模式下执行。但我无法理解是谁让这些指令享有特权。是硬件制造商在模式位的帮助下将一些有害指令硬连线为特权,还是 OS 设计者使指令具有特权,使它们仅在特权模式下工作。

内核与用户模式,以及哪些指令在用户模式下是不允许的,是 ISA 的一部分。这已融入硬件。

CPU 架构师通常非常清楚 OSes 需要做什么并希望阻止用户-space 做什么,所以这些选择至少会产生特权级别可能,即让 user-space 无法简单地接管机器。


但这还不是全貌:在某些 ISA 上,例如 x86,后来的 ISA 扩展添加了控制寄存器标志位,让 OS 选择其他一些指令是否具有特权。在 x86 上,针对可能泄露有关 kernel ASLR 信息或使定时边信道更容易的指令完成了这项工作。

例如,如果内核特别启用,rdpmc(读取性能监视器计数器)只能从 user-space 使用。 rdtsc (Read TimeStamp Counter) 可以默认从 user-space 读取,但是 CR4 中的 TSD (TimeStamp Disable) 标志可以限制其使用到 priv 级别 0(内核模式)。阻止用户-space 使用高分辨率计时是防御计时边信道攻击的一种蛮力方法。

另一个 x86 扩展防止内核地址泄漏,使内核 ASLR 更加保密; CR4.UMIP(用户模式指令预防)禁用像 sgdt 这样读取 GDT 虚拟地址的指令。 这些指令首先对 user-space 基本上没用,而且不像 rdtsc easily 总是有特权。

启用此扩展的 Linux 内核选项 describes it:

The User Mode Instruction Prevention (UMIP) is a security feature in newer Intel processors. If enabled, a general protection fault is issued if the SGDT, SLDT, SIDT, SMSW or STR instructions are executed in user mode. These instructions unnecessarily expose information about the hardware state.

The vast majority of applications do not use these instructions. For the very few that do, software emulation is provided in specific cases in protected and virtual-8086 modes. Emulated results are dummy.

为IDT/GDT/LDT设置新地址(如lgdt/lidt)当然是特权指令;那些让你接管机器。但是在内核 ASLR 成为现实之前,没有任何理由阻止 user-space 读取地址。它可能位于将其 page-table 条目设置为仅内核的页面中,以防止 user-space 对该地址执行任何操作。 (...直到 Meltdown 使 user-space 可以使用推测性侧通道从缓存中热的仅内核页面读取数据。)