当您执行CPU不支持的指令时会发生什么?

时间:2017-06-25 20:21:26

标签: linux x86-64 avx

如果CPU尝试执行已使用CPU不支持的某些指令编译的二进制文件,会发生什么情况。我特别想知道在旧处理器上运行的一些新的AVX指令。

我假设可以对此进行测试,理论上可以向用户显示友好消息。据推测,大多数低级别的图书馆将代表您进行检查。假设你没有做这个检查,你会发生什么?您的流程会收到什么信号?

1 个答案:

答案 0 :(得分:6)

可以将新指令设计为"传统兼容"或者它不能 前一类属于tzcntaggregate(b ~a, df[!is.na(df$var),], FUN = function(x) toString(unique(x))) # a b #1 A 1, 2, 3 #2 B 5 #3 C 2, 3, 5 等指令,其编码可在​​旧架构中生成有效指令:xacquire编码为 rep bsftzcnt只是xacquire 语义当然是不同的。

对于第二类属于大多数新指令,AVX是一个流行的例子 当CPU遇到无效或保留的编码时,会生成 #UD (对于 UnDefined )异常 - 该中断号为6。

Linux内核在IDT的早期为 #UD 设置entry_64.S条目:

repne

使用traps.c中的宏生成的idtentry invalid_op do_invalid_op has_error_code=0 的条目:

do_invalid_op

DO_ERROR(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op) 生成一个在同一个文件(here)中调用DO_ERROR的函数。

do_error_trap使用do_error_trap(在同一文件here中)创建包含Linux信号信息的fill_trap_info结构:

siginfo_t

从那里发生以下呼叫:

traps.c中的

case X86_TRAP_UD: sicode = ILL_ILLOPN; siaddr = uprobe_get_trap_addr(regs); break; signal.c中的do_trap signal.c

中的force_sig_info

最终在调用违规流程specific_send_sig_info的信号处理程序时达到高潮。

以下程序是一个非常简单的示例,可生成 #UD

SIGILL

我们可以使用BITS 64 GLOBAL _start SECTION .text _start: ud2 来检查通过运行该程序收到的信号

strace

正如所料。

作为Cody Gray commented,图书馆通常不依赖于SIGILL,而是使用CPU dispatcher或明确检查指令的存在。