在现代x86处理器上运行boot-loader程序时,处理器将以实地址模式运行。它的指令流水线功能是否在实模式下处于活动状态?
答案 0 :(得分:2)
是的,现代微体系结构中的无序核心运行基本相同,无论模式如何。大多数差异在于解码器。有关现代CPU实际内部工作方式的详细信息,请参阅Agner Fog's microarch pdf标记wiki中的x86和其他链接。
在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。