カーネルモードとユーザーモードの違い
CPUはなぜプログラムごとに異なる権限を与えるのですか?
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
CPUはすべてのコードを同じ権限で実行するわけではありません。 オペレーティングシステムのコアコードは、高権限のKernel Mode(カーネルモード)で実行し、一般プログラムは制限されたUser Mode(ユーザーモード)で実行する。
よく言われるカーネルレベルとユーザーレベルもこの権限領域を指すことが多い。
ユーザーモード
ブラウザ、ゲーム、メッセンジャーなどのアプリケーションプログラムはユーザーモードで実行されます。
- ハードウェアを直接制御できない。
- 任意の物理メモリにアクセスできません。
- 他のプロセスのメモリを勝手に読み取ることはできません。
- 問題が発生しても、通常そのプロセスだけが終了します。
プログラムごとに別々の仮想アドレス空間が提供されるため、互いに同じアドレス値を使用しても実際には異なるメモリを指すことができる。
カーネルモード
カーネルモードでは、CPUの特権命令を実行し、システム全体のメモリとデバイスを管理することができる。
- ページテーブルと仮想メモリを管理します。
- 割り込みを処理します。
- プロセスとスレッドをスケジュールします。
- デバイスドライバを実行します。
- 要求が正しいことを確認したら、ハードウェア操作を実行してください。
権限が大きいほどカーネルモードのバグは影響も大きい。 間違ったドライバーがオペレーティングシステム全体を停止させることができる理由だ。
2つの領域はシステムコールで接続されています
ユーザープログラムがファイルを読み取るかネットワークデータを送信するには、カーネルに要求する必要があります。
ユーザーモードプログラム
↓ System Call
権限チェック+カーネルモードに入る
↓
ファイル、メモリ、デバイス操作
↓
ユーザーモードに戻る
ユーザーモードとカーネルモードの切り替えは、単純な関数呼び出しと同じではありません。 CPU権限を変更し、カーネルが渡されたアドレスと長さが安全かどうかを調べ、結果を返す必要があります。
カーネルモードがユーザーモードよりも無条件に高速な領域であるという意味ではありません。 2つの違いは、速度評価ではなく、実行可能なコマンドとアクセス可能なリソースの権限の違いです。
この境界を置く理由は不便にするためではない。 一般プログラムのミスや攻撃がコンピュータ全体の制御権に直ちにならないように防ぐためだ。