/ /なぜx86 CPUは4つの「リング」のうち2つしか使用しないのですか?

x86 CPUが4つの「リング」のうち2つしか使用しないのはなぜですか?

why-do-x86-cpus-only-use-two-out-of-four-rings-00

オペレーティングシステムの詳細について学ぶときそして、彼らが仕事中に実行し、相互にやり取りするハードウェアは、奇妙であると思われるものや、発生する「リソース」の利用率が低いことに驚くかもしれません。何故ですか?本日のSuperUser Q&A投稿には、読者からの好奇心question盛な質問への回答が含まれています。

本日の質疑応答セッションは、コミュニティ主導のQ&A WebサイトのグループであるStack Exchangeの下位部門であるSuperUserのご厚意によるものです。

写真はLemsipmatt(Flickr)提供。

質問

スーパーユーザーリーダーのAdHominemは、x86 CPUが4つのリングのうち2つだけを使用する理由を知りたいと考えています。

LinuxおよびWindowsベースのx86システムのみが使用 リング0 カーネルモードと リング3 ユーザーモード用。とにかく2つだけを使用することになった場合、プロセッサが4つの異なるリングを区別するのはなぜですか? AMD64アーキテクチャでこれは変わりましたか?

x86 CPUが4つのリングのうち2つしか使用しないのはなぜですか?

答え

SuperUserの寄稿者であるJamie Hanrahanが私たちに答えてくれます。

主に2つの理由があります。

1つ目は、x86 CPUは提供していますがメモリ保護の4つのリング、それによって提供される保護の粒度は、セグメントごとのレベルでのみです。つまり、各セグメントは、書き込み禁止などの他の保護とともに特定のリング(特権レベル)に設定できます。ただし、利用可能なセグメント記述子はそれほど多くありません。ほとんどのオペレーティングシステムでは、個々のページのように、より細かい粒度のメモリ保護が必要です。

したがって、ページテーブルベースの保護を入力します。 すべてではありませんが、ほとんどの場合、最新のx86オペレーティングシステムは(とにかくできる限り)セグメント化メカニズムを多かれ少なかれ無視し、ページテーブルエントリの下位ビットから利用可能な保護に依存しています。これらの1つは「特権」ビットと呼ばれます。このビットは、ページにアクセスするためにプロセッサが「特権」レベルの1つである必要があるかどうかを制御します。 「特権」レベルは PL 0、1、および2。しかし、それはほんの少しなので、ページごとにメモリ保護に関する限り、使用可能な「モード」の数は2つだけです。非特権モードからページにアクセスできるかどうか。したがって、ちょうど2つのリング。各ページに4つの可能なリングを設定するには、各ページテーブルエントリに2つの保護ビットを持たせて、4つの可能なリング番号の1つをエンコードする必要があります(セグメント記述子と同様)。ただし、そうではありません。

もう1つの理由は、オペレーティングシステムに対する要望です。移植性。 x86だけではありません。 Unixは、オペレーティングシステムがマルチプロセッサアーキテクチャに比較的移植性があり、良いことだと教えてくれました。また、一部のプロセッサは2つのリングのみをサポートしています。アーキテクチャ内の複数のリングに依存しないことにより、オペレーティングシステムの実装者は、オペレーティングシステムの移植性を高めました。

に固有の3番目の理由がありますWindows NT開発。 NTのデザイナー(MicrosoftがDEC Western Region Labsから採用したDavid Cutlerと彼のチーム)は、VMSで以前に豊富な経験がありました。実際、Cutlerと他のいくつかはVMSのオリジナルデザイナーの1人でした。また、VMSが設計されたVAXプロセッサには4つのリングがあります(VMSは4つのリングを使用します)。

しかし、VMSで実行されたコンポーネント リング1および2 (それぞれ、レコード管理サービスとCLI)は、NT設計から除外されました。 リング2 VMSでは実際にはオペレーティングシステムについてではありませんでしたセキュリティではなく、ユーザーのCLI環境をあるプログラムから次のプログラムに保存することについてであり、Windowsにはその概念がありませんでした。 CLIは通常のプロセスとして実行されます。 VMSの リング1、のRMSコード リング1 に電話しなければならなかった リング0 かなり頻繁に、そしてリング遷移は高価です。に行く方がはるかに効率的であることが判明しました リング0 たくさん持っているのではなく、それでやります リング0 内の遷移 リング1 コード(再度、NTがとにかくRMSのようなものを持っているわけではありません)。

x86が4つのリングを実装した理由オペレーティングシステムはそれらを使用しませんでした、あなたはx86よりもはるかに最近の設計のオペレーティングシステムについて話している。 x86のシステムプログラミング機能の多くは、NTまたは真のUnix系カーネルが実装されるずっと前に設計されたものであり、オペレーティングシステムが何を使用するかを実際には知りませんでした。 x86でページングを取得するまで、真のUnix系またはVMS系のカーネルを実装できませんでした。

最新のx86オペレーティングシステムだけでなく、セグメント化を無視します(ベースアドレスが0でサイズが4 GBのC、D、およびSセグメントをセットアップします。FおよびGセグメントは、主なオペレーティングシステムのデータ構造を指すために使用されることがあります)。 「タスク状態セグメント」。 TSSメカニズムは、スレッドコンテキストスイッチング用に明確に設計されていますが、副作用が多すぎるため、最新のx86オペレーティングシステムが「手作業」で行っています。 x86 NTがハードウェアタスクを変更するのは、二重障害例外などの真に例外的な条件の場合のみです。

x64アーキテクチャに関しては、これらの多くが使用されなくなった機能は除外されました。彼らの名誉のために、AMDは実際にオペレーティングシステムカーネルチームと話をし、x86に必要なもの、不要なもの、不要なもの、追加したいものを尋ねました。 x64上のセグメントは、痕跡形と呼ばれる可能性のあるものにのみ存在し、タスク状態の切り替えは存在しないなどです。オペレーティングシステムは引き続き2つのリングのみを使用します。


説明に追加するものがありますか?コメントで鳴り響きます。他の技術に精通したStack Exchangeユーザーからの回答をもっと読みたいですか?こちらでディスカッションスレッド全体をご覧ください。