如果CPU尝试执行已使用CPU不支持的某些指令编译的二进制文件,会发生什么情况。我特别想知道在旧处理器上运行的一些新的AVX指令。
我假设可以对此进行测试,理论上可以向用户显示友好消息。据推测,大多数低级别的图书馆将代表您进行检查。假设你没有做这个检查,你会发生什么?您的流程会收到什么信号?
答案 0 :(得分:6)
可以将新指令设计为"传统兼容"或者它不能
前一类属于tzcnt
或aggregate(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 bsf
和tzcnt
只是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或明确检查指令的存在。