なぜx86 CPUは4つのうち2つの「リング」しか使わないのですか?
オペレーティングシステムとハードウェアがどのように動作し、相互に作用し合うかについてもっと学ぶとき、奇妙なことや「リソース」の使用率の低下が発生しているように見えることに驚くかもしれません。何故ですか?本日のSuperUser Q&A投稿には、興味をそそられる読者の質問に対する答えがあります。.
本日の質疑応答セッションは、コミュニティ主導のQ&A Webサイトのグループである、Stack Exchangeの下位区分であるSuperUserの好意により提供されます。.
写真提供:Lemsipmatt(Flickr).
質問
SuperUserの読者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. しかし、それはほんの1ビットなので、ページごとの保護レベルでは、メモリ保護に関する限り利用可能な「モード」の数は2つだけです。ページは非特権モードからアクセスできるかどうか。したがって、2つのリングだけです。各ページに4つの可能なリングを有するためには、それらは4つの可能なリング番号のうちの1つを符号化するために各ページテーブルエントリ内に2つの保護ビットを持たなければならない。しかし、そうではありません.
もう1つの理由は、オペレーティングシステムの移植性に対する要望です。 x86だけではありません。 UNIXは、オペレーティングシステムは複数のプロセッサアーキテクチャに比較的移植性があり、それは良いことだと教えてくれました。そしていくつかのプロセッサは2つのリングだけをサポートします。アーキテクチャ内の複数のリングに依存しないことで、オペレーティングシステムの実装者はオペレーティングシステムの移植性を高めました。.
Windows NT開発に固有の3番目の理由があります。 NTの設計者(MicrosoftがDEC Western Region Labsから雇ったDavid Cutlerと彼のチーム)は、以前にVMSに関する豊富な経験を持っていました。実際、Cutlerと他の少数はVMSのオリジナルデザイナーの一人でした。 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風カーネルがその上に実装されるずっと前に設計されたもので、オペレーティングシステムが何を使用するのか実際にはわかりませんでした。私たちが本物のUnix風のカーネルやVMS風のカーネルを実装できるのは、私たちがx86でページングしたときではありませんでした。.
最新のx86オペレーティングシステムはセグメント化をほとんど無視しているだけではありません(それらはベースアドレスが0でサイズが4 GBのC、D、およびSセグメントを設定するだけです。 )、彼らはまた、「タスク状態セグメント」のようなことをほとんど無視します。 TSSメカニズムはスレッドコンテキストの切り替え用に明確に設計されていますが、副作用が多すぎることが判明したため、最新のx86オペレーティングシステムでは「手作業」で行われています。 x86 NTがハードウェアタスクを変更するのは、二重障害例外のように、本当に例外的な状況のためだけです。.
x64アーキテクチャに関しては、使われていないこれらの機能の多くは省かれていました。彼らの信用のために、AMDは実際にオペレーティングシステムのカーネルチームと話をして、彼らがx86から何を必要としていたか、彼らが必要としなかったか、望まなかったか、そして彼らが何を加えたいか尋ねた。 x64上のセグメントは、いわゆる残留形式、タスク状態切り替えが存在しないなどの場合にのみ存在し、オペレーティングシステムは2つのリングのみを使用し続けます。.
説明に追加するものがありますか?コメントで音を消す。他の技術に精通したStack Exchangeユーザーからの回答をもっと読みたいですか?こちらのディスカッションスレッドをチェックしてください。.