仮想化は、構造の点でエミュレーションとどのように異なりますか?


20

VirtualBoxのような仮想化プログラムは、レジスターをエミュレートせず、CPU上の仮想化データに実際のレジスターを使用するという意味で、エミュレーターのように機能しないと誰かが教えてくれました。エミュレータは主に外部環境に依存するソフトウェアを実行するため、レジスタをエミュレートする必要があります(たとえば、GenesisエミュレータはMotorola 68000のレジスタとメモリアドレスを必要とするため、開発者はこれらのリソースをエミュレートレジスタとして利用可能にする必要があります)。

私の主な質問は、仮想化はどのように開発されているのですか?仮想マシンでOS全体をプロセスとして実行できるようにするにはどうすればよいのでしょうか?実際のCPUを引き続き利用しながら、OS全体を独立して実行するにはどうすればよいですか?私は仮想化ではなくエミュレーションのみを知っているので、誰かがそれを助けてくれるといいと思います!

PS:違いは何かだけではなく、ソフトウェアの実行方法の違いを尋ねています。

回答:


32

元々、ゲストOSを制御する方法がなかったため、ゲストOSに実際のハードウェアを使用させることはできませんでした。実際のCPUで実行しようとした場合、ホストOSに制御を戻す保証はありません。

説明したとおりの仮想化は、特定のルールと制限をホストOSで管理できるハードウェアレベルで適用できるようにすることで、ハードウェアに実装されます。これにより、ホストOSはゲストができることとできないことに関するルールを設定し、実際のハードウェアでゲストを実際に実行できます。ゲストがルールに違反する実際のハードウェアで何かを実行しようとすると(ディスクデバイスへのアクセスなど)、ハードウェアはゲストを一時停止し、ホストに割り込みを送信します。エミュレートされたディスクデバイスからデータを返す)、ゲストを再開します。

プロセスの簡単な例を次に示します。

ホストOS:ちょっとCPU、仮想化されたこのコードを実行する必要があります。命令を実行するだけではない何かをしたい場合は私に電話してください。

ホストCPU:わかりました!
ホストCPUはすべてのホストレジスタと状態を保存し、ゲストOSコードの実行を開始します

ゲストOS:私は生きています!ちょっとCPU、このファイルを入手できますか?

ホストCPU:ええと...確かに。一瞬。
ホストCPUはすべてのゲストレジスタと状態を保存してから、すべてのホストレジスタと状態を復元します
ホストCPU:ホストOSよ、ゲストはこのファイルを望んでいた!

ホストOS:ああ、よくこれを与えてください:仮想ハードドライブからのファイル

ホストCPU:わかりました!
ホストCPUはすべてのホストレジスタと状態を保存し、ゲストレジスタと状態を復元してから、ゲストOSコードの実行を開始します
ホストCPU:ここにそのファイルがあります!

ゲストOS:甘い、ありがとう!

ここでの主な違いはエミュレーターにあり、ゲストOSは実際にハードウェア上で実行されることはありません。仮想化では、ホストOSがCPUに制限を設定し、実際に物理CPUでゲストコードを実行します。上記の例は非常に単純化されていますが、メモリ、ディスクI / O、さらにはネットワークを最新のプロセッサで制御できるため、毎回ホストOSを煩わせることなく安全にインターフェイスできます。ゲストが仮想化された境界の外に出ようとしない限り、特定の時点で何もすることがない場合、ホストOSでコードが実行されない場合があります。


少し視点を加えると、これは仮想化と制御の長い歴史のもう1つのステップにすぎません。(これが正しい順序であるか、網羅的であるという保証はありませんが、適切な開始概要を提供する必要があります)

当初、仮想化はありませんでした。プロセスはすべて同じメモリ空間を共有し、すべてがハードウェアへのフルアクセスを持ち、マルチタスク機能は、1つのプロセスが停止して次のプロセスに制御を与えることに完全に依存していました。OSがプロセスをコントロールの任意の並べ替えを持っていると思った場合は、それが持っていた(それはあまりにも痛々しいほど遅かったので、誰もが、なかった)エミュレータでプロセスを実行します。

最初は特権メモリでした。メモリの特別な領域でのみ実行できる特定のアクションです。これらの領域はOSによって占有されており、これらの特権アクションへのゲートウェイとして機能することができます。例としては、データをハードウェアに読み書きする機能があります。これにより、プロセスがハードドライブに対して直接読み取り/書き込みを行うことを防ぎ、代わりにOSに読み取り/書き込みを要求するように強制します。これは、OSがアクションを実行する前にプロセスに許可があるかどうかを確認できることを意味します。

次に、仮想化された「時間」がありました。OSは、設定された間隔でアクティブなプロセスを中断するようにCPUを構成し、スケジューリングを制御してプロセスを切り替えることができます。OSは、ハードウェア上でプロセスを直接実行できるようになりましたが、それでも CPU時間の誤用を防ぎます。これはハードウェアタイマーによって提供されました。

次に仮想メモリが登場しました。共有メモリの問題は、どのプロセスでも他のプロセスのメモリを読み取ることができるということです。MaryのプログラムがBobのパスワードをWebブラウザーから読み取るとどうなりますか?仮想メモリを使用すると、OSはプロセスが認識するメモリを物理メモリのさまざまな部分にマップしたり、物理メモリから完全に(ページファイルに)移動したりすることもできます。プロセスがメモリの読み取りまたは書き込みを試みるたびに、CPUのVMMU(仮想メモリ管理ユニット)は、物理メモリ内でマップされている場所を検索し、そこでアクションを実行します。メモリ外にマップされている場合、CPUはページファイルからメモリにページをフェッチするためにOSを呼び出します。

さて、この時点で、プロセスを安全に実行し、OSが特に許可していない限り、システムを引き継ぐことを積極的に防ぐことができるX86プロセッサの始まりについて到達しました。この時点で、プロセスは事実上「仮想化」されています。このサポートは長い間使用されてきたため、すべてのプロセスが現在仮想化されていると想定されているため、仮想化プロセスについて人々が話しているのを実際に聞くことはありません。

しかし、仮想化OSが特別なのはなぜですか?プロセスとして起動するだけで、独自の処理を実行できないのはなぜですか?問題は、OSとして、ゲストシステムがホストがプロセスを制御するために使用するものと同じコントロールにアクセスして使用できることを期待していることです。基本的に、OSはコンピューターの最高の支配者であり、そうでない場合は動作しません。「ハードウェア仮想化」拡張機能(AMDの場合はAMD-V、Intelの場合はVT-x)を使用すると、ホストOS は仮想プロセスコントロール(仮想特権メモリ、仮想ハードウェアタイマー、仮想仮想メモリ)の仮想化セットを提供できます。


私がかつて見たIRCの1幕演劇思い出させます(おそらくNSFW:PG-13言語が含まれています)
スコットチェンバレン

私のコンピューターにはハードウェア仮想化(AMD-VもVT-x)もありません。しかし、VirtualBoxで仮想マシンを実行できます... VirtualBoxは、OSにドライバーをインストールして、それを実行できるようにします。それはどのように行われますか?
何もない

1
@NothingsImpossible:非常に古いマシンがない限り、最近販売されているほとんどのメインストリームCPUはハードウェア仮想化をサポートしています。CPU(ゲストOSなど)が現在のセキュリティレベルで許可されていない命令を実行しようとすると、CPUがスーパーバイザー(カーネル)に割り込みを送信するため、基本的な仮想化は常に可能です。ホストOSがやるべきことは、それらの割り込みをトラップし、目的の操作を見つけ出し、子プロセスの実行を再開することだけです。AMD-V / VT-xは、CPU自体が「許可されていない」命令を処理できるため、より効率的な仮想化のみを可能にします。
ライライアン

@LieRyan説明をありがとう。しかし、それは古くはなく、Atomプロセッサです。これは、正確には:ark.intel.com/products/70105
NothingsImpossible

1

仮想マシンでOS全体をプロセスとして実行できるようにするにはどうすればよいのでしょうか?実際のCPUを引き続き利用しながら、OS全体を独立して実行するにはどうすればよいですか?

(以下は非常に単純化されています。)

主に、OSがユーザーモードプロセスをインラインに保つために使用するものと同じまたは類似のメカニズムを活用する。

ユーザーモードプロセスは、許可されていない操作を実行しようとすると、CPU例外を発生させます。

そのため、OSモードのカーネルをユーザーモードで実行している場合、ハードウェアに直接アクセスするようなことをしようとすると、例外が発生します。ハイパーバイザーは、通常のカーネルのようにシステムクラッシュを引き起こす代わりに、その例外を検出し、エミュレートまたは仮想化された動作で応答できます。

このカーネルに代わってハードウェアアクセスを実行したり、変更されたハードウェアアクセス(つまり、直接ディスクセクタアクセスの代わりにファイルの一部にアクセス)を実行したり、思いつく他のことを実行したりできます。

CPU仮想マシンの拡張機能は、基本的にCPUの「スーパーバイザー」または「保護」モード全体をもう1レベル拡張し、これを正確に行うとともに、仮想メモリの「ネストレベル」を追加してページングを仮想化しやすくします。


0

仮想化では、コンピューターのハードウェアの一部をシミュレートします-ゲストOSを変更せずに実行するのに十分ですが、ほとんどの操作は効率上の理由から実際のハードウェアで行われます。したがって、仮想化は通常、エミュレーションよりも高速ですが、実際のシステムにはゲストシステムと同じアーキテクチャが必要です。たとえば、VMWareは、仮想Windows XPマシンを実際の「内部」で実行するための仮想環境を提供できます。ただし、VMWareは、実際のx86 PC以外の実際のハードウェアでは動作しません。

エミュレートする仮想マシンは、ソフトウェアで完全なハードウェアをシミュレートします。これにより、1つのコンピューターアーキテクチャのオペレーティングシステムを、エミュレーターが記述されているアーキテクチャで実行できます。すべての操作はソフトウェアで実行されるため、エミュレーションは遅くなる傾向がありますが、ハードウェアに依存しないため、より多くのプラットフォームをサポートできます。


OK ...しかし、ハードウェアの「シミュレーション」部分はどういう意味ですか?エミュレーターは正確なことを行います...仮想化によってゲストOSは実際のCPUリソースをどのように活用できますか?
トンボーン

@tonsbons:定義によります。:Pエミュレーターまったく同じことを行いません -CPUからすべてをエミュレートします。たとえば、Bochsはエミュレーターです。仮想化はより薄くなります。ハイパーバイザーは物理CPU上でゲストOSを実行します(基本的には、ゲストをだましてCPUを所有していると思わせます)。ただし、ゲストには自分が持っていると思われる特権がないため、カーネルのようなことをしようとすると「障害」が発生します。ハイパーバイザーはこれらの障害を監視し、仮想ハードウェアをいじって、実際に発生した操作のようにゲストに見えるようにします。
cHao

0

完全を期すために、マシンのアクションが複製されるシミュレーションもありますが、内部が「実際の」マシンとは根本的に異なる可能性のあるコードを使用します。(「フライトシミュレータ」と考えてください。)多くの場合、シミュレータは「実際の」マシンのソースコードをコンパイルしますが、OSとI / O機能がまったく異なるCPUアーキテクチャをまったくターゲットにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.