x86命令セットアーキテクチャ(ISA)における一般保護フォルト(GPF)は、カーネルまたはユーザープログラム内の実行中のコードによって引き起こされたアクセス違反に応答して、ISAで定義された保護メカニズムによって開始されるフォルト(割り込みの一種)です。このメカニズムは、1983年に発表されたIntel 80286 CPUのIntelマニュアルおよびデータシートで初めて説明されました。また、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では、製品バージョンによって、一般的な保護エラーの表示言語が異なります。
Windows 11では、一般的なセキュリティ障害に関するエラーメッセージは表示されなくなりました。障害が発生した場合は、プログラムが自動的に終了されます。
Windows 95、98、Me では、主に Windows 3.x プログラムで使用される別のエラー メッセージがあります。「プログラムでエラーが発生しました。作業を続けるには、[無視] をクリックして、作業内容を新しいファイルに保存してください。このプログラムを終了するには、[閉じる] をクリックしてください。最後に保存してから入力した情報は失われます。」[閉じる] をクリックすると、Windows のバージョンに応じて上記のエラー メッセージのいずれかが表示されます。[無視] をクリックした場合も同様のエラー メッセージが表示されることがあります。
Linuxやその他のUnix系システムでは、エラーは個別に報告されます(例えば、メモリエラーの場合はセグメンテーション違反)。
メモリエラーでは、エラーが発生したプログラムが、アクセスすべきでないメモリにアクセスします。例としては、以下のようなものがあります。
しかし、多くの最新のオペレーティングシステムは、メモリへのアクセス制御方式をセグメンテーションではなくページングによって実装しているため、Windowsなどのオペレーティングシステムでは、無効なメモリ参照が一般的な保護障害ではなくページフォールトとして報告されることがよくあります。オペレーティングシステムは通常、例外処理やシグナルなどの抽象化レイヤーを提供し、プログラムからメモリアクセスエラーを発生させるために使用された内部プロセッサメカニズムを隠蔽することで、プロセッサが生成するさまざまなエラー状態を処理するための標準インターフェースを提供します。
x86アーキテクチャにおいては、メモリアクセスに関するセグメンテーションベースの保護においては、一般的な保護違反が特に重要となります。しかしながら、ページングが使用されている場合、メモリアクセス違反以外の保護違反(例えば、現在の特権レベル(CPL)からアクセスできない命令の使用など)を報告するためにも、一般的な保護違反が使用されます。
理論的には、オペレーティングシステムがページングとセグメンテーションの両方を利用することは可能ですが、一般的に、一般的なオペレーティングシステムは、メモリへのアクセス制御のニーズの大部分をページングに依存しています。
コンピュータには、オペレーティングシステム専用に予約されている機能がいくつかあります。オペレーティングシステムの一部ではないプログラムがこれらの機能を使用しようとすると、一般的な保護エラーが発生する可能性があります。
さらに、オペレーティングシステムとプロセッサ自体用に予約されている記憶領域も存在します。これらの領域は予約されているため読み取り専用であり、権限のないプログラムがデータを書き込もうとするとエラーが発生します。
一般的な保護違反は、現在実行中のタスクの権限レベルを超える保護命令に遭遇した場合にプロセッサによって発生します。これは、ユーザーモードプログラムが保護命令を実行しようとしている場合、またはオペレーティングシステムがプロセッサを未定義の状態にするような要求を発行した場合のいずれかに発生します。
一般的な保護障害は、最新のオペレーティングシステムによって検出され、処理されます。通常、障害がユーザーモードプログラムで発生した場合は、そのユーザーモードプログラムが終了します。しかし、障害がコアシステムドライバまたはオペレーティングシステム自体で発生した場合は、オペレーティングシステムは通常、診断情報をファイルまたは画面に保存して動作を停止します。そして、コンピュータを再起動するか、ブルースクリーンやカーネルパニックなどのエラー画面を表示します。
セグメント制限を超える可能性があります:
セグメントのアクセス許可は、以下の方法で侵害される可能性があります。
これは次のような場合に発生する可能性があります。
タスク状態セグメント(TSS)構造では、次のような場合に障害が発生する可能性があります。
一般保護機能の故障のその他の原因は以下のとおりです。