首页 文章

什么是Intel 's and AMD' x86-64实现的兼容子集?

提问于
浏览
5

在学习x86-64程序集时,我遇到了我的第一个不兼容的Intel 64和AMD64实现的"x86-64":Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit? syscall 在一个但不兼容的兼容模式下有效 .

除了仔细阅读这两本手册并进行比较之外,还有更好的方法可以找出这些不兼容性吗?这样会容易出错,并且在针对可移植性时会重复我的手动阅读工作吗?

例如,如果有以下任何一种情况会更容易:

  • 英特尔和AMD声称遵循的标准子集

  • 关于AMD兼容性的英特尔手册的评论,因为AMD是发明x86-64的人 . 但是,当然,这对英特尔来说很难维护,英特尔手册中不包含AMD这个词 .

  • 某些一般官方或非官方指南,以确保某些部分的兼容性 . 例如,类似:兼容模式可能不兼容,但64位模式不兼容 .

  • 一些维护良好的英特尔,AMD或某些第三方不兼容的列表

1 回答

  • 5

    历史记录:英特尔在他们的Itanium系列处理器中实现了他们的64位ISA,他们称之为IA-64,它完全取代了32位x86 ISA . IA-64并没有向后兼容x86,并且在高端服务器市场之外从未真正流行起来 .

    AMD创造了AMD64 ISA作为 x86 ISA的增量演进 . AMD64很快得到了普及和接受,英特尔也采用了它,但在不同的时间称它为IA-32e,EM64T和Intel64 . Intel64和AMD64几乎完全相同,但存在一些差异 .

    Wikipedia列出了这些差异:

    • 当源为零且操作数大小为32位时,Intel 64的BSF和BSR指令与AMD64的指令不同 . 处理器设置零标志并保留目标的高32位未定义 .

    • AMD64需要不同的微代码更新格式并控制MSR(特定型号寄存器),而英特尔64实现的微代码更新与其32位处理器相同 .

    • Intel 64缺少一些被认为是AMD64架构的MSR . 这些包括SYSCFG,TOP_MEM和TOP_MEM2 .

    • Intel 64仅在64位模式下允许SYSCALL / SYSRET(不在兼容模式下),并且在两种模式下都允许SYSENTER / SYSEXIT . AMD64在长模式的两个子模式下都缺少SYSENTER / SYSEXIT .

    • 在64位模式下,具有66H(操作数大小覆盖)前缀的近分支表现不同 . Intel 64忽略此前缀:指令具有32位符号扩展偏移量,并且指令指针不会被截断 . AMD64在指令中使用16位偏移字段,并清除指令指针的前48位 .

    • AMD处理器在执行80位信令NaN的FLD或FSTP时会引发浮点无效异常,而英特尔处理器则不会 .

    • Intel 64缺乏保存和恢复浮点状态的缩减(因此更快)版本的能力(涉及FXSAVE和FXRSTOR指令) .

    • 最近的AMD64处理器通过长模式段限制使能(LMSLE)位重新引入了对分段的有限支持,以简化64位客户的虚拟化 .

    • 当使用SYSRET返回非规范地址时,AMD64处理器在特权级别3中执行常规保护错误处理程序,而在Intel 64处理器上,它以特权级别0执行 .

相关问题