基盤ソフトウェア 4/24
相変わらず学生に対して答えにくい質問を連発します。
仮想マシン(Virtual Machine) 歴史的にはマルチタスクよりも先に出てきた アプリケーションが複数動けばよかった しかしマルチタスクが一般的になってくると消えてしまった VMはマルチタスクと似ている 仮想マシン <= OSのMultitasking + α 歴史的な順番は違うけれど… そもそもマルチタスクとはなにか 短い時間でアプリケーションを切り替えて同時に動いているようにみせる 今はマルチコアも一般的 どうやって短い時間で切り替えているのか アイディアとしては単純 マルチタスクを動かすコンピュータには必ずタイマーが入っている タイマ割り込みをかける それまで動いていたプログラムを強制的にストップして 別のプログラムが動き始める 一般的なOSはそれ以外の状況でも切り替わる 例えばIOなどでも切り替わる ディスクアクセスが終わるまで違うプログラムを動かすとか… ファイルアクセスをするときはOSに頼まなければならない データの整合性、セキュリティ、プロテクション 違う誰かによって勝手に覗かれない 結構頻繁にOSを呼び出すので マルチタスクが実現されている VMでも同じ方法でできるはず OSのカーネルコードといってもプログラムには違いない タイマ割り込みかけてこっちのOS、今度はこっちのOS、というふうに 短い時間で切り替えながら動かすというのは一緒 普通のプログラムとカーネルは 特権命令を実行できるかできないかという点で異なる 特権命令がないとアプリケーションプログラムが勝手にIOを動かしてしまう危険がある アプリケーションが特権命令を実行しようとするとOSのカーネルから実行される プロセッサの中に特権かそうでないか、 どちらのモードで動いているかをあらわすレジスタがある VMの+αの部分には特権命令がある 特権命令をどうやって仮想化するか VM上のOSは、当然自分が特権命令が動かせると思っている VM上で動いているOSに特権命令を与えるという方法があるが、 これをやってしまうと大混乱に陥ってしまう タイマ割り込みも特権命令 次にどのプログラムを動かすか登録する みんながこれをできてしまうと大混乱 だからVM上のOSには特権命令を与えてはいけない 特権モードをエミュレーションする 偽者の特権モードを与える これが仮想マシンを作るうえでは一番重要 あとは普通のマルチタスクと同じ方法でいける Intel x86 特権モードでは1つではなく何種類かある Ring3 user : : guest OS VMはここで動かせばいいんじゃないか? : しかしそうは問屋が卸さない : 普通のOSはRing0で動くことを想定している : Intelはそういう状況を考慮してRing1と2を用意したのに誰も使っていない Ring0 kernel user modeで特権命令を実行すると割り込みが発生 割り込みの先でエラーメッセージやログファイルを出したり終了させる ここがエミュレートのポイントになる | アプリケーション| |-----------------| ユーザー | Guest OS |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-