Для начала я укажу, что операционной системой здесь является RTEMS, это RTOS с открытым исходным кодом, а источник можно найти здесь:
У меня есть довольно простая программа, которая устанавливает обработчик сигнала для SIGSEGV (который, я считаю, поддерживается), используя вызов sigaction из документации здесь:
http://docs.rtems.org/releases/rtemsdocs-4.9.2/share/rtems/html/posix_users/posix_users00033.html
Моя программа сводится к следующему:
void HandleAndPrintSignal()
{
printf("I am in the segfault signal handler AND I WILL HANDLE YOUR SIG!!!!\n");
exit(1);
}
void *POSIX_Init(void *args)
{
printf("BENS BIG NOTE: Initializing Signal Handler\n");
struct sigaction sa;
sa.sa_handler = HandleAndPrintSignal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
if (sigaction (SIGSEGV, &sa, 0)) {
printf("A ERROR OCCURED WITH THIS!");
exit(1);
}
int *p = NULL;
*(p--) = 5; // Causes segfault
}
Однако проблема в том, что когда я вызываю segfault в моей программе, обработчик сигнала не вызывается, а вместо этого вызывается процесс ядра в vectors_init.c
(Источник RTEMS) для печати трассировки стека. Что-то особенное, что мне нужно сделать, чтобы получить сигнал SIGSEGV в моей программе rtems?
Поэтому объяснение этому заключается в том, что RTEMS не обрабатывает сигналы так, как я думал.
Есть некоторые сигналы POSIX, которые действительно являются исключениями на аппаратном уровне. например, SIGSEGV
, SIGBUS
, а также SIGFPE
, Точная семантика того, что возможно, когда это происходит, определяется POSIX, но магия начинается с архитектуры и конкретного обработчика BSP. Поскольку общее правило состоит в том, чтобы избежать этих ошибок во встроенных системах, действие по умолчанию часто является чем-то вроде трассировки стека ядра или другого специфического кода BSP.
Некоторые BSP имеют поддержку для установки дополнения к обработчику исключений, который будет распространять аппаратный сбой в программный сигнал, но это в основном используется для получения SIGFPE
в таких языках, как Ada, сопоставлены с обработчиками исключений для конкретного языка.
Как правило, сигналы POSIX редко используются во встраиваемых системах, сигналы, возникающие из аппаратных исключений, разрабатываются и считаются неисправимыми неисправностями, и могут использоваться только сигналы программного обеспечения.
В итоге: для получения желаемого поведения мне нужен установленный код, который отображает аппаратные исключения -> сигналы POSIX.