++++ 仮想化技術の話 +++++++++++++++++++++++++++++++++++++
[戻る]
【タイトル】
完全仮想化と準仮想化
【記事】
完全仮想化と準仮想化ではハイパーバイザーの役割が違う
ハイパーバイザーって何か?
ハイパーバイザーはいうなればOS代行です。
物理環境ではOSが直接CPUに命令してましたけど、仮想化環境ではOSがたくさんあるんで、
OSの代わりにCPUを操作するハイパーバイザーが必要なんです。
ハイパーバイザーがOSのOSと呼ばれる言われるゆえんですね。。
ハイパーバイザーが介在する仮想環境(ハイパーバイザー方式)ではハイパーバイザーの上に乗るOSはゲストOSと呼ばれます。
完全仮想化、準仮想化の話をする前にCPUの動作モードについて説明します。
x86アーキテクチャという、Intelさんが作った世界で最も普及している(?)CPUのアーキテクチャでは、CPUの動作モードは
リングプロテクションという構成をしています。
リングプロテクションではCPUが理解する命令はリング0、リング1、リング3にカテゴリ分けされます。
それぞれのリングレベルで実行できる命令の種類が違います。特にリング0で実行できる命令を特権命令と言います。
特権命令というのは簡単に言うと、操作を誤ればマシンそのものが動かなくなる可能性のある非常にデリケートな命令です。
アプリケーションが実行できない命令ということもできます。
だって、そんな危なっかしい命令をアプリケーションなんかに実行させてたら、つくりの悪いアプリケーションをインストールしただけで、
すぐマシンがフリーズしたクラッシュしたしちゃうじゃないですか!!
物理環境では、リング0の命令はOSのみ実行できました。
ちなみにアプリケーションが実行できる命令は物理環境でも仮想環境でもリング3の命令です。
ここで、完全仮想化と準仮想化の説明になりますが、簡単に言うと従来通りリング0の命令をゲストOSが実行できるのが完全仮想化です。
準仮想化では、リング0の命令を実行できるのはハイパーバイザーで、ゲストOSはリング1の命令しか実行できません。
完全仮想化では、物理環境と同じようにゲストOSはリング0の命令を実行します。ハイパーバイザーはゲストOSが実行したリング0の命令を
CPUが理解できる命令に翻訳します。
つまり、完全仮想化ではゲストOSは、自分が仮想環境上にいるなんてことは意識しないで、物理環境にいた時代と同じように好き勝手できます。
そのかわり、影でハイパーバイザーが頑張っているので、準仮想化と比較してパフォーマンスが劣化します。
一方、準仮想化ではハイパーバイザーがリング0の命令を実行できるので、完全仮想化とくらべるとハイパーバイザーは楽できます。
ゲストOSは自分が仮想環境上にいるということを意識しなくてはいけません。
つまり、自分は仮想環境上にいるんでリング1の命令しか実行できないんだ(がーん)、、、ということを体におぼさせる必要があります。
ただ、ゲストOSは物理環境上で動作していた古き良き時代のことが忘れられず、仮想環境上にいても好き勝手やりたいんです。(なんてナマイキな)
心やさしいハイパーバイザーは、ゲストOSがリング0の命令で好き勝手やっていたのに、自分がリング0の命令を実行するせいで
リング1の命令しか実行できなくなってかわいそうだなぁ(ププッ)と思っているので、リング1で実行できる範囲の命令でリング0の命令の
代替になる命令を提供します。(この命令をハイパーコールといいます。)
でも、ゲストOSからすれば、ハイパーコールなんていう命令は物理環境上で動作していた時代には使ったことがないので(使う必要もなかったので)、
仕方なしにハイパーコールの使い方を勉強しなくてはなりません。
そのためには、ゲストOSのコードの改変が必要ですし、そもそもハイパーバイザーがゲストOS用のハイパーコールを持っている必要があります。
準仮想化ではハイパーバイザーが楽できる分、パフォーマンスが向上しますが、ゲストOS用のハイパーコールをハイパーバイザー側で用意しなければいけない
(実際にはハイパーバイザーを作っているベンダがゲストOSごとのハイパーコールを開発する)し、ゲストOSのソースコードも改変しなければいけないので、
OSのソースコードを変更することを禁止しているようなベンダのOSは準仮想化方式の仮想環境上では動作させることができないなどの問題があります。
[戻る]