ユーザモードとカーネルモードの違い:命令・メモリ・切り替え・コスト・保護を比較

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程度。脆弱性の対策で増えることもあるカーネルの中の処理どうしは関数呼び出しで、モードの切り替えはない。プロセスの切り替え(コンテキストスイッチ)はさらに重い
不具合の影響そのプロセスだけが強制終了されるシステム全体が止まることがある(カーネルパニックなど)

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

ユーザモード
アプリケーションやライブラリの通常の処理。計算やメモリの読み書きは、カーネルを通さずにユーザモードのまま速く行います。
カーネルモード
ファイルやネットワークの入出力、メモリの割り当て、プロセスの切り替え、割り込みの処理など、資源の管理と保護が必要な処理。
性能のための工夫
システムコールの回数を減らすため、ユーザ空間のバッファにためてまとめて書き出したり、一部の処理を共有メモリや専用のしくみでユーザモードのまま行ったりします。

よくある質問

なぜユーザモードとカーネルモードを分けるのですか?

アプリケーションが、ページテーブルや装置を勝手に操作できないようにするためです。分けておけば、あるプログラムに不具合があっても、ほかのプロセスやOSのメモリを壊したり、装置を乗っ取ったりできず、そのプログラムを終了させるだけで済みます。

ユーザモードからカーネルモードに切り替わるのはどんなときですか?

3つのきっかけがあります。プログラムが自分から依頼するシステムコール、装置やタイマからの割り込み、そしてページフォルトや0での割り算などの命令の実行による例外です。どの場合も、CPUがモードを切り替えて、カーネルの決まった入口から処理を始めます。

システムコールはなぜ遅いのですか?

モードの切り替えに加えて、レジスタの保存と復元、引数の確認、カーネルの入口と出口での処理が必要だからです。脆弱性の対策でページテーブルを切り替える場合はさらに重くなります。1回は短くても、小さな読み書きのたびに呼ぶと大きな負担になります。

モードの切り替えとコンテキストスイッチは同じですか?

違います。システムコールでのモードの切り替えは、同じプロセスのままカーネルの処理に入るだけです。コンテキストスイッチは、実行するプロセスやスレッドそのものを入れ替えることで、アドレス空間の切り替えなども伴うため、より重い処理です。

理解度チェック

CPUに特権モード(カーネルモード)とユーザモードを設ける主な目的はどれか。

  1. Aアプリケーションの命令を、カーネルの命令より速く優先して実行できるようにするため
  2. Bアプリケーションがページテーブルや装置を勝手に操作できないよう保護するため
  3. C1つのCPUで同時に2つの命令を実行できるようにするため
答えと解説を見る

正解:B. アプリケーションがページテーブルや装置を勝手に操作できないよう保護するため

ページテーブルの書き換えや入出力装置の操作、割り込みの禁止などをアプリケーションが自由にできると、ほかのプログラムのメモリを壊したりシステム全体を止めたりできてしまいます。そこでCPUは、これらの命令を特権モードでしか実行できないようにし、OSのカーネルだけが使えるようにしています。ユーザモードで実行しようとすると例外になります。速さや同時実行のためのしくみではありません。

アプリケーションがファイルの読み書きなどをOSに依頼するしくみを何と呼ぶか。

  1. Aシステムコール
  2. Bコンテキストスイッチ
  3. Cデマンドページング
答えと解説を見る

正解:A. システムコール

アプリケーションはユーザモードで動いているため、ディスクや装置を直接操作できません。そこでシステムコールを使い、専用の命令で特権モードに切り替えてカーネルの処理を呼び出し、ファイルの読み書きやメモリの確保、プロセスの生成などを依頼します。処理が終わるとユーザモードに戻ります。コンテキストスイッチは実行するプロセスを切り替えること、デマンドページングはページを必要になったときに読み込む方式です。

割り込みと例外の違いとして一般的な説明はどれか。

  1. A割り込みはソフトウェアだけが起こすもので、例外はハードウェアの回路だけが起こすもの
  2. B割り込みは装置などの外部の要因で起こり、例外は命令の実行の結果として起こる
  3. C割り込みは処理のあとで元に戻れず、例外は必ず元の処理に戻れる
答えと解説を見る

正解:B. 割り込みは装置などの外部の要因で起こり、例外は命令の実行の結果として起こる

割り込みは、入出力装置の完了通知やタイマーなど、実行中の命令とは関係のない外部の要因で、いつ起こるか決まっていない(非同期の)ものです。例外は、ゼロ除算、不正な命令、ページフォルト、システムコールの命令など、特定の命令を実行した結果として起こる(同期の)ものです。どちらも割り込みハンドラで処理したあと元の処理に戻れることが多く、戻れるかどうかで分けるわけではありません。

  1. 上のRISC-Vのコードの最後のecall命令が実行されたときに起こることとして正しいものはどれか。
  2. 割り込みや例外の処理を終えて元のプログラムに戻るとき、通常の関数の戻り命令ではなく、専用の復帰命令(RISC-Vのsret・mretなど)を使う理由はどれか。
  3. 小さなデータを1バイトずつ書き出すときに、毎回システムコールを呼ぶより、ユーザ空間のバッファにためてからまとめて書き出す方が速くなる主な理由はどれか。

OSとハードウェアの練習問題へ

関連する用語の解説

特権モード
OSのカーネルだけが使える、CPUの動作モード。ページテーブルの設定や入出力の操作など危険な命令を実行でき、アプリケーションが動くユーザモードと区別される。
システムコール
アプリケーションがファイルの読み書きやメモリの確保などをOSに依頼するしくみ。専用の命令で例外を起こして特権モードに切り替え、カーネルの処理を呼び出す。
割り込みハンドラ
割り込みや例外が起きたときにCPUが実行する処理。中断した処理の状態を保存し、原因に応じた処理をして、元の処理に戻る。処理はできるだけ短くするのが原則。
ページテーブル
仮想アドレスのページ番号から物理アドレスのページ番号への対応を記録した表。OSがプロセスごとに作り、CPUのMMUが参照してアドレスを変換する。各項目には保護のためのビットも含まれる。
コンテキストスイッチ
CPUで実行するプロセスやスレッドを切り替えること。レジスタやプログラムカウンタなどの状態を保存・復元し、プロセスの切り替えではアドレス空間も切り替える。

関連する比較