一般保護違反

x86命令セットアーキテクチャ(ISA)における一般保護違反 ( GPF )カーネルまたはユーザープログラムのいずれかで実行中のコードによって引き起こされたアクセス違反に応答して ISA 定義の保護メカニズムによって開始される違反(割り込みの一種)です。このメカニズムは、1983 年に発表されたIntel 80286 CPU のマニュアルとデータシートで初めて説明されました。また、1986 年のIntel 80386プログラマーズリファレンスマニュアルのセクション 9.8.13 でも説明されています。一般保護違反は、割り込み (ベクター番号 13 (0Dh)) として実装されています。一部のオペレーティングシステムでは、不正なオペコード例外など、アクセス違反に関連しない例外も、メモリ保護とは関係がなくても、一般保護違反として分類することがあります。CPU が保護違反を検出すると、コードの実行を停止し、GPF 割り込みを送信します。ほとんどの場合、オペレーティング システムは障害の発生したプロセスを実行キューから削除し、ユーザーに信号を送り、他のプロセスの実行を継続します。ただし、オペレーティング システムが一般保護違反を検出できない場合、つまりオペレーティング システムが前回の GPF 割り込みから戻る前に別の保護違反が発生した場合、CPU は二重違反を信号で通知し、オペレーティング システムを停止します。さらに別の障害 (三重違反) が発生した場合、CPU は回復できません。80286 以降、CPU は「シャットダウン」と呼ばれる特別な停止状態に入り、この状態から抜け出すにはハードウェア リセットを実行する必要があります。80286を搭載した最初のPC 互換システムであるIBM PC ATには、シャットダウン状態を検出し、その状態が発生すると CPU を自動的にリセットするハードウェアが搭載されています。PC AT の後継機種はすべて同じ仕組みを採用しているため、PC では三重違反が発生すると即座にシステムがリセットされます。

特定の行動

マイクロソフトウィンドウズ

Microsoft Windowsでは、一般保護違反は製品のバージョンに応じてさまざまな言語で表示されます。

オペレーティング·システムエラーメッセージ注記
ウィンドウズ 3.0回復不能なアプリケーションエラー

現在のアプリケーションを終了しています。

[1]
ウィンドウズ 3.1x[プログラム名] により、[メモリ アドレス] のモジュール [モジュール名] で一般保護違反が発生しました。このエラーメッセージ(同じ設計フォーマット)は、まれにそれ以降のバージョン(95、98、Me)でも表示されることがあります。このエラーメッセージは、95、98、Meでも「詳細」ボタンをクリックするかAlt+Dキーを押すと表示され、レジスタ、CS:EIPのバイト数、スタックダンプも表示されます。
ウィンドウズ95
ウィンドウズ98
このプログラムは不正な操作を実行したため、シャットダウンされます。

問題が解決しない場合は、プログラムベンダーに問い合わせてください。

場合によっては、「すべてのプログラムを終了し、コンピュータを再起動してください」というエラーメッセージも表示されることがあります。特に、問題が深刻な場合やシステムが不安定で、戻りアドレスがWindows DLLや他のシステムプロセスを指している場合によく見られます。このメッセージは、プログラムが簡単に識別できない場合にも表示されることがあります。デバッガーがインストールされている場合は、「閉じる」ボタンと「詳細」ボタンの間に「デバッグ」ボタンも表示されます。
Windows NT 4.0
Windows 2000
[プログラム名] はエラーを生成したため、Windows によって終了されます。プログラムを再起動する必要があります。

エラー ログを作成しています。

ウィンドウズミー[プログラム名] により [モジュール名] でエラーが発生しました。[プログラム名] を終了します。

問題が引き続き発生する場合は、コンピューターを再起動してください。

デバッガがインストールされている場合は、「閉じる」ボタンの下に「デバッグ」ボタンも表示されます。詳細は、Alt+D キーを押すか、faultlog.txt ファイルから確認できます。
Windows XP
Windows Server 2003
Windows Server 2003 R2
[プログラム名] に問題が発生したため、終了する必要があります。ご不便をおかけして申し訳ございません。

作業の途中だった場合は、作業中の情報が失われる可能性があります。

[...]

このエラーの詳細については、ここをクリックしてください

エラー メッセージには、分析のためにエラーの詳細を Microsoft に送信するオプションも用意されています。
Windows Vista以降(Windows 10 を除く)
Windows Server 2008以降
[プログラム名]は動作を停止しました。

問題が発生したため、プログラムが正常に動作しなくなりました。Windows はプログラムを終了し、解決策がある場合は通知します。

デフォルトでは、Windows は分析のためにエラーの詳細を Microsoft に送信しますが、送信しないようにしたり、毎回ユーザーに対処方法を尋ねたりするようにシステムを構成することもできます。
ウィンドウズ10

Windows 11 では、一般保護違反が発生した場合に [プログラム名は動作を停止しました] というダイアログが表示されなくなり、プログラムが単に閉じられるようになりました。

Windows 95、98、およびMeには、主にWindows 3.xプログラムで使用される別のエラーメッセージがあります。「プログラムでエラーが発生しました。作業を続行するには、「無視」をクリックし、作業を新しいファイルに保存してください。このプログラムを終了するには、「閉じる」をクリックしてください。最後に保存してから入力した情報は失われます。」 「閉じる」をクリックすると、Windowsのバージョンに応じて、上記のいずれかのエラーメッセージが表示されます。「無視」でも同様のエラーメッセージが表示される場合があります。

Unix

Linuxおよびその他のUnixでは、エラーは個別に報告されます (例:メモリ エラーのセグメンテーション エラー)。

メモリエラー

メモリエラーでは、エラーが発生したプログラムがアクセスすべきでないメモリにアクセスします。例としては、次のようなものがあります。

  • メモリの読み取り専用部分に書き込もうとしています
  • 命令として指定されていないメモリ内のバイトを実行しようとする
  • 命令として指定されたメモリ内のバイトをデータとして読み取ろうとする
  • 記憶の一部の指定とその使用との間のその他の矛盾

しかし、多くの現代のオペレーティングシステムは、メモリアクセス制御方式をセグメンテーションではなくページング方式で実装しているため、Windowsなどのオペレーティングシステムでは、無効なメモリ参照が一般保護違反ではなくページフォールトとして報告されることがよくあります。オペレーティングシステムは通常、例外処理やシグナルなどの抽象化レイヤーを提供し、プログラムからメモリアクセスエラーを発生させるために使用されたプロセッサ内部のメカニズムを隠蔽します。これは、プロセッサによって生成されるさまざまな種類のエラー状態を処理するための標準インターフェースを提供することを目的としています。

x86アーキテクチャの観点から見ると、一般保護違反はメモリアクセスに関してセグメンテーションベースの保護に特有のものです。ただし、ページングが使用されている場合、現在の特権レベル(CPL)からアクセスできない命令の使用など、メモリアクセス違反以外の他の保護違反を報告するためにも、一般保護違反は依然として使用されます。

理論的にはオペレーティング システムがページングとセグメンテーションの両方を利用することは可能ですが、ほとんどの場合、一般的なオペレーティング システムでは、メモリ アクセス制御のニーズの大半をページングに依存しています。

権限エラー

コンピュータには、オペレーティングシステム専用に予約されている機能がいくつかあります。オペレーティングシステムに属さないプログラムがこれらの機能のいずれかを使用しようとすると、一般保護違反が発生する可能性があります。

さらに、オペレーティングシステムとプロセッサ自体の両方のために予約されている記憶領域があります。これらの領域は予約されているため、読み取り専用であり、権限のないプログラムがデータを書き込もうとするとエラーが発生します。

故障の技術的な原因

一般保護違反は、ユーザー モード プログラムが保護された命令を試行しているか、オペレーティング システムがプロセッサを未定義の状態にする要求を発行したために、現在実行中のタスクの許可レベルを超える保護された命令に遭遇したときに、プロセッサによって発生します。

一般保護違反は、最新のオペレーティングシステムによって検出され、処理されます。通常、違反の原因がユーザーモードプログラムである場合、そのユーザーモードプログラムは終了します。ただし、違反の原因がコアシステムドライバーまたはオペレーティングシステム自体である場合、オペレーティングシステムは通常、診断情報をファイルまたは画面に保存し、動作を停止します。コンピュータを再起動するか、ブルースクリーン・オブ・デスカーネルパニックなどのエラー画面を表示します。

セグメント制限を超えました

セグメント制限を超えることができます:

セグメント権限違反

セグメント権限は次のような理由で侵害される可能性があります:

  • 実行不可能なセグメントへのジャンプ
  • コードセグメントまたは読み取り専用セグメントへの書き込み
  • 実行専用セグメントの読み取り

不正にロードされたセグメント

これは次の場合に発生する可能性があります:

  • スタック セグメント (SS) に、読み取り専用、実行可能、ヌル セグメント、または CS の現在の権限と一致しない記述子権限を持つセグメントのセグメント セレクタがロードされます。
  • データ、システム、またはヌル セグメントのセグメント セレクタがロードされたコード セグメント (CS)
  • SS、DS、ES、FS、またはGSは、システムセグメントのセグメントセレクターでロードされたセグメントです。
  • SS、DS、ES、FS、またはGSは、実行専用コードセグメントのセグメントセレクターでロードされたセグメントです。
  • DS、ES、FS、またはGSレジスタにヌルセ​​レクタが含まれている場合のメモリへのアクセス

切り替え

次の場合、タスク状態セグメント(TSS) 構造で障害が発生する可能性があります。

  • 呼び出しまたはジャンプ命令中にビジータスクに切り替える
  • 割り込み復帰(IRET)命令中に利用可能なタスクに切り替える
  • LDT内のTSS記述子を指すスイッチ上のセグメントセレクタを使用する[説明が必要]

その他

一般保護違反のその他の原因は次のとおりです。

  • ハンドラのコードセグメント記述子特権レベル(DPL)がゼロより大きいときに、仮想8086モードから割り込み/例外ハンドラにアクセスしようとする
  • CR4の予約ビットに1を書き込もうとしている
  • 現在の特権レベル(CPL)がゼロでない場合に特権命令を実行しようとする
  • 15バイトを超える長さの単一命令を実行しようとする(命令の先頭に余分なプレフィックスを付加する可能性がある)[2]
  • MSR命令の予約ビットへの書き込み
  • ヌルセグメントセレクタを含むゲートにアクセスする
  • CPLが割り込みゲートに設定されたDPLより大きい場合にソフトウェア割り込みを実行する
  • 呼び出し、割り込み、またはトラップゲートのセグメントセレクタがコードセグメントを指していない
  • 特権規則に違反する
  • 保護を無効にしながらページングを有効にする
  • 割り込み、トラップ、タスクゲートではない割り込みまたは例外の後に割り込み記述子テーブルを参照する
  • レガシーSSE : メモリ オペランドが 16 バイト境界に揃っていません。

参考文献

  1. ^ 「DrWatsonの「回復不可能なアプリケーションエラー」のトラブルシューティング」。サポート。Microsoft 。 2014年2月27日。
  2. ^ 「223ページ」 。 2023年9月24日閲覧

さらに読む

  • インテル アーキテクチャ ソフトウェア開発者マニュアル– 第 3 巻: システム プログラミング
「https://en.wikipedia.org/w/index.php?title=General_protection_fault&oldid=1317537299#Memory_errors」より取得