如果一个程序在EABI内核中创build了一个OABI风格的系统调用,会发生什么?

或者更一般地说,如果一个操作码为!= 0的swi指令在这样的内核上执行,会发生什么? 它会产生一个信号吗? 我问,因为我想陷入困境。

swi指令的代码在这里: http : //lxr.linux.no/linux+*/arch/arm/kernel/entry-common.S#L335 。 我不是一个ARM专家,但看起来CPU不会在内核可以得到的地方swi参数; 如果内核想知道,它必须从调用程序的运行时镜像中获取指令。 这使得每个系统调用都变得更加昂贵,所以(如果我正确地读取内容),内核只想知道如果使用CONFIG_OABI_COMPAT编译swi参数是什么。

编辑: ARM ARM确认SWI没有做任何有用的参数。 (物理页面634 /逻辑页面A7-118。)

所以我试图看看会发生什么。 我编译了下面的程序并运行它:

 #include <stdio.h> #include <signal.h> void traphandler(int signum, siginfo_t *info, void *context) { puts("trap"); } int main() { struct sigaction sa; sa.sa_sigaction = traphandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGTRAP, &sa, NULL); puts("begin"); asm("swi 1"); puts("after swi 1"); asm("swi 255"); puts("after swi 255"); } 

和输出是:

 begin after swi 1 after swi 255 

信号处理程序没有被调用,程序也没有被杀死。 非常令人失望。