Hatena::Group::Virtualization::takaochan RSSフィード

日記はこちら
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 |

2006/07/20 (木)

[][][]x86 CPU仮想化支援機能 x86 CPU仮想化支援機能 - Hatena::Group::Virtualization::takaochan を含むブックマーク はてなブックマーク - x86 CPU仮想化支援機能 - Hatena::Group::Virtualization::takaochan

直接的なメリットはないかもしれないが、こういう記事によって仮想化技術に積極的に取り組んでいる姿勢を見せることは企業にとって重要だと思う。そういう意味で、HPは仮想化技術に対して積極的に取り組んでいるように「みえる」。

x86アーキテクチャ向けのOSは「コンピュータのすべてのリソースを占有している」という前提で動作している。従ってそのようなOSを,同一のコンピュータ上で複数同時に実行することはできない。なぜならば,複数のOS間で,リソースの競合が発生するからである。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060713/243263/

対して汎用機やハードウェアOSがかなり高レベルに統合されたUNIX製品などは「仮想化」に対応するようにOS側もつくられているので、x86と比較してかなり早い段階から仮想化技術が取り込まれている。

x86命令の中には,特権命令と呼ぶ命令がある。例えばI/Oアクセス命令などだ。特権命令を,権限が低いリングプログラムで実行すると,より権限が高いリングプログラムがそれを横取りできる(これを「トラップ」と呼ぶ)。ほとんどのOSでは,カーネルリング0アプリケーションリング3で動かしている(リング1とリング2は使っていない)。こうすることで,例えば複数のアプリケーションから同時にI/O処理要求が発行された場合に,それらをOS がトラップし,OS排他制御調停できるようにしている。

ここがx86仮想化を理解するための基本となる重要な部分。

仮想化ソフトウエア(VMM)は,いわばゲストOSをだますことにより,ゲストOSからするとあたかも自身のカーネルリング0で動作しているかのように見せかけている。実際には,VMMがリング0で動作し,ゲストOSカーネルリング1で動作させている。

いかなるx86アーキテクチャにおける仮想化ツールもこの方法で動作している(やり方はそれぞれ微妙に異なるが)。

ゲストOSリング1で動かすことで,ゲストOSで実行しようとした特権命令をVMMがトラップできるようになる。複数のゲストOSが実行しようとした特権命令をVMMが調停することで,複数のOSを同時に動かしているわけだ。ただしx86には,システムハードウエア)の状態を変更する命令なのに特権命令ではない命令がある。そのような命令をゲストOSが実行すると,そのままではVMMはトラップできず,システムクラッシュする。

この問題をどう乗り越えるかが製品としての完成度につながる。

x86は設計の時点で仮想化を意識していないので、どうしても「きわどい方法」で「どうにかする」仕組みを作る必要がある。

そこで,VMware製品は,ゲストOSで使われているそれらの命令を,VMMがトラップできるよう動的に書き換えて,実行している。このような仮想化の方式を「バイナリトランスレーション」と呼ぶ。これに対して,VMM上で動作するようにあらかじめ変更しておいたゲストOSのみを実行できる仮想化ソフトウエアもある。Xenがその代表例で,このような方式を「パラバーチャライゼーション(準仮想化)」と呼ぶ。

汎用的に使えるようにするにはVMwareバイナリトランスレーションは有効だが、その分オーバーヘッドが生じてしまう。対してXenの取るパラバーチャリゼーションはより高速に(=オーバーヘッドを最小限にして)動作させることが出来る。

この連載はx86アーキテクチャにおける仮想化に携わる人は「理解しておくべき」事項がまとめられていきそうなので、非常に期待している。