CPUモード
CPUモード(プロセッサモード、特権レベル)とは、コンピュータのCPUの動作モードであり、CPUが実行できる操作を制限するものである[注 1]。
モードの種類
複数の動作モードを持つCPUでは、そのうちの少なくとも1つは完全に無制限のCPU動作を許す。この無制限のモードを通常カーネルモード(あるいはスーパーバイザーモード、特権モード)と呼ぶ。他のモードは通常ユーザーモードと呼ばれるが、別の名で呼ばれることもある(「スレーブモード」など)。
カーネルモードでは、CPUはそのアーキテクチャの全ての操作が可能である(ハードウェア構成によっては不可能な操作もありうる)。任意の命令を実行でき、入出力操作を開始でき、全メモリ空間にアクセス可能である。他のCPUモードでは、ハードウェアによってCPUの動作に制限が加えられる。典型的には、一部の命令が実行できなくなり、入出力操作ができなくなり、メモリ空間の一部にアクセスできなくなる。通常、ユーザーモードでのCPUの機能はカーネルモードでの機能のサブセットであるが、場合によっては(例えば他のアーキテクチャのハードウェアをエミュレーションしている場合など)、カーネルモードのサブセットとは言えない全く異なった機能になっていることもある。
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/25/CPU_ring_scheme.svg/220px-CPU_ring_scheme.svg.png)
CPUアーキテクチャによっては様々なモードをサポートする。たとえば組込み用プロセッサでは割り込みハンドラ用などのモードを別に持つものがある。また、複数のユーザーモードをサポートし、階層を形成するものもある。このようなアーキテクチャを「リングプロテクション」と呼び、図のようにカーネルモードを中心とした同心円状に概念化することがある。Multicsのハードウェアはリングプロテクションを大々的に採用した最初の例であるが、他の多くのハードウェアプラットフォームも同様の考え方で設計されている。例えば、Intel 80286のプロテクトモードやItaniumなどがある。階層化されたリングプロテクションは、ハイパーバイザ上でのオペレーティングシステムの実行や、デバイスドライバ、またマイクロカーネルにおける「サーバ」の隔離などに活用されることがある。
モード保護はCPU自身だけでなく、他のリソースにも応用されることがある。CPUのレジスタが現在の動作モードを保持するが、それ以外に仮想記憶関連のレジスタやページテーブルエントリなどにモードを識別する情報を格納することがある。例えば、CPUはステータスレジスタに示されるリング0で動作しているとしても、メモリへのアクセス毎にアクセス対象の仮想メモリセグメントのリング番号をチェックし、マッピングされている物理ページのリング番号をチェックするといったことが考えられる。
CPUモードとソフトウェアの関係
多くのCPUハードウェアアーキテクチャは、通常実行しているオペレーティングシステムが利用する以上の柔軟性を有している。複雑なCPUモードの適切な利用はCPUとオペレーティングシステムの密接な協力が必要であり、OSとCPUアーキテクチャを拘束する傾向がある。OSとCPUが相互に相手を意識して設計された場合、問題はない(それでもハードウェア機能の一部は使われないことがある)が、OSが複数の他のCPUでも動作することを考慮して設計された場合、OSはCPUモード機能の大部分を利用しなくなる。例えば、Windows NTは多くのアーキテクチャへの移植性を考慮して設計されたため、ユーザーモードとカーネルモードだけをサポートした。
Multicsは特定のCPUアーキテクチャ(Multicsのために設計された)を意識して設計されたオペレーティングシステムであり、そのCPUモード機能を全て使用した。しかし、これは例外である。今日、OSとハードウェアの密接な相互依存は、セキュリティと安定性という観点では効果があるものの、費用対効果が悪くなる。
CPUの動作モードを区別する最終的な目的は、ソフトウェアによるシステム環境の偶然または故意の破損(と関連するシステムセキュリティ違反)からハードウェアを守ることにある。信頼できるシステムソフトウェアだけが必要なときだけ無制限のカーネルモードで動作することを許される。他の全てのソフトウェアは1つかそれ以上のユーザーモードで実行される。プロセッサがユーザーモードでフォールトや例外を発生しても、多くの場合システムの安定性は影響されない。カーネルモードでフォールトや例外が発生すると、多くのオペレーティングシステムはシステムを停止させる(クラッシュ)。モードの階層があると(リングプロテクション)、ある特権レベルのフォールトや例外は上位特権レベルには影響しないが、下位レベルの方はその限りではない。従って、リング0(最高特権レベルのカーネルモード)でのフォールトはシステム全体のクラッシュを引き起こすが、リング2でのフォールトはリング2以下(リング3など)に影響を与える可能性がある。
走行中スレッドのCPUモードの変更は高い特権レベルから低い特権レベルの場合は自由に行えるが、低い方から高い方への変更はハードウェアが制御するセキュアな「ゲート」を特殊な命令を使って通過することでなされる(または割り込みを受け付けることでも高い特権レベルへのモード変更がなされる)。これがシステムコールである。
マイクロカーネル方式のオペレーティングシステムは特権モードで動作するコード量を最小化することを意図している。それによって性能が低下してもセキュリティは高まると言う人もいる。
脚注
- ^ ただし、本記事で説明するモードとはまったく異なる意味の「モード」もありうる。例えばバイエンディアンのプロセッサ(エンディアンの切り替えが可能なプロセッサ)には、モードを持っていて、どちらのエンディアンで動作するかをモード切り替えによって切り替えるものがある。