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 x86 标签 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 模式。)
当 运行 现代 x86 处理器上的引导加载程序时,处理器将 运行 处于实地址模式。它的指令流水线功能是否会在实模式下激活?
是的,现代微体系结构中的无序核心在任何模式下的运行基本相同。大部分区别在于解码器。有关现代 CPU 实际上如何在内部工作的详细信息,请参阅 Agner Fog's microarch pdf and other links in the x86 标签 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 模式。