このページの目次
KVMアーキテクチャ
カバー範囲: KVMをLinuxハイパーバイザーとして使用 → VMX/SVMハードウェア仮想化 → vCPUライフサイクル → VM exit処理 → KVM + QEMU協調モデル → /dev/kvm ioctl API カーネルバージョン: 2.6.20 ~ 6.x
概要
KVM (Kernel-based Virtual Machine) は、Linuxカーネルをタイプ1ハイパーバイザーに変換します。Intel VMXまたはAMD SVMのハードウェア仮想化拡張機能を利用し、ゲストがVMX non-rootモードで物理CPU上で直接実行できるようにします。各VMはユーザー空間のQEMUプロセスであり、各vCPUはそのプロセス内のスレッドです。
アーキテクチャの階層
VM Entry / VM Exit
vCPUスレッドモデル
// 各vCPU = 1つのQEMUスレッド、実行ループ:
while
スケジューラとの連携
// KVMはpreempt notifierを介して、vCPUがプリエンプトされるタイミングを知る:
// → kvm_sched_out(): vCPUがスケジュールアウトされた
// → kvm_sched_in(): vCPUがCPUを獲得した
// 用途: steal timeの集計、TSCオフセット計算
/dev/kvmインターフェース
// VMの作成:
int kvm_fd = ;
int vm_fd = ;
// メモリの登録 (ゲスト物理アドレス空間):
struct kvm_userspace_memory_region region = ;
;
// vCPUの作成:
int vcpu_fd = ;
// KVMのバージョン/能力の取得:
int version = ;
struct kvm_cpuid2 cpuid = ;
;
割り込みインジェクション
// KVMがゲストへ割り込みをインジェクション:
// 1. VMCS (VMX) または VMCB (SVM) の割り込み情報フィールドを設定
// 2. interrupt windowを設定 → VM entry後、ゲストは即座に応答
// 3. vCPUが実行中でない場合 (スケジュールアウトされている) → kickフラグを設定
// 割り込みのソース:
// - virtioデバイス (msix)
// - エミュレーションデバイス (8259A PIC, IOAPIC)
// - IPI (ゲスト内の複数vCPU間)
// - タイマー (hrtimer→KVMタイマー)
参考
- ソースコード:
virt/kvm/kvm_main.c(コア),arch/x86/kvm/vmx/vmx.c(Intel VMX),arch/x86/kvm/svm/svm.c(AMD SVM) - カーネルドキュメント:
Documentation/virt/kvm/ - LWN: "KVM: the Linux virtual machine monitor"
キーワード: KVM, VMX, SVM, vCPU, VM exit, VMLAUNCH, VMRESUME, /dev/kvm, KVM_RUN, 割り込みインジェクション