Bus errorとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > Bus errorの意味・解説 

バスエラー

(Bus error から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/03 22:04 UTC 版)

ナビゲーションに移動 検索に移動

バスエラー (: bus error) とは、コンピュータなどのバスへのアクセスに、何らかの問題があるため、読み書きのリクエストに応じられない、といったようなエラーである。

要因はおおざっぱに、論理的なもの(ソフトウェア的なもの)と物理的なもの(ハードウェア的なもの)に分けられる。論理的なものとしては、セグメンテーション違反やアラインメント違反(後述の「不整列アクセス」)など、物理的なものとしては、コンピュータの検出した一般的なデバイスが故障することが原因でも起きることがあるほか、まれにコンピュータハードウェアが物理的に壊れたことを示すことがある。

いずれにしても、詳細や細かい分類の違いはハードウェアおよびオペレーティングシステムのアーキテクチャや実装によって異なる(場合によっては、プロセッサの提供元とオペレーティングシステムの提供元で違う用語を使っているようなこともあるだろう)。いくつかの例を詳解する。

存在しないアドレスへのアクセス
CPUはソフトウェアによってある特定の物理メモリアドレスに対して読み書きを行うよう命令される。したがって、CPUはこの物理アドレスをアドレスバスに設定し、CPUに接続されている他のすべてのハードウェアに対して結果を返すように要求する。もし、この指定のアドレスに対してなんらかのハードウェアが返答するならばCPUは結果を受け取る。もし反応するハードウェアが何もなければCPUは例外を発生させ、要求された物理アドレスはコンピュータシステム全体として認識できないという合図を出す。これは、単に「物理」メモリアドレスのみで機能されることに注意する。ソフトウェアが未定義の仮想メモリアドレスに対してアクセスを試みると、CPUは通常バスエラーよりむしろセグメンテーション違反を発生させるだろう。
不整列アクセス (misaligned memory access / unaligned memory access)
たいていのCPUはバイト単位でアドレッシングを行い、それぞれ固有のメモリアドレス1バイトは8bitからなる。たいていのCPUは個々のメモリアドレスから単独のバイトデータにアクセスすることができるが、より大きな単位(16bitや32bit、64bitなど)を特別な境界、例えば、16bit(番地が2の倍数すなわち0, 2, 4, ...の場合は整列されているが、そうでない1, 3, 5, ...は整列されていない)や32bit(番地が4の倍数すなわち0, 4, 8, 12, ...の場合は整列されているが、その他は整列されていない)に整列されることなしにアクセスすることは通常できない。

CPUは普通どんな時もデータバス幅いっぱいにデータをアクセスする。バイトデータにアクセスするために、CPUはデータバス幅いっぱいにメモリアクセスをして、ここのバイトをマスクしたりシフトしたりする。これは非効率的ではあるが、特に順番に処理を行うたいていのソフトウェアにとって本質的な特性だとして大目に見られている。バイトではなく、2つのアライメントにまたがる程より大きな単位のデータの場合は、データバスで2回以上データを取ってくる必要がある。CPUがサポートしていれば可能だが、この機能は機械語レベルで直接必要になることはめったにないので、CPU設計者は普通このような実装を避け、その代わりに不整列メモリアクセスとしてバスエラーを発行する。CPUのメモリアクセス機構とコンパイラの進歩により、以前よりも問題として目立たなくなってきている。多くの分野で64bit CPUへの移行が行われ、ワード幅が増えた関係で、バスエラーが多発しやすくなっている[要出典]

バスエラーが発生すると、POSIX環境ではSIGBUSシグナルが送信される。

これはC言語で書かれた不整列メモリアクセスの例である。

Note: すべてのアーキテクチャでテストしていないので、この例にはまずい所があるかもしれない。

#include <stdlib.h>
int main(void) {
  /* iptr is a pointer to an integer, usually 32 or 64 bits in size. It is currently undefined. */
  /* iptrはintへのポインタ。普通32bitまたは64bitのサイズがある。この時点では内容は未定義 */
  int x, *iptr;

  /* cptr is a pointer to a character (the "smallest addressable unit" of the CPU, normally a byte) */
  /* cptrはcharへのポインタ。CPUがアドレッシングできる最小単位(バイト)で、普通はオクテットすなわち8bit */
  char *cptr;

  /* malloc() gives us a valid, aligned memory address. put this in cptr */
  /* malloc()が成功した場合、返ってきたメモリアドレスはアライメントされている。このアドレスをcptrに入れる */
  cptr = (char *) malloc(33);
  if (!cptr) return 1;

  /* cptrを1増やす。これで不整列なアドレスになった */
  cptr++;

  /* 不整列アドレスで個々のバイトにアクセスするのは問題ない */
  x = *cptr;

  /* iptrに不整列アドレスを代入 */
  iptr = (int *) &cptr[1];
  /* ここでバスエラーが発生するはず。不整列アドレスで1バイト以上のデータにアクセスしている */
  x = *iptr;

  free(cptr);

  return 0;
}

x86アーキテクチャでは、既定で不整列メモリアクセスを自動的に補正する[1]。ただしこの自動補正には性能の損失(パフォーマンス・ペナルティ)が伴う。EFLAGSレジスタのAlignment Check (AC) フラグとCR0レジスタのAMビットがセットされるとアライメントチェックが有効になるが、アプリケーションソフトウェアでこのシステムフラグを変更してはならない[2]

ダブル・フォールト

オペレーティングシステムのカーネルがバス・エラーに対して処理を行っているあいだに、さらなるバス・エラーが発生した場合をダブル・フォールトという。この語はDECのミニコンピュータで定義され、ほとんどのアーキテクチャにおいてこの語が使われる。バスエラー処理はリエントラントにすることができない。なぜならCPUのコンテキストがメモリに書き出され、再開するための準備が行われている状態にあるからである。

バス・エラー処理中に新たなバス・エラーが発生すると、新たなCPUコンテキストがメモリに書き出されることになるが、このコンテキストを再びCPUに書き戻すと、その直前で発生したバス・エラー状態を再現してしまい、無限ループに陥る。多くのオペレーティングシステムは、この状態に至った場合を「異常事態」とみなし、WindowsではブルースクリーンUNIXではカーネルパニックを発生させ、オペレーティングシステムは停止し、再起動以外に再開する方法はなくなる。

この現象はデバイスドライバのバグなどで顕著に発生しており、Windowsではクラッシュの大半が、UNIXではほとんどの場合がダブル・フォールトによる、カーネル空間上のコードで発生したバス・エラーである。

脚注

関連項目


「Bus error」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Bus error」の関連用語

Bus errorのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Bus errorのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのバスエラー (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS