
コンピュータサイエンスでは、階層的な保護ドメイン[ 1 ] [ 2 ]は、保護リングと呼ばれることが多く、障害(耐障害性の向上)や悪意のある動作(コンピュータセキュリティの提供)からデータと機能を保護するメカニズムです。
コンピュータのオペレーティングシステムは、リソースへのアクセスレベルを複数提供します。保護リングは、コンピュータシステムのアーキテクチャ内の2つ以上の階層的な特権レベルまたはレイヤーの1つです。これは一般的に、ハードウェアまたはマイクロコードレベルで異なるCPUモードを提供する一部のCPUアーキテクチャによってハードウェア的に強制されます。リングは、最も特権が高い(最も信頼されている、通常は番号0)ものから最も特権が低い(最も信頼されていない、通常はリング番号が最も大きい)ものまで階層的に配置されます。ほとんどのオペレーティングシステムでは、リング0が最も特権の高いレベルであり、特定のCPU機能(制御レジスタなど)やI/Oコントローラなどの物理ハードウェアと最も直接的にやり取りします。
外側のリングが内側のリングのリソースに、あらかじめ定義された方法でアクセスできるようにするための特別なメカニズムが用意されており、任意の利用を許可するものではありません。リング間のアクセスを適切に制御することで、あるリングまたは特権レベルのプログラムが、別のリングまたは特権レベルのプログラム向けに用意されたリソースを悪用することを防ぎ、セキュリティを向上させることができます。たとえば、リング 3 でユーザー プログラムとして実行されているスパイウェアは、ユーザーに通知することなく Web カメラをオンにすることができないはずです。ハードウェア アクセスは、デバイス ドライバ用に予約されたリング 1 の機能であるべきだからです。より高い番号のリングで実行されている Web ブラウザなどのプログラムは、より低い番号のリングに制限されているリソースであるネットワークへのアクセスを要求する必要があります。
2024年に発表されたインテルのキャンセルされたアーキテクチャであるX86Sには、リング0とリング3しかありません。リング1と2は、現代のオペレーティングシステムでは使用されないため、X86Sでは削除される予定でした。[ 3 ] [ 4 ]
マルチプリング保護は、今日のUnixファミリーのオペレーティングシステムの高度なセキュリティの前身であるMulticsオペレーティングシステムによって導入された最も革新的な概念の 1 つです。GE 645メインフレーム コンピュータには、他の GE-600 シリーズのマシンと同じ 2 つのモードやメモリ管理ユニット(「アペンディング ユニット」) のセグメント レベルのパーミッションなど、ハードウェア アクセス制御がいくつかありましたが、ハードウェアでのリングの完全なサポートを提供するには不十分だったため、Multics はソフトウェアでリング遷移をトラップすることによってそれらをサポートしました。[ 5 ]後継機のHoneywell 6180は、8 つのリングをサポートするハードウェアでそれらを実装しました。[ 6 ] Multics の保護リングは CPU モードとは別でした。リング 0 以外のすべてのリングのコードと、リング 0 の一部のコードはスレーブ モードで実行されました。[ 7 ]
しかし、ほとんどの汎用システムは、たとえ動作するハードウェアがそれ以上のCPUモードを提供していても、2つのリングしか使用しません。たとえば、Windows 7とWindows Server 2008(およびそれらの前身)は、リング0がカーネルモード、リング3がユーザーモードに対応する2つのリングしか使用しません[ 8 ]。これは、以前のバージョンのWindows NTが2つの保護レベルしかサポートしないプロセッサ上で動作していたためです[ 9 ] 。
多くの最新の CPU アーキテクチャ (人気のIntel x86アーキテクチャを含む) には何らかのリング保護機能が含まれていますが、Windows NTオペレーティングシステムは Unix と同様に、この機能を完全には利用していません。OS /2は、ある程度 3 つのリングを使用しています。[ 10 ]リング 0 はカーネル コードとデバイス ドライバ用、リング 2 は特権コード (I/O アクセス権限を持つユーザー プログラム) 用、リング 3 は非特権コード (ほぼすべてのユーザー プログラム) 用です。DOS では、カーネル、ドライバ、アプリケーションは通常リング 3 で実行されます (ただし、これは保護モード ドライバまたは DOS エクステンダーが使用されている場合に限られます。リアル モード OS では、システムは実質的に保護なしで実行されます)。一方、EMM386などの 386 メモリマネージャはリング 0 で実行されます。これに加えて、DR-DOSの EMM386 3.xx では、オプションで一部のモジュール ( DPMSなど) を代わりにリング 1 で実行できます。OpenVMSは、カーネル、エグゼクティブ、スーパーバイザー、ユーザーの4つのモードを使用します(権限の高い順に)。

この設計構造への関心が再び高まったのは、 Xen VMMソフトウェアの普及、モノリシックカーネルとマイクロカーネルに関する継続的な議論(特にUsenetニュースグループやWebフォーラム)、マイクロソフトのNGSCBイニシアチブの一環としてのRing-1設計構造、そしてIntel VT-x (旧Vanderpool)などのx86仮想化に基づくハイパーバイザーの登場によるものです。
オリジナルの Multics システムには 8 つのリングがありましたが、多くの最新のシステムではそれよりも少ないリングになっています。ハードウェアは、特別なマシン レジスタの助けを借りて、実行中の命令スレッドの現在のリングを常に認識しています。一部のシステムでは、代わりに仮想メモリの領域にハードウェアでリング番号が割り当てられます。1 つの例として、Data General Eclipse MV/8000があり、プログラム カウンタ (PC)の上位 3 ビットがリング レジスタとして機能していました。したがって、たとえば仮想 PC が 0xE200000 に設定されているコードを実行すると、自動的にリング 7 に入り、メモリの別のセクションにあるサブルーチンを呼び出すと、自動的にリング転送が行われます。
ハードウェアは、リング間で制御を渡す方法を厳しく制限し、リング間で実行できるメモリアクセスの種類にも制限を設けています。x86を例にとると、コール命令によって参照される特別なゲート構造があり、これにより、より下位レベル(より信頼できる)リングの事前定義されたエントリポイントへ制御を安全に転送できます。これは、リングアーキテクチャを採用している多くのオペレーティングシステムにおいて、スーパーバイザコールとして機能します。ハードウェアによる制限は、偶発的または悪意のあるセキュリティ侵害の機会を制限するように設計されています。さらに、最も特権の高いリングには、特別な機能(仮想メモリハードウェアをバイパスする実メモリのアドレス指定など)が付与される場合があります。
ARMバージョン7アーキテクチャは、アプリケーション(PL0)、オペレーティングシステム(PL1)、ハイパーバイザ(PL2)の3つの特権レベルを実装しています。通常とは異なり、レベル 0(PL0)は最も特権の低いレベルであり、レベル 2は最も特権の高いレベルです。[ 11 ] ARMバージョン8は、AArch64 [12 ] : D1-2454およびAArch32 [ 12 ] : G1-6013向けに、アプリケーション(EL0)、オペレーティングシステム(EL1)、ハイパーバイザ(EL2)、セキュアモニタ/ファームウェア(EL3)の4つの例外レベルを実装しています。
リング保護は、一部のシステムではプロセッサモード(マスター/カーネル/特権/スーパーバイザーモードとスレーブ/非特権/ユーザーモード)と組み合わせて使用できます。両方の保護方式をサポートするハードウェア上で動作するオペレーティングシステムは、両方の保護方式を使用することも、どちらか一方のみを使用することもできます。
リングアーキテクチャを効果的に利用するには、ハードウェアとオペレーティングシステムの緊密な連携が必要です。複数のハードウェアプラットフォームで動作するように設計されたオペレーティングシステムは、サポートされているすべてのプラットフォームにリングが存在しない場合、リングを限定的にしか利用しない可能性があります。ハードウェアがリングを通じてより細かい粒度を提供している場合でも、セキュリティモデルは「カーネル」と「ユーザー」に単純化されることがよくあります。[ 13 ]
コンピュータ用語では、スーパーバイザモードはハードウェアを介したフラグであり、システムレベルのソフトウェアで実行されるコードによって変更できます。システムレベルのタスクまたはスレッドは、実行中にこのフラグを設定できますが、ユーザーレベルのアプリケーションは設定できません。このフラグは、さまざまなディスクリプタテーブルのレジスタを変更したり、割り込みを無効にしたりといったマシンコード操作を実行できるかどうかを決定します。2つの異なる動作モードを用意するという考えは、「より大きな力にはより大きな責任が伴う」という考えに基づいています。スーパーバイザモードのプログラムは、失敗するとコンピュータシステム全体がクラッシュする可能性があるため、決して失敗しないことが求められます。
スーパーバイザモードは、「一部のプロセッサにおける実行モードで、特権命令を含むすべての命令の実行を可能にする。また、異なるアドレス空間、メモリ管理ハードウェア、その他の周辺機器へのアクセスも可能になる。これは、オペレーティングシステムが通常実行されるモードである。」[ 14 ]
モノリシックカーネルでは、オペレーティングシステムはスーパーバイザーモードで動作し、アプリケーションはユーザーモードで動作します。エクソカーネルやマイクロカーネルなど、他のタイプのオペレーティングシステムは、必ずしもこの動作を共有するとは限りません。
PC業界からの例をいくつか挙げます。
ほとんどのプロセッサには少なくとも2つの異なるモードがあります。x86プロセッサには4つの異なるモードがあり、それぞれが4つの異なるリングに分かれています。リング0で実行されるプログラムはシステムに対してあらゆる操作を実行でき、リング3で実行されるコードはいつでもシステム全体に影響を与えることなく障害を起こせるようにする必要があります。リング1とリング2はめったに使用されませんが、異なるアクセスレベルで構成することができます。
既存のほとんどのシステムでは、ユーザーモードからカーネルモードへの切り替えには、パフォーマンスに大きなコストがかかります。基本的な要求の場合getpid、ほとんどのマシンで 1000 ~ 1500 サイクルかかることが測定されています。このうち、実際の切り替え (ユーザー空間からカーネル空間へ 70、戻る 40) には約 100 サイクルしかかからず、残りは「カーネルのオーバーヘッド」です。[ 15 ] [ 16 ] L3 マイクロカーネルでは、このオーバーヘッドを最小限に抑えることで、全体のコストを約 150 サイクルに削減しました。[ 15 ]
モーリス・ウィルクスは次のように書いた。[ 17 ]
…やがて、リングが提供する階層的な保護はシステムプログラマの要求に必ずしも合致せず、2つのモードのみを持つ単純なシステムと比べてほとんど、あるいは全く改善をもたらさないことが明らかになった。保護リングはハードウェアでの効率的な実装には適していたが、それ以外に特筆すべき点はほとんどなかった。[…] 保護リングが解決策にならないことが判明した後も、きめ細かな保護の魅力は依然として残っていた。…しかし、これもまた行き止まりだった…。
パフォーマンスと決定性を向上させるために、一部のシステムでは、デバイスドライバではなくアプリケーションロジックと見なされる可能性が高い機能をカーネルモードに配置しています。セキュリティアプリケーション(アクセス制御、ファイアウォールなど)やオペレーティングシステムモニタがその例として挙げられます。少なくとも1つの組み込みデータベース管理システムであるe Xtreme DB Kernel Modeは、カーネルベースのアプリケーション機能用のローカルデータベースを提供し、カーネル機能がユーザーモードで実行されているデータベースシステムとやり取りする際に発生するコンテキストスイッチを排除するために、カーネルモードでの展開専用に開発されています。[ 18 ]
関数は、リングをまたいで逆方向に移動することもあります。例えば、Linuxカーネルは、通常システムコール(つまりリング遷移)を必要とする関数を含むvDSOセクションをプロセスに挿入します。これらの関数は、システムコールを実行する代わりに、カーネルが提供する静的データを使用します。これにより、リング遷移が不要になり、システムコールよりも軽量になります。gettimeofday関数はこのようにして提供できます。
IntelとAMDの最新CPUは、ハイパーバイザがリング0ハードウェアへのアクセスを制御するためのx86仮想化命令を提供します。Intel VT-x(コードネーム「Vanderpool」)とAMD-V (コードネーム「Pacifica」)は互換性はありませんが、どちらもゲストOSが他のゲストOSやホストOSに影響を与えることなく、リング0操作をネイティブに実行できます。
ハードウェア支援仮想化が登場する以前は、ゲストオペレーティングシステムはリング 1で動作していました。より高い特権レベル(リング 0)を必要とする操作を実行しようとすると、割り込みが発生し、ソフトウェアで処理されます。これは「トラップとエミュレーション」と呼ばれます。
仮想化を支援し、上記の理由によるオーバーヘッドを削減するために、VT-x と AMD-V はゲストが Ring 0 で実行できるようにします。VT-x は VMX ルート/非ルート操作を導入します。ハイパーバイザは VMX ルート操作モードで実行され、最高の特権を持ちます。ゲスト OS は VMX 非ルート操作モードで実行され、 実際のハードウェア特権を持たずに Ring 0 で動作できます。VMX 非ルート操作と VMX 遷移は、仮想マシン制御と呼ばれるデータ構造によって制御されます。[ 19 ] これらのハードウェア拡張機能により、従来の「トラップおよびエミュレート」仮想化を x86 アーキテクチャで実行できますが、ハードウェア サポートが提供されます。
x86命令セットの特権レベルは、プロセッサ上で現在実行中のプログラムがメモリ領域、I/Oポート、特殊命令などのリソースにアクセスする際の制御を行います。特権レベルは0が最も特権が高く、3が最も特権が低い4段階です。最新のオペレーティングシステムのほとんどは、カーネル/実行プログラムにレベル0を、アプリケーションプログラムにレベル3を使用します。レベルnで使用可能なリソースは、レベル0からnまで全て使用可能であるため、特権レベルはリング状になっています。特権の低いプロセスが特権の高いプロセスにアクセスしようとすると、OSに一般的な保護違反例外が報告されます。
4 つの特権レベルすべてを使用する必要はありません。Microsoft Windows、macOS、Linux、iOS、Androidなど、市場シェアの大きい現在のオペレーティングシステムは、ほとんどがページングメカニズムを使用しており、特権レベルをスーパーバイザーまたはユーザー (U/S ビット) のいずれかとして指定するビットは 1 つだけです。Windows NTは 2 レベルのシステムを使用しています。[ 20 ] リアル モードで実行されるコードはレベル 0 (最高の特権レベル) で実行されますが、仮想 8086 モードで実行されるコードはレベル 3 で実行されます。[ 21 ]
x86 ISA ファミリーがサポートする複数の特権レベルの将来的な用途としては、コンテナ化や仮想マシンが挙げられます。ホストオペレーティングシステムのカーネルは、完全な特権アクセス (カーネルモード) を持つ命令を使用できますが、仮想マシンまたはコンテナ内のゲスト OS 上で実行されるアプリケーションは、ユーザーモードで最低レベルの特権を使用できます。仮想マシンとゲスト OS カーネル自体は、ゲストオペレーティングシステムの観点から、システムコールなどのカーネルモード操作を呼び出し、仮想化するために、中間レベルの命令特権を使用できます。 [ 22 ]
IOPL (I/O特権レベル)フラグは、すべてのIA-32互換x86 CPUに搭載されているフラグです。FLAGSレジスタのビット12と13を占めます。プロテクトモードとロングモードでは、現在のプログラムまたはタスクのI/O特権レベルを示します。タスクまたはプログラムがI/ Oポートにアクセスするには、タスクまたはプログラムの現在の特権レベル(CPL)(CPL0、CPL1、CPL2、CPL3)がIOPL以下である必要があります。
IOPLは、現在の特権レベルがリング0の場合に限りPOPF(D)、を使用して変更できます。IRET(D)
IOPLに加えて、 TSSのI/Oポート権限も、タスクがI/Oポートにアクセスできるかどうかを決定する上で重要な役割を果たします。
x86システムでは、x86ハードウェア仮想化(VT-xおよびSVM)は「リング -1」、システム管理モードは「リング -2」、Intel Management EngineおよびAMD Platform Security Processorは「リング -3」と呼ばれることがある。[ 23 ]
多くのCPUハードウェアアーキテクチャは、通常実行されるオペレーティングシステムが活用するよりもはるかに多くの柔軟性を提供します。複雑なCPUモードを適切に使用するには、オペレーティングシステムとCPU間の非常に緊密な連携が必要であり、そのためOSはCPUアーキテクチャに縛られる傾向があります。OSとCPUが互いのために特別に設計されている場合は、これは問題になりません(ただし、一部のハードウェア機能は活用されないままになる可能性があります)が、OSが複数の異なるCPUアーキテクチャと互換性を持つように設計されている場合、CPUモード機能の大部分はOSによって無視される可能性があります。たとえば、Windowsが2つのレベル(リング0とリング3)しか使用しない理由は、過去にサポートされていた一部のハードウェアアーキテクチャ(PowerPCやMIPSなど)が2つの特権レベルしか実装していなかったためです。[ 8 ]
Multicsは、特定のCPUアーキテクチャ(それ自体がMultics専用に設計されたもの)向けに設計されたオペレーティングシステムであり、利用可能なCPUモードを最大限に活用していました。しかし、これは例外的なケースでした。今日では、セキュリティと安定性の面で潜在的な利点があるにもかかわらず、OSとハードウェア間の高度な相互運用性は、必ずしも費用対効果が高いとは言えません。
最終的に、CPUに異なる動作モードを設ける目的は、ソフトウェアによるシステム環境の偶発的または意図的な破損(およびそれに伴うシステムセキュリティの侵害)からハードウェアを保護することです。システムソフトウェアのうち「信頼できる」部分のみが、カーネルモードの制限のない環境で実行を許可され、しかも、典型的な設計では、絶対に必要な場合にのみ実行されます。その他のソフトウェアはすべて、1つ以上のユーザーモードで実行されます。プロセッサがユーザーモードで障害または例外状態を生成した場合、ほとんどの場合、システムの安定性には影響しません。一方、プロセッサがカーネルモードで障害または例外状態を生成した場合、ほとんどのオペレーティングシステムは回復不能なエラーでシステムを停止します。モードの階層構造(リングベースのセキュリティ)が存在する場合、ある特権レベルでの障害や例外は、それより上位の特権レベルのみを不安定化させる可能性があります。したがって、リング0(最も高い特権を持つカーネルモード)での障害はシステム全体をクラッシュさせますが、リング2での障害は、せいぜいリング3以降とリング2自体にしか影響しません。
特権レベルが高い状態から低い状態へ移行する場合(カーネルモードからユーザーモードへ移行する場合など)、モード間の移行は実行スレッドの裁量に委ねられますが、低い特権レベルから高い特権レベルへ移行する場合は、特別な命令を実行するか、外部割り込みを受信したときに通過する、ハードウェア制御の安全な「ゲート」を介してのみ行うことができます。
マイクロカーネルオペレーティングシステムは、セキュリティと洗練性の観点から、特権モードで実行されるコードの量を最小限に抑えようとします。
長年にわたり、x86 は 4 つの保護モードまたはリングをサポートしてきました [...]。リング 3 は最も権限が低い [...]。リング 0 は最も権限が高い [...]。残りの 2 つのリングは、現在のどのオペレーティングシステムでも使用されていません。
過去にサポートされていた一部のハードウェアアーキテクチャ(Compaq AlphaやSilicon Graphics MIPSなど)が2つの特権レベルしか実装していなかったためです。
長年にわたり、x86 は 4 つの保護モードまたはリングをサポートしてきました [...]。リング 3 は最も権限が低い [...]。リング 0 は最も権限が高い [...]。残りの 2 つのリングは、現在のどのオペレーティングシステムでも使用されていません。