2

首先我要指出这里的操作系统是 RTEMS,它是一个开源 RTOS,源代码可以在这里找到:

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

我有一个非常简单的程序,它使用此处文档中的 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 信号,我需要做一些特别的事情吗?

4

1 回答 1

0

所以对此的解释是 RTEMS 并没有像我想象的那样处理信号。

有一些 POSIX 信号在硬件层面确实是例外。例如。SIGSEGV, SIGBUS, 和SIGFPE. 发生这种情况时可能发生的确切语义由 POSIX 定义,但魔法始于架构和 BSP 特定的处理程序。由于一般规则是避免嵌入式系统中的这些错误,因此默认操作通常类似于内核堆栈跟踪或其他 BSP 特定代码。

一些 BSP 支持在异常处理程序中安装附加项,这会将硬件故障传播到软件信号中,但这主要用于获取SIGFPE映射到特定语言异常处理程序的 Ada 等语言。

作为一般规则,POSIX 信号很少用于嵌入式系统,那些源于硬件异常的信号被设计出来并被认为是不可恢复的故障,并且可以使用纯软件信号。

作为总结:为了获得所需的行为,我需要安装映射硬件异常的代码 - > POSIX 信号。

于 2015-01-05T18:14:34.260 回答