Szynaエラー-Wikipedia、無料百科事典

before-content-x4

レールエラー – プロセスがメモリにアクセスしようとするときにコンピューター機器によって引き起こされるエラー。プロセッサは物理的に対処できません。ほとんどの現代的なアーキテクチャでは、これらのエラーはセグメンテーションエラーよりもはるかにまれです。 [初め]

after-content-x4

ミックスと互換性のあるプラットフォームでは、レールエラーの結果は、エラーを引き起こすプロセスにシグバス信号を送信することでした。 Sigbusは、レールエラーが機器の物理的な損傷を示すことはめったにないという事実にもかかわらず、コンピューターによって検出されたデバイスエラーによって引き起こされる可能性があります。これは通常、プログラムのソースコードのエラーによって引き起こされます。 [2]

鉄道エラーの3つの主な原因は次のとおりです。

  • 許可されていないアクセスの試み

存在しないアドレス [ 編集 | コードを編集します ]

ソフトウェアは、プロセッサに特定の物理メモリアドレスでデータの読み取りまたは保存を命じます。プロセッサは、アドレスレールにこの物理アドレスを設定し、他のすべてのデバイス(CPUに接続)にメッセージを送信して、この特定のアドレスに回答を送信する際の結果について通知します。デバイスが応答しない場合、CPUは、コンピューターシステム全体によって目的の物理アドレスが認識されていないことを示す例外を返します。これは、物理メモリアドレスにのみ適用されます。未定義の仮想メモリアドレスにアクセスしようとする試みは、バスではなくセグメンテーションエラーであると広く考えられています。 MMUは別々ですが、プロセッサはそれを区別できません。

許可されていないアクセスの試み [ 編集 | コードを編集します ]

ほとんどのプロセッサでは、すべての一意のメモリアドレスは単一のバイトです。多くのプロセッサは、各メモリアドレスからバイトにアクセスできますが、これらのユニットが特定の制限に「アライメント」されていない場合、より大きなユニット(16ビット、32、64など)の場合はそれを持っていません(例外はx86プラットフォームです)。

たとえば、アクセスを16ビットの精度で一致させる必要がある場合、0、2、4、6、バイトなどでアドレス(バイトで与えられます)など。それらは「正しく偶数」と見なされ、したがって – 利用可能になります。次に、1、3、5バイトなどのアドレス。それらは「未払い」と見なされ、利用できません。同様に、32ビットの「アライメント」を使用すると、バイト0、4、8、12などのアドレスが利用可能になり、「許可」のバイト間のバイトに含まれるすべてのアドレスは未払いと見なされます。

アーキテクチャに応じて、一部のシステムには異なる構成がある場合があります。たとえば、IBM System/360(IBM System Z、Fujitsu B8000、RCA Spectra、およびUnivac Series 90とともに)に基づく機器の場合、命令には16ビットの制限がありました。これは、アドレスが偶数バイトで開始する必要があることを意味しました。奇妙なアドレスにアピールしようとする試みは、仕様を除き、終了しました [3] 。それにもかかわらず、データはメモリ内の任意のアドレスから回復することができ、指示に応じて、1バイト以上である可能性があります。

次のソースコードは、メモリへの「不均一な」アクセスを示しています(AT&T構文でCで書かれています)。

after-content-x4
#含む   int  主要 int  argc  char  ** argv ))  {   int  * IPTR ;   char  * CPTR ;    #if defined(__ gnuc__)  #定義の場合(__ i386__)   / * x86でのイコライゼーションの検証のアクティブ化 */      __asm__("pushfnorl $0x40000,(%esp)npopf");
# elif defined(__x86_64__)
     /* Aktywowanie walidacji wyrównania na x86_64 */
    __asm__("pushfnorl $0x40000,(%rsp)npopf");
# endif
#endif

    /* malloc() zawsze przydziela "wyrównaną" pamięć */
    cptr = malloc(sizeof(int) + 1);
    
    /* Inkrementacja wskaźnika o jeden, przez co stanie się on niewyrównany */
    iptr = (int *) ++cptr;

    /* Usunięcie referencji jako wskaźnika typu 'int', które spowoduje niewyrównany dostęp */
    *iptr = 42;

    /*
       Poniższe operacje spowodują wywołanie błędu sigbus.
       short *sptr;
       int    i;

       sptr = (short *)&i;
       // Dla każdej inkrementacji nieparzystych wartości nastąpi "sigbus".
       sptr = (short *)(((char *)sptr) + 1);
       *sptr = 100;
    
    */

    return 0;
}

X86アーキテクチャで動作するMIEXに従って、システム上のサンプルコードを編集および起動すると、提示されたエラーが発生します。

$ GCC -Ansi Sigbus.c -o Sigbus $ ./sigbus バスエラー  $ gdb ./sigbus (GDB)  r  プログラム受信信号Sigbus、バスエラー。  0x080483ba in main()  (GDB)  x/i $ PC  0x80483BA :mov dword ptr [eax]、0x2a  (GDB)  p/x $ eax  $ 初め  = 0x804a009 (GDB)  p/t $ eax&(sizeof(int)-1)  $ 2  =  初め  
  1. バスエラー(Solaris Commonメッセージとトラブルシューティングガイド) 、docs.oracle.com [アクセス2017-11-17]
  2. C-バスエラーとは何ですか? – スタックオーバーフロー 、stackoverflow.com [アクセス2017-11-17]
  3. z/アーキテクチャの原則 、SA22-7832-04、ページ6-6、第5版(2005年9月)IBM Corporation、Poukeepsie、NY、 http://publibfp.dhe.ibm.com/epubs/pdf/a2278324.pdf (2015年12月31日取得)

after-content-x4