Contenu connexe
Similaire à Bhyve Internals (20)
Plus de Takuya ASADA (20)
Bhyve Internals
- 3. BHyVe とは
FreeBSD 版の Linux KVM のようなもの
Intel VT を用いたハイパーバイザ
開発の初期段階でごく限定的な機能が実装されている
↓
最低限のハイパーバイザ実装のよいサンプルになりそう
3
- 4. 新しい Web サイトと GSoC
web site
http://www.bhyve.org/
GSoC 2012: BHyVe BIOS emulation
to boot legacy systems
http://bit.ly/bhyve_bios
4
- 5. 実装状況
Intel VT-x, EPT 必須 (= Nehalem 以降必須 )
BIOS 非対応 (disk ブート出来ない )
対応デバイス :
virtio-net, virtio-blk
pci passthrough(VT-d)
paravirtual console/debug port
UART
対応 OS:
FreeBSD 8, 9, 10 5
- 8. 各コマンドの役割分担
/usr/sbin/bhyveload
VM インスタンスを作成し、 BSD カーネルを VM インスタンスのメモ
リ領域にロードして起動可能な状態を作る
/usr/sbin/bhyve
bhyveload が初期化した VM インスタンスを実行し、ディス
ク、 NIC 、コンソールなどのデバイスエミュレーション処理を行う
VM インスタンスの状態は、プロセス内ではなく /dev/vmm/$
{vmname} というデバイス上、つまりカーネル内に保持される。
このファイルへ read(), write(), mmap() する事により VM 内のメモリ空
間にアクセス出来る。 8
- 14. vCPU の初期化
bhyveload で以下の初期化を実施
CR0 = PE | PG | NE # ページング、プロテクトモード
CR4 = PAE | VMXE # PAE 、 VMX 有効
EFER = LME | LMA # long mode 有効
GDT 初期化&セグメントレジスタ初期化
タスクレジスタ初期化
ページテーブル& CR3 初期化
RSP 初期化 14
エントリポイント設定
- 18. ゲストカーネルのコンフィグレーション
device pci
device bvmconsole
device bvmdebug
device mptable
ACPI や多くのデバイスは無効
virtio.ko, if_vtnet.ko, virtio_pci.ko, virtio_blk.ko はモジュール
としてビルド
18
- 19. IO エミュレーション
io emulation 実行
consol net blk
e PCI
/usr/sbin/bhyve
IOCTL return
VMExit
IO 命令
vmm.k Guest
BSD kernel o kernel
19
- 20. IO エミュレーション
ゲスト OS が in/out 命令を実行、 VMExit
vmm.ko で EXIT_REASON_INOUT をハンドル
VM_EXITCODE_INOUT で ioctl を return 、カーネルから /usr/
sbin/bhyve へ制御を移す
handler[VM_EXITCODE_INOUT]()
↓
inout_handlers[port].handler()
の順にハンドラがコールされ、 IO ポートに割り当てられ
たハンドラが実行される 20
- 21. bvm_console
IO 空間の 0x220 に inl / outl で読み書き
ゲストドライバ
int getc(void) { return inl(0x220); }
void putc(int c) { outl(0x220, c); }
割り込みなどない。
VMM
if (in) {
read(fd, &c, 1);
*eax = (c & 0xff);
}else
write(fd, *eax, 1); 21
- 22. PCI バス
CONFIG_ADDRESS レジスタ: 0xcf8
CONFIG_DATA レジスタ: 0xcfc – 0xcff
各仮想 PCI デバイスは初期化時に自分のコンフィグレジス
タの値を設定
各仮想 PCI デバイスの IO レジスタはデバイス初期化時に動
的に確保
22
- 23. PCI デバイスの MSI 割り込みサポート
PCI 割り込みとして MSI 割り込みのみサポート
デバイス初期化時に configuration space 上の MSI capable フラグを
有効化
/usr/sbin/bhyve からの割り込み要求は、 VM_LAPIC_IRQ ioctl とし
て vmm.ko へ送られる
引数として cpuid と vector ナンバを指定
vmm.ko で ioctl を受けて vlapic にレジスタ値をセット
vmlaunch 前に vlapic の値をチェックして、割り込みがあったら
VMCS にフラグをセット 23
- 24. MSR register のエミュレーション
Local APIC をエミュレートする為に、 wrmsr/rdmsr 命令で
VMExit を発生させ、エミュレーションを行なっている
ほぼ vmm.ko でエミュレーションを行なっているが、初期
化周りの一部の処理で /usr/sbin/bhyve へエミュレーション
を行わせている
24
- 25. タイマー
Local APIC Timer
vmlaunch 前にタイマーの値を計算、 vlapic へ割り込みを設定
vmm.ko 内でエミュレーション
TSC
rdtsc を trap していないように見える
(その場合どうなるんだろう??)
PIT 8254
/usr/sbin/bhybe で IO ポートアクセスのエミュレーションをして
いる
割り込むコードが見当たらないような…?? 25