BHyVe Hackathon講義

7
Yoshikazu GOTO @goto_ipv6

Ustreamの「BHyVeDay」にチェックイン! http://t.co/mEQTpKuK

2012-07-28 14:10:32
Yoshikazu GOTO @goto_ipv6

Linux KVM動作イメージ: ・QEMU→IOCTL→Linux kernel/KVM→VMLAUNCH→Guest Kernel ・Guest Kernel→VMExit→KVM/Linux Kernel #BHyVeDay

2012-07-28 14:13:16
Yoshikazu GOTO @goto_ipv6

Intel VT向けVMMの動作の流れ: 要因に合わせたエミュレーション処理をQEMUが実施 #BHyVeDay

2012-07-28 14:13:52
Yoshikazu GOTO @goto_ipv6

BHyVe動作イメージ: ・同じです、名前が変わっただけ ・BSD Kernel/vmm.ko←→Guest Kernel #BHyVeDay

2012-07-28 14:14:32
Yoshikazu GOTO @goto_ipv6

/usr/sbin/bhyveの動作: ・src/usr.sbin/bhyve/fbsdrun.c:669 →fbsdrun_addcpu()でCPU0のスレッドを作成 #BHyVeDay

2012-07-28 14:16:03
Yoshikazu GOTO @goto_ipv6

・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
Yoshikazu GOTO @goto_ipv6

Threadの理由: ・Threadをどんどん足して、SMPで動かせる。 #BHyVeDay

2012-07-28 14:18:27
Yoshikazu GOTO @goto_ipv6

・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
Yoshikazu GOTO @goto_ipv6

・fbsdrun.c:494 →handler[exitcode]() EXIT_REASONに対応するエミュレーション処理を呼び出し #BHyVeDay

2012-07-28 14:20:00
Yoshikazu GOTO @goto_ipv6

IntelでもAMDでも共通となるように。VMExitしても、全てがユーザランドで処理が必要なわけではなく、Kernelで処理できるものも。今後はさらにEXITコードが増えるかと。 #BHyVeDay

2012-07-28 14:22:50
Yoshikazu GOTO @goto_ipv6

なぜゲストOSローダが必要か: ・BHyVeにはBIOSがない ・HDDのブートセクタから起動されるブートローダはBIOSに依存している ・BIOSのエミュレーションを実装する代わりにゲストのカーネルをゲストメモリにロードして、いきなりカーネルを起動している #BHyVeDay

2012-07-28 14:24:02
Yoshikazu GOTO @goto_ipv6

(続き) ・ロードを行うプログラムとゲストの実行を行うプログラムを分離している →ロード:/usr/sbin/bhyveload →実行:/usr/sbin/bhyve #BHyVeDay

2012-07-28 14:24:47
Yoshikazu GOTO @goto_ipv6

ブートローダでは、リアルモードからプロテクトモードにしたりしているが、ここでは、いきなりKernelを実行できる状態にしている。 また、プログラムの分離については、KVMではゲストのメモリ空間がQEMUにあったかと、BHyVeではカーネル側が持つため。 #BHyVeDay

2012-07-28 14:26:07
Yoshikazu GOTO @goto_ipv6

bhyveloadの動作: ・src/usr.sbin/bhyveload/vhybeload.c:557 →vm_create(vmname) で /dev/vmm/%s にdevice fileを作成 #BHyVeDay

2012-07-28 14:27:08
Yoshikazu GOTO @goto_ipv6

(続き): ・src/lib/libvmmapi/vmmapi.c:85 →sysctl経由でdevice file作成をvmm.koに依頼 #BHyVeDay

2012-07-28 14:27:43
Yoshikazu GOTO @goto_ipv6

(続き) ・bhyveload.c:570 →vm_setup_memory()でmembaseへゲスト空間をmmap ・vmmapi.c:139 →vmm.koへioctl(VM_MAP_MEMORY)でゲスト空間をアップロード #BHyVeDay

2012-07-28 14:29:23
Yoshikazu GOTO @goto_ipv6

(続き) →vmm.koへのmmapでゲスト空間をmembaseへマップ (2段階で渡すことができて、Hi-MEMが渡されなければ 1段階?) #BHyVeDay

2012-07-28 14:30:06
Yoshikazu GOTO @goto_ipv6

(続き) ・bhybeload.c:589 →FreeBSDのブートローダをユーザ空間で動くように移植したもの(boot2を) →メモリやレジスタへの読み書きをwrap、ゲストのメモリ空間/レジスタへアクセス #BHyVeDay

2012-07-28 14:31:08
Yoshikazu GOTO @goto_ipv6

(続き) ・メモリ空間はmmap、レジスタの読み書きはioctl経由でVMMが管理するゲストのデスクリプタへ ・これを利用してkloadが実装されている #BHyVeDay

2012-07-28 14:31:55
Yoshikazu GOTO @goto_ipv6

userboot.so: ・bhyceload.c:589 →dlopen ・同:594 →dlsym - loader_main() ・同:603 #BHyVeDay

2012-07-28 14:32:42
Yoshikazu GOTO @goto_ipv6

(続き) ・loader_main関数はboot2とほぼ同じ動きを行うが、引数で渡しているコールバック関数で処理を仮想化している。 #BHyVeDay

2012-07-28 14:33:36
Yoshikazu GOTO @goto_ipv6

vm_setup_freebsd_registers: ・src/lib/libvmmapi/vmmapi_freebsd.c:63 #BHyVeDay

2012-07-28 14:39:42
Yoshikazu GOTO @goto_ipv6

4,IOデバイスエミュレーション #BHyVeDay

2012-07-28 14:41:09
Yoshikazu GOTO @goto_ipv6

ゲストカーネルのコンフィグレーション: - device pci - device bvmconsole - device bvmdebug - device mptable ACPIや多くのデバイスは無効。 #BHyVeDay

2012-07-28 14:44:13