Linux KVM動作イメージ: ・QEMU→IOCTL→Linux kernel/KVM→VMLAUNCH→Guest Kernel ・Guest Kernel→VMExit→KVM/Linux Kernel #BHyVeDay
2012-07-28 14:13:16Intel VT向けVMMの動作の流れ: 要因に合わせたエミュレーション処理をQEMUが実施 #BHyVeDay
2012-07-28 14:13:52BHyVe動作イメージ: ・同じです、名前が変わっただけ ・BSD Kernel/vmm.ko←→Guest Kernel #BHyVeDay
2012-07-28 14:14:32/usr/sbin/bhyveの動作: ・src/usr.sbin/bhyve/fbsdrun.c:669 →fbsdrun_addcpu()でCPU0のスレッドを作成 #BHyVeDay
2012-07-28 14:16:03・src/usr.sbin/bhyve/fbsdrun.c:209 →pthread_create(fbsdrun_start_thread) ・同:195 →vm_loop() ・同:476 →while(1) {vm_run();} #BHyVeDay
2012-07-28 14:17:18・fbsdrun.c:476 ・src/lib/libvmmmapi/vmmapi.c:265 →ioctl(VM_RUN) vmm.koにVMX non root modeへの切り替えを依頼 #BHyVeDay
2012-07-28 14:19:37・fbsdrun.c:494 →handler[exitcode]() EXIT_REASONに対応するエミュレーション処理を呼び出し #BHyVeDay
2012-07-28 14:20:00IntelでもAMDでも共通となるように。VMExitしても、全てがユーザランドで処理が必要なわけではなく、Kernelで処理できるものも。今後はさらにEXITコードが増えるかと。 #BHyVeDay
2012-07-28 14:22:50なぜゲストOSローダが必要か: ・BHyVeにはBIOSがない ・HDDのブートセクタから起動されるブートローダはBIOSに依存している ・BIOSのエミュレーションを実装する代わりにゲストのカーネルをゲストメモリにロードして、いきなりカーネルを起動している #BHyVeDay
2012-07-28 14:24:02(続き) ・ロードを行うプログラムとゲストの実行を行うプログラムを分離している →ロード:/usr/sbin/bhyveload →実行:/usr/sbin/bhyve #BHyVeDay
2012-07-28 14:24:47ブートローダでは、リアルモードからプロテクトモードにしたりしているが、ここでは、いきなりKernelを実行できる状態にしている。 また、プログラムの分離については、KVMではゲストのメモリ空間がQEMUにあったかと、BHyVeではカーネル側が持つため。 #BHyVeDay
2012-07-28 14:26:07bhyveloadの動作: ・src/usr.sbin/bhyveload/vhybeload.c:557 →vm_create(vmname) で /dev/vmm/%s にdevice fileを作成 #BHyVeDay
2012-07-28 14:27:08(続き): ・src/lib/libvmmapi/vmmapi.c:85 →sysctl経由でdevice file作成をvmm.koに依頼 #BHyVeDay
2012-07-28 14:27:43(続き) ・bhyveload.c:570 →vm_setup_memory()でmembaseへゲスト空間をmmap ・vmmapi.c:139 →vmm.koへioctl(VM_MAP_MEMORY)でゲスト空間をアップロード #BHyVeDay
2012-07-28 14:29:23(続き) →vmm.koへのmmapでゲスト空間をmembaseへマップ (2段階で渡すことができて、Hi-MEMが渡されなければ 1段階?) #BHyVeDay
2012-07-28 14:30:06(続き) ・bhybeload.c:589 →FreeBSDのブートローダをユーザ空間で動くように移植したもの(boot2を) →メモリやレジスタへの読み書きをwrap、ゲストのメモリ空間/レジスタへアクセス #BHyVeDay
2012-07-28 14:31:08(続き) ・メモリ空間はmmap、レジスタの読み書きはioctl経由でVMMが管理するゲストのデスクリプタへ ・これを利用してkloadが実装されている #BHyVeDay
2012-07-28 14:31:55userboot.so: ・bhyceload.c:589 →dlopen ・同:594 →dlsym - loader_main() ・同:603 #BHyVeDay
2012-07-28 14:32:42(続き) ・loader_main関数はboot2とほぼ同じ動きを行うが、引数で渡しているコールバック関数で処理を仮想化している。 #BHyVeDay
2012-07-28 14:33:36vm_setup_freebsd_registers: ・src/lib/libvmmapi/vmmapi_freebsd.c:63 #BHyVeDay
2012-07-28 14:39:42ゲストカーネルのコンフィグレーション: - device pci - device bvmconsole - device bvmdebug - device mptable ACPIや多くのデバイスは無効。 #BHyVeDay
2012-07-28 14:44:13