6

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

4

2 回答 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 回答