首先,我将指出这里的操作系统是RTEMS,它是一个开源RTOS,源代码可以在这里找到:
我有一个非常简单的程序,使用文档中的sigaction调用为SIGSEGV设置信号处理程序(我认为支持):
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
}
然而,问题是当我在程序中导致段错误时,不会调用信号处理程序,而是在vectors_init.c
(RTEMS源)中调用内核进程来打印堆栈跟踪。在我的rtems程序中,我需要做些什么才能获得SIGSEGV信号?
答案 0 :(得分:0)
所以对此的解释是RTEMS不像我想象的那样处理信号。
有一些POSIX信号在硬件级别上确实是例外。例如。 SIGSEGV
,SIGBUS
和SIGFPE
。发生这种情况时可能发生的确切语义由POSIX定义,但魔术以架构和BSP特定处理程序开始。由于一般规则是在嵌入式系统中避免这些错误,因此默认操作通常类似于内核堆栈跟踪或其他BSP特定代码。
一些BSP支持在异常处理程序中安装一个附加程序,它会将硬件故障传播到软件信号中,但这主要用于在Ada映射到特定于语言的异常处理程序的语言中获取SIGFPE
。
作为一般规则,POSIX信号很少用于嵌入式系统,源于硬件异常的信号被设计出来并被认为是不可恢复的故障,并且可以使用仅软件信号。
总结:为了获得理想的行为,我需要安装映射硬件异常的代码 - > POSIX信号。