Причинение segfault в программе не попадает в обработчик сигнала

Для начала я укажу, что операционной системой здесь является RTEMS, это RTOS с открытым исходным кодом, а источник можно найти здесь:

http://git.rtems.org/rtems/

У меня есть довольно простая программа, которая устанавливает обработчик сигнала для 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?

2

Решение

Поэтому объяснение этому заключается в том, что RTEMS не обрабатывает сигналы так, как я думал.

Есть некоторые сигналы POSIX, которые действительно являются исключениями на аппаратном уровне. например, SIGSEGV, SIGBUS, а также SIGFPE, Точная семантика того, что возможно, когда это происходит, определяется POSIX, но магия начинается с архитектуры и конкретного обработчика BSP. Поскольку общее правило состоит в том, чтобы избежать этих ошибок во встроенных системах, действие по умолчанию часто является чем-то вроде трассировки стека ядра или другого специфического кода BSP.

Некоторые BSP имеют поддержку для установки дополнения к обработчику исключений, который будет распространять аппаратный сбой в программный сигнал, но это в основном используется для получения SIGFPE в таких языках, как Ada, сопоставлены с обработчиками исключений для конкретного языка.

Как правило, сигналы POSIX редко используются во встраиваемых системах, сигналы, возникающие из аппаратных исключений, разрабатываются и считаются неисправимыми неисправностями, и могут использоваться только сигналы программного обеспечения.

В итоге: для получения желаемого поведения мне нужен установленный код, который отображает аппаратные исключения -> сигналы POSIX.

0

Другие решения


По вопросам рекламы [email protected]