在实际模式下运行时,现代X86处理器上可用管道/OOOE



在现代X86处理器上运行引导程序程序时,处理器将以实地地址模式运行。它的指令管道功能会在实际模式下处于活动状态吗?

是,现代微体系结构中的端外核心基本上都相同,无论模式如何。大多数区别在于解码器。有关现代CPU在内部实际工作的详细信息,请参见Agner Fog的Microarch PDF和X86 TAG Wiki中的其他链接。

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

我已经读到,当片段具有非零基数时,AMD CPU的速度略慢。(或我猜在16位模式下:当细分寄存器本身设置为非零值时,因为在16位模式下它们直接使用,而不是作为描述符的选择器。)


请记住,许多常见的16位成语(例如loop)都很糟糕。

此外,如果不小心,部分注册放缓很容易干扰级别的执行。Intel P6家庭和SNB家庭CPU分别重命名部分寄存器,因此将其写入AX并没有对EAX/RAX的完整内容的错误依赖性。稍后在SNB之前在CPU上合并时可能会出现失速

所有其他微体系结构将 mov ax, 5视为 eax的读取模式,因此它不会打破依赖关系链对 ax的旧值。如果您不小心,这可能是一个巨大的问题。

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

16位地址模式可能表现不佳,我忘记了。32位代码不需要快速,而64位代码根本无法使用16位地址。(64位代码中的地址大小的前缀表示地址大小= 32bits。)


VEX编码的说明(包括所有AVX和一些BMI1和BMI2整数指令,例如blsrpext),在真实或VM86模式下都不可用。这个英特尔论坛主题(Dead Link 1 )建议可能是由于使用机器代码作为受保护模式的陷阱的现有软件(NTVDM)。(即,与vex使用的LDS/LE相同的非法操作数)。因此,制作Vex编码的指令仍然生成#UD对于向后兼容性很重要。迈克尔·皮奇(Michael Petch)评论:

0xc4 0xc4 0x60(VM版本编号)和0xc4, 0xc4, 0x58在90年代中期甚至在NTVDM之前的16位代码中都非常常用。我们通常会使用它们来确定我们是否在SoftPC中运行。那时,它们被记录为BOP代码。Microsoft在90年代中期使用NT设备驱动程序套件将它们与NT设备驱动程序套件一起记录。这并不令人惊讶,因为NTVDM基于SoftPC。我拿出了旧的NT DDK CD,可以在文件ISVBOP.h

中找到它们。

SSE仍然可以在实际模式下使用,如果您使用正确的CR设置启用它。

(vex/evex 在16位受保护模式下可用,但不是真实或虚拟-8086模式。是x86 32位汇编代码有效x86 64--位组件代码?)


脚注1:死去的链接,未在Wayback Machine中存档。英特尔可能刚刚重组了他们的论坛URL,但我没有去看。

最新更新