Что произойдет, если программа сделает syscall стиля OABI в ядре только EABI?

или в более общем плане, что произойдет, если инструкция swi с кодом операции !=0 выполняется на таком ядре? Он подает сигнал? Я спрашиваю, потому что хочу поймать его.

2 ответов


код, поля swi инструкции здесь:http://lxr.linux.no/linux+* / arch/arm / kernel / entry-общий.S#L335. Я не эксперт ARM, но похоже, что CPU не прячет swi аргумент в любом месте, где ядро может получить его; если ядро хочет знать, оно должно получить инструкцию из образа среды выполнения вызывающей программы. Это делает каждый системный вызов более дорогим, поэтому (если я правильно читаю) ядро только беспокоится о том, что swi аргумент, если он скомпилирован с CONFIG_OABI_COMPAT.

"правка":РУКА РУКА подтверждает, что 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

обработчик сигнала не был вызван, и программа не была убита. Весьма разочаровывает.