【发布时间】:2016-06-15 07:41:19
【问题描述】:
在现代 x86 处理器上运行引导加载程序时,处理器将以实地址模式运行。它的指令流水线功能在实模式下是否有效?
【问题讨论】:
-
我在询问流水线在实模式下是否可用;启动系统时
标签: x86 cpu-architecture x86-16
在现代 x86 处理器上运行引导加载程序时,处理器将以实地址模式运行。它的指令流水线功能在实模式下是否有效?
【问题讨论】:
标签: x86 cpu-architecture x86-16
是的,无论模式如何,现代微架构中的乱序核心都基本相同。大部分区别在于解码器。请参阅Agner Fog's microarch pdf 和x86 标签 wiki 中的其他链接,了解现代 CPU 在内部如何实际工作的详细信息。
可能需要额外的芯片才能在 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位代码中的地址大小前缀表示地址大小= 32位。)
VEX 编码指令(包括 BMI2 整数指令like pext)在实模式下不可用。 This Intel forum topic 建议这可能是由于现有软件 (NTVDM) 使用机器代码作为保护模式的陷阱。 (即,与 VEX 使用的 LDS/LES 相同的非法操作数)。因此,使 VEX 编码的指令仍然生成 #UD 对于向后兼容性很重要。
不过,SSE 在实模式下仍然可用,if you enable it with the right CR setting。
(VEX/EVEX 在 16 位 受保护 模式下可用,但在真实或虚拟 8086 模式下不可用。Is x86 32-bit assembly code valid x86 64-bit assembly code?)
【讨论】:
VPBLENDD 这样的 AVX2 指令。我不确定,直到在写这个答案时最终搜索。我想知道这是否与 16 位操作数大小不可用有关,并且忽略操作数大小前缀而不是需要一个晶体管。