cpu-architecture - 像 x86 这样的指令集会更新吗?如果是这样,如何保证向后兼容性?

标签 cpu-architecture instruction-set

旧处理器如何知道如何解码它不知道的新指令?

最佳答案

新指令使用以前未使用的操作码,或其他方式来查找更多“编码空间”(例如,以前对于给定操作码没有任何意义的前缀)。

How would an older processor know how to decode new instructions it doesn't know about?

不会的。想要在旧 CPU 和新 CPU 上运行的二进制文件必须将自身限制为基准功能集,或者在运行时检测 CPU 功能并设置函数指针以选择一些重要函数的版本。 (又名“运行时调度”。)

x86 有一个很好的机制(cpuid 指令),可以让代码查询 CPU 功能,而无需任何内核支持。其他一些 ISA 需要将 CPU 信息硬编码到操作系统中或通过 I/O 访问进行检测,因此唯一可行的方法是内核以操作系统特定的方式将信息导出到用户空间。

或者,如果您在具有较新 CPU 的计算机上从源代码构建并且不关心旧 CPU,则可以使用 gcc -O3 -march=native 让 GCC 使用所有当前 CPU 支持的 ISA 扩展,使得二进制文件在旧 CPU 上会出现故障。 (例如,x86 #UD(未定义指令)硬件异常,导致操作系统向进程传递 SIGILL 或等效信号。)

或者在某些情况下,新指令可能在旧 CPU 上解码为其他指令,例如x86 lzcnt 在较旧的 CPU 上解码为 bsr,并忽略 REP 前缀,因为 x86 基本上没有剩余未使用的操作码(在 32 位模式下)。有时,这种“解码为其他内容”实际上作为一种优雅的后备很有用,以允许透明地使用新指令,特别是 pause = rep nop = nop 在不了解这一点的旧CPU上。因此代码可以在自旋循环中使用它而无需检查 CPUID。

-march=native 对于您将其设置为仅在该服务器上运行而不制作二进制文件进行分发的服务器来说很常见。

关于cpu-architecture - 像 x86 这样的指令集会更新吗?如果是这样,如何保证向后兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66230649/

相关文章:

linux - CPU节流系统中时间测量的可靠方法是什么?

caching - 英特尔酷睿 i7 的缓存规范

assembly - PUSH/POP 指令被视为 RISC 还是 CISC?

c++ - VM解释器-权衡性能的优点和缺点:较大的指令集/调度循环

x86-64 - 所有 64 位英特尔架构都支持 SSSE3/SSE4.1/SSE4.2 指令吗?

assembly - 演示处理器环-运行环0指令的汇编代码

x86 - 分支目标预测与分支预测结合?

assembly - itte 臂组件

assembly - BGE指令ARM

x86 - 新的 ISA 指令与 i386