pipelining/OoOE 在实模式下 运行 时在现代 x86 处理器上可用吗?

Is pipelining/OoOE available on modern x86 processors when running in real mode?

当 运行 现代 x86 处理器上的引导加载程序时,处理器将 运行 处于实地址模式。它的指令流水线功能是否会在实模式下激活?

是的,现代微体系结构中的无序核心在任何模式下的运行基本相同。大部分区别在于解码器。有关现代 CPU 实际上如何在内部工作的详细信息,请参阅 Agner Fog's microarch pdf and other links in the 标签 wiki。

可能需要额外的芯片才能在 16 位模式下表现不同,因为它与禁用分页的 32 位模式非常相似,但具有不同的默认地址大小和操作数大小。

我读到当段具有非零基数时,AMD CPU 会稍微慢一些。 (或者我猜在 16 位模式下:当段寄存器本身设置为非零值时,因为在 16 位模式下它们被直接使用,而不是作为描述符的选择器。)


请记住 many common 16bit idioms like loop are terrible

此外,如果您不小心,部分寄存器减速很容易干扰乱序执行。 Intel P6 系列和 SnB 系列 CPU 分别重命名部分寄存器,因此写入 AX 不会对 EAX/RAX 的全部内容产生虚假依赖。在 SnB 之前的 CPU 上稍后合并时可能会出现停顿,或者只是在 Haswell 之前的 SnB 上出现轻微减速。

所有其他微体系结构将 mov ax, 5 视为 eax 的读取-修改-写入,因此它不会破坏对 ax 旧值的依赖链。如果您不小心,这对于乱序执行可能是一个大问题。

阅读 Agner Fog 的手册以了解更多信息。

我忘记了,16 位寻址模式可能性能不佳。 32 位代码不需要它们很快,而 64 位代码根本不能使用 16 位地址。 (64位代码中address-size前缀表示address-size = 32bits。)


VEX 编码指令(包括 BMI2 整数指令 like pext) aren't available in real mode. This Intel forum topic 表明可能是由于现有软件 (NTVDM) 使用机器代码作为保护模式的陷阱。(即相同的非法操作数 [= VEX 使用的 52=]。因此,使 VEX 编码的指令仍然生成 #UD 对于向后兼容很重要。

SSE 在实模式下仍然可用,但是

(VEX/EVEX are 在 16 位 protected 模式下可用,但不是真实或虚拟 8086 模式。)