Wiki内検索
最近更新したページ
管理人's Profile
オープン系の仮想化に興味をもつ2流技術者です。Linux 2.6.20に採用されたカーネルベースの仮想マシンドライバkvmについての情報をまとめるWikiを立ち上げました。
最新コメント
XenNews by check it out
Ubuntuでkvm! by check it out
PV Driver仕様概要 by stunning seo guys
PV Driver仕様概要 by awesome things!
FrontPage by awesome things!
ファイル雛形 by stunning seo guys
タグ
フリーエリア

linux-2.6.20/drivers/kvm/vmx.c

■機能概要
 エミュレーションやバイナリ変換なしでIntel VT-xマシンで仮想マシンを実行させる。

■実装概要
 次に示すように、ファイル内にstaticにkvm_arch_ops構造体がディスパッチルーチンとなる関数のポインタとともに宣言されている。

static struct kvm_arch_ops vmx_arch_ops = {
 .cpu_has_kvm_support = cpu_has_kvm_support,
 .disabled_by_bios = vmx_disabled_by_bios,
 .hardware_setup = hardware_setup,
 .hardware_unsetup = hardware_unsetup,
 .hardware_enable = hardware_enable,
 .hardware_disable = hardware_disable,
 .vcpu_create = vmx_create_vcpu,
 .vcpu_free = vmx_free_vcpu,
 .vcpu_load = vmx_vcpu_load,
 .vcpu_put = vmx_vcpu_put,
 .set_guest_debug = set_guest_debug,
 .get_msr = vmx_get_msr,
 .set_msr = vmx_set_msr,
 .get_segment_base = vmx_get_segment_base,
 .get_segment = vmx_get_segment,
 .set_segment = vmx_set_segment,
 .get_cs_db_l_bits = vmx_get_cs_db_l_bits,
 .decache_cr0_cr4_guest_bits = vmx_decache_cr0_cr4_guest_bits,
 .set_cr0 = vmx_set_cr0,
 .set_cr0_no_modeswitch = vmx_set_cr0_no_modeswitch,
 .set_cr3 = vmx_set_cr3,
 .set_cr4 = vmx_set_cr4,
#ifdef CONFIG_X86_64
 .set_efer = vmx_set_efer,
#endif
 .get_idt = vmx_get_idt,
 .set_idt = vmx_set_idt,
 .get_gdt = vmx_get_gdt,
 .set_gdt = vmx_set_gdt,
 .cache_regs = vcpu_load_rsp_rip,
 .decache_regs = vcpu_put_rsp_rip,
 .get_rflags = vmx_get_rflags,
 .set_rflags = vmx_set_rflags,
 .tlb_flush = vmx_flush_tlb,
 .inject_page_fault = vmx_inject_page_fault,
 .inject_gp = vmx_inject_gp,
 .run = vmx_vcpu_run,
 .skip_emulated_instruction = skip_emulated_instruction,
 .vcpu_setup = vmx_vcpu_setup,
};

次に示す初期化関数vmx_initの中でvmx_arch_ops構造体のポインタを引数としてkvm.koの関数kvm_init_archを呼び出すことで、それぞれの処理でkvm.koから必要に応じて設定した関数にディスパッチされるようにして、初期化を完了する。

static int __init vmx_init(void)
{
 return kvm_init_arch(&vmx_arch_ops, THIS_MODULE);
}

ドライバ終了時には、同様にkvm_exit_archを呼び出し、ドライバの終了処理のトリガーとする。

static void __exit vmx_exit(void)
{
 kvm_exit_arch();
}

上記の実装であるため、vmx.c内の関数はすべてstaticで宣言されている。

■ディスパッチルーチン実装

cpu_has_kvm_support?
vmx_disabled_by_bios?
hardware_setup?
hardware_unsetup?
hardware_enable?
hardware_disable?
vmx_create_vcpu?
vmx_free_vcpu?
vmx_vcpu_load?
vmx_vcpu_put?
set_guest_debug?
vmx_get_msr?
vmx_set_msr?
vmx_get_segment_base?
vmx_get_segment?
vmx_set_segment?
vmx_get_cs_db_l_bits?
vmx_decache_cr0_cr4_guest_bits?
vmx_set_cr0?
vmx_set_cr0_no_modeswitch?
vmx_set_cr3?
vmx_set_cr4?
vmx_set_efer?
vmx_get_idt?
vmx_set_idt?
vmx_get_gdt?
vmx_set_gdt?
vcpu_load_rsp_rip?
vcpu_put_rsp_rip?
vmx_get_rflags?
vmx_set_rflags?
vmx_flush_tlb?
vmx_inject_page_fault?
vmx_inject_gp?
vmx_vcpu_run?
skip_emulated_instruction?
vmx_vcpu_setup?

linux-2.6.20/drivers/kvm/vmx.c(調査用メモ)
2007年03月03日(土) 23:15:52 Modified by deku_nobo




スマートフォン版で見る