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 シグナルがいくつかあります。たとえば。SIGSEGVSIGBUS、およびSIGFPE。これが発生したときに可能なことの正確なセマンティクスは POSIX で定義されていますが、魔法はアーキテクチャと BSP 固有のハンドラーから始まります。一般的なルールは、組み込みシステムでこれらの障害を回避することであるため、デフォルトのアクションは多くの場合、カーネル スタック トレースやその他の BSP 固有のコードのようなものです。

一部の BSP は、ハードウェア障害をソフトウェア信号に伝達する例外ハンドラーへの追加のインストールをサポートしていますが、これは主にSIGFPE、言語固有の例外ハンドラーにマップされた Ada などの言語で取得するために使用されます。

原則として、組み込みシステムで POSIX シグナルが使用されることはめったになく、ハードウェア例外に起因するものは設計されておらず、回復不能な障害と見なされ、ソフトウェアのみのシグナルが使用される場合があります。

要約すると、目的の動作を得るには、ハードウェア例外をマップするコードをインストールする必要があります-> POSIX シグナル。

于 2015-01-05T18:14:34.260 に答える