Что произойдет, если программа сделает 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
обработчик сигнала не был вызван, и программа не была убита. Весьма разочаровывает.