或者更一般地说,如果在这样的内核上执行带有操作码 !=0 的 swi 指令会发生什么?它会产生信号吗?我问是因为我想把它困住。
问问题
804 次
2 回答
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
信号处理程序没有被调用,程序也没有被杀死。相当令人失望。
于 2013-01-20T18:35:11.923 回答
0
字段swi
指令的代码在这里: http: //lxr.linux.no/linux+*/arch/arm/kernel/entry-common.S#L335。我不是 ARM 专家,但似乎 CPU 不会将swi
参数存储在内核可以获取的任何地方;如果内核想知道,它必须从调用程序的运行时映像中获取指令。这使得每个系统调用都更加昂贵,所以(如果我没看错的话)内核只会费心找出swi
参数是什么,如果它是用CONFIG_OABI_COMPAT
.
编辑:ARM ARM确认 SWI 对其论点没有做任何有用的事情。(物理页 634 / 逻辑页 A7-118。)
于 2013-01-21T23:19:58.077 回答