ユーザモードとカーネルモードの違い:命令・メモリ・切り替え・コスト・保護を比較
CPUには、アプリケーションが動くユーザモードと、OSのカーネルが動くカーネルモード(特権モード)があります。ユーザモードでは、ページテーブルの設定や入出力の操作、割り込みの禁止などの特権命令を実行できず、自分のプロセスのメモリにしかアクセスできません。ファイルの読み書きなどが必要なときは、システムコールでカーネルに頼みます。こうして、1つのアプリケーションの不具合や悪意が、ほかのプロセスやOS、ハードウェアに及ばないようにしています。
| 項目 | ユーザモード | カーネルモード |
|---|---|---|
| 動くプログラム | アプリケーション | OSのカーネル、多くのデバイスドライバ |
| 実行できる命令 | 通常の命令だけ。特権命令を実行すると例外になる | すべての命令。ページテーブルの切り替え、割り込みの許可と禁止、制御レジスタの設定など |
| アクセスできるメモリ | 自分のプロセスの仮想アドレス空間のうち、ユーザに許されたページだけ | カーネルの領域を含むすべて。物理メモリや装置のレジスタも扱える |
| 装置の操作 | 直接はできない。システムコールでカーネルに頼む | 直接レジスタを読み書きし、割り込みを処理する |
| アーキテクチャでの呼び名(例) | x86のリング3、ArmのEL0、RISC-VのUモード | x86のリング0、ArmのEL1、RISC-VのSモード |
| モードが切り替わるきっかけ | システムコールの命令(syscall、svc、ecallなど)、装置やタイマの割り込み、例外(ページフォルト、0での割り算、不正な命令など)でカーネルモードに入る | 専用の復帰命令(sret、eretなど)で、戻り先とモードを同時に戻してユーザモードに戻る |
| 切り替えのコスト(目安) | システムコールの往復で、おおむね100 ns〜1 µs程度。脆弱性の対策で増えることもある | カーネルの中の処理どうしは関数呼び出しで、モードの切り替えはない。プロセスの切り替え(コンテキストスイッチ)はさらに重い |
| 不具合の影響 | そのプロセスだけが強制終了される | システム全体が止まることがある(カーネルパニックなど) |
数値は代表的な目安で、世代や製品によって異なります。