如果程序在仅EABI内核中进行OABI样式的系统调用会发生什么?

时间:2013-01-19 19:58:14

标签: linux arm

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

2 个答案:

答案 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。)