ユユユユユ

webエンジニアです

CPU の仮想化、カーネルモード、トラップ

ウィスコンシン大学が公開している 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 の起動時にカーネルモードで起動する