ウィスコンシン大学が公開している Operating System: Three Easy Pieces の第六章で、プロセスという抽象化がどのようにして CPU を効率的に使おうとするかの描写を読んだ。
https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf
断片的に知っていた語句がひとつの文脈に沿って整理されていて、おそらく重要な知識がギュッと詰まっているようにおもわれる。実際にコードを読んだわけでも実験したわけでもないから、本当のところはまだわかっていなそうだけれど、ひとまずこのように箇条書きしておいてみる。いつかここに戻ってくることがあるかはわからないけど…。
- CPU が命令を実行するときにとるモードはふたつある。
- カーネルモードは特権命令を実行する。
- ユーザーモードは特権命令の権限をもたない。ファイルシステムに好き勝手にアクセスしたりできない。
- ユーザープログラムはシステムコールを使ってシステムにアクセスする
- システムコールはカーネルへのトラップ命令を起こす
- トラップ命令は
- レジスタの状態を保存して
- ユーザーモードをカーネルモードに変更して
- トラップテーブルにもとづいてジャンプする
- OS はシステムコールの処理を終えるとリターンフロムトラップ命令を起こす
- リターンフロムトラップ命令は
- ジャンプする前のもといた位置に戻って
- カーネルモードをユーザーモードに戻して
- レジスタの状態を復元する
- リターンフロムトラップ命令は
- OS 起動時にトラップテーブルがカーネルモードで定義される
- どのトラップ (例外) が発生したときにどこにジャンプするかが書かれている
- こうしてトラップによって OS がプロセスを制御するプロトコルを Limited Direct Execution という
- トラップテーブルはユーザープログラムから書き換えることが容易であってはならない
- CPU を仮想化していくつものプロセスが同時に動いているように “みせかける” ためのメカニズムである
- どのトラップ (例外) が発生したときにどこにジャンプするかが書かれている
- システムコールが起こるとき、コンテクストスイッチをおこなう選択肢がうまれる
- システムコールが起こるまでコンテクストスイッチをおこなうことができないのは困る
- これではたとえばシステムコールを伴わない無限ループから脱出できなくなる
- それを避けるために、タイマーによって割り込みを管理する仕組みが OS に備わっている
- タイマーは OS の起動時にカーネルモードで起動する