わかりやすくQEMUを説明してみる(第5回):QEMU-KVM
はじめに
前回(第4回)ではQEMUにおけるアドレス変換、Soft-MMU、システムモード、ユーザモードについて説明しました。
今回(第5回)ではQEMU-KVMについて説明します。QEMU-KVMは通常のQEMUよりも高速なのですが、高速動作するためにはある条件を満たしている必要があります。
KVM(Kernel-based Virtual Machine)
図1に示すように、x86系のPC(パソコン)で動作しているLinux上でx86系のWindows10を動かす場合を考えます。
このときLinux上で実行しているQEMUは、図2のようにWindows10のソースコード(ゲストのマシン語)をホスト用コードのマシン語に変換しながら実行しています。QEMUでのマシン語変換については第2回を参照してください。
この場合、ゲストもホストも同じCPUアークテクチャ(今回はx86系)にもかかわらずQEMUのTCG(Tiny Code Generator)にてマシン語変換をしているのはどう考えても無駄な気がします。
そこでQEMU-KVMではゲストのマシン語を、変換することなくQEMU本体とは別のスレッドとしてそのまま実行しています。詳細は割愛しますが、単純に別スレッドとしては実行するこはできず、ホストCPUの仮想化支援機構とホストのLinuxカーネルの力を借りる必要があります。そこでRHEL(Red Hat Enterprise Linux) 5からはKVM(Kernel-base Virtual Machine)という仮想化機能が導入されました。RHEL 5のKVMはKVMに対応したCPU(Intel VT-xやAMD-V)の使用が前提となります。
KVMではゲストマシンコードは別スレッドとして実行し、IOアクセスなどがあった場合はQEMUに制御が移り、ペリフェラルモデルの実行などが行われます。
まとめるとQEMU-KVMは以下条件のすべてを満たしている場合に利用が可能となります。
- ゲストとホストのCPUアーキテクチャが同じ
- ハードウェア仮想化支援に対応したCPU(Intel VT-x、AMD-V、ARM Virtualization Extensions)を利用
- ホストOSであるLinuxがKVMをサポートしている
- QEMUのシステムモードを利用(QEMUのユーザモードではだめ)
次回
今回(第5回)はQEMU-KVMについて説明しました。わりとさらりと説明したのですがKVMがどのようなものかについては理解して頂けたのではないでしょうか。
次回(第6回)は、QEMUにSystemC TLM(Transaction Level Modeling)モデルを接続させる方法について説明します。ここまでくるとかなりマニアックな話になるのですがSystemC TLMモデルを開発している人にとっては興味のある話かと思います。