或者更一般地说,如果在这样的内核上执行带有操作码!= 0的swi指令会发生什么?它会产生信号吗?我问,因为我想陷阱。
答案 0 :(得分:0)
所以我试着看看会发生什么。我编译了以下程序并运行它:
#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
未调用信号处理程序,程序也未被终止。非常令人失望。
答案 1 :(得分:0)
字段swi
说明的代码位于此处:http://lxr.linux.no/linux+*/arch/arm/kernel/entry-common.S#L335。我不是ARM专家,但似乎CPU不会将swi
参数存储在内核可以获得的任何位置;如果内核想要知道,它必须从调用程序的运行时映像中获取指令。这使得每个系统调用都变得更加昂贵,因此(如果我正确地读取了内容)内核只会发现如果用swi
编译CONFIG_OABI_COMPAT
参数是什么的。{/ p>
编辑:ARM ARM确认SWI对其参数没有做任何有用的事情。 (物理页面634 /逻辑页面A7-118。)