Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
BHyVe Code Reading
Search
Takuya ASADA
May 26, 2012
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BHyVe Code Reading
Takuya ASADA
May 26, 2012
More Decks by Takuya ASADA
See All by Takuya ASADA
Interrupt Affinityについて
syuu1228
0
350
僕のIntel NUCが起動しないわけがない
syuu1228
3
4.5k
Introduction to bhyve
syuu1228
1
470
OSv on bhyve
syuu1228
3
470
ruby-virtualmachine
syuu1228
0
310
BHyVeでOSvを起動したい 〜BIOSがなくてもこの先生きのこるには〜
syuu1228
2
920
10GbE時代のネットワークI/O高速化
syuu1228
14
8.9k
Play with UEFI
syuu1228
1
410
仮想化環境での利用者公平性
syuu1228
0
230
Other Decks in Technology
See All in Technology
Codex概要
ymiya55
0
170
形式手法を使って仕様をコーディングしよう
mikanichinose
0
160
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
120
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
310
キャリアLT今日までそして明日から
kentapapa
1
140
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
160
AWS FinOps Agent 結局何が得意なの?
siromi
0
230
AI Native Platform Engineering 〜PlatformとAgileで“作る速さ”を“価値”へ〜
uya116
0
590
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
1
630
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
270
VS Code × GitHub Copilot での Fabric 開発
ryomaru0825
1
210
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
310
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Git: the NoSQL Database
bkeepers
PRO
432
67k
ラッコキーワード サービス紹介資料
rakko
1
5.1M
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
30 Presentation Tips
portentint
PRO
1
410
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
Product Roadmaps are Hard
iamctodd
55
13k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Transcript
1 BHyVe code reading @syuu1228
2 お手元にソースコードをご 用意下さい https://github.com/lattera/b hyve
3 1, BHyVe 概要
4 BHyVe とは • FreeBSD 版の Linux KVM のようなもの •
Intel VT を用いたハイパーバイザ • 開発の初期段階でごく限定的な機能が実装されている ↓ 最低限のハイパーバイザ実装のよいサンプルになりそう
5 Web Site http://www.bhyve.org/
6 実装状況 • Intel VT-x, EPT 必須 (= Nehalem 以降必須
) • BIOS 非対応 (disk ブート出来ない ) • 対応デバイス : – PCI • virtio-net, virtio-blk • pci passthrough(VT-d) • pci UART – paravirtual console/debug port • 対応 OS: FreeBSD 8, 9, 10
7 割り込み • MSI 割り込みのみ対応 • 割り込みコントローラは Local APIC のみ実装
8 2,動作の流れ
9 おさらい: Linux KVM
10 Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に
VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4 .ゲスト環境実行 5 .何らかの trap 要因が発生、 VMExit する 6.VMExit 要因を調べ、要因に合わせたエミュレーション処 理を行う 7.3 に戻る エミュレータが欲しいなら、 QEMU を使えばいいじゃない
11 QEMU KVM Linux kernel IOCTL Guest kernel User program
VMLAUNCH VMExit Linux KVM 動作イメージ
12 Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に
VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4 .ゲスト環境実行 5 .何らかの trap 要因が発生、 VMExit する 6.VMExit 要因を調べ、要因に合わせたエミュレーション処 理を行う 7.3 に戻る 白いところを KVM がやる。黄色いところを QEMU がやる。
13 BHyVe は?
14 /usr/sbin/bhyve vmm.ko BSD kernel IOCTL(VM_RUN) Guest kernel User program
VMLAUNCH VMExit BHyVe 動作イメージ
15 Intel VT 向け VMM の動作の流れ 1.VMCS にゲスト環境の設定をロード 2.CPU に
VMCS をセット 3.VMLAUNCH でゲストモードに切り替え 4 .ゲスト環境実行 5 .何らかの trap 要因が発生、 VMExit する 6.VMExit 要因を調べ、要因に合わせたエミュレーション処 理を行う 7.3 に戻る 白いところを vmm.ko がやる。黄色いところを /usr/sbin/bhyve が やる。
16 /usr/sbin/bhyve の動作(1) • src/usr.sbin/bhyve/fbsdrun.c:669 fbsdrun_addcpu() で CPU0 のスレッドを作成 –
src/usr.sbin/bhyve/fbsdrun.c:209 pthread_create(fbsdrun_start_thread) • src/usr.sbin/bhyve/fbsdrun.c:195 vm_loop() – src/usr.sbin/bhyve/fbsdrun.c:476 while(1) {vm_run();}
17 /usr/sbin/bhyve の動作(2) • src/usr.sbin/bhyve/fbsdrun.c:476 while(1) { vm_run(); – src/lib/libvmmapi/vmmapi.c:265
ioctl(VM_RUN) vmm.ko に VMX non root mode への切り替 えを依頼 • src/usr.sbin/bhyve/fbsdrun.c:494 handler[exitcode]() EXIT_REASON に対応するエミュレー ション処理を呼び出し
18 3,ゲスト OS ローダ
19 何故ゲスト OS ローダが必要か • BHyVe には BIOS がない •
HDD のブートセクタから起動されるブートローダは BIOS に依存 している為、例え /usr/sbin/bhyve が起動時にブートセクタをロー ドして実行しても動作しない • BIOS のエミュレーションを実装する代わりにゲストの FreeBSD カーネルをゲストメモリ空間にロードして、いきなりカーネルを 実行している → Xen の domU と同じ • ロードを行うプログラムとゲストの実行を行うプログラムを分離 している – ロード: /usr/sbin/bhyveload – 実行: /usr/sbin/bhyve
20 bhyveload の動作 - vm_create • src/usr.sbin/bhyveload/bhyveload.c:557 vm_create(vmname) で /dev/vmm/%s
に device file を作成 – src/lib/libvmmapi/vmmapi.c:85 sysctl 経由で device file 作成を vmm.ko に依頼
21 bhyveload の動作 - vm_setup_memory • src/usr.sbin/bhyveload/bhyveload.c:570 vm_setup_memory() で membase
へゲスト空間を mmap – src/lib/libvmmapi/vmmapi.c:139 vmm.ko へ ioctl(VM_MAP_MEMORY) でゲスト空間をアロケート vmm.ko への mmap でゲスト空間を membase へマップ
22 bhyveload の動作 - vm_open • usr.sbin/bhyveload/bhyveload.c:564 vm_open(vmname) で /dev/vmm/%s
を open() – src/lib/libvmmapi/vmmapi.c:92 vm_open() • src/lib/libvmmapi/vmmapi.c:67 vm_device_open()
23 bhyveload の動作 – userboot.so • usr.sbin/bhyveload/bhyveload.c:589 – FreeBSD のブートローダをユーザ空間で動くように移植したも
の – メモリやレジスタへの読み書きを wrap 、ゲストのメモリ空間 /レジスタへアクセス – (メモリ空間は mmap 、レジスタの読み書きは ioctl 経由で VMM が管理するゲストのデスクリプタへ) – これを利用して kload が実装されている – ( Linux における kexec と同じ)
24 bhyveload の動作 – userboot.so • usr.sbin/bhyveload/bhyveload.c:589 dlopen で userboot.so
を開く • usr.sbin/bhyveload/bhyveload.c:594 dlsym で loader_main 関数のアドレスを取得 • usr.sbin/bhyveload/bhyveload.c:603 loader_main 関数を実行
25 bhyveload の動作 – userboot.so • loader_main 関数は boot2 とほぼ同じ動作を行うが、引数で渡
しているコールバック関数で以下のような処理を仮想化してい る – コンソールの読み書き cb_putc, cb_getc, cb_poll – ファイルの操作 cb_open, cb_close, cb_isdir, cb_read, cb_readdir, cb_seek, cb_stat – ディスクの読み書き cb_diskread – メモリの読み書き cb_copyin, cb_copyout, cb_getmem – レジスタの読み書き cb_setreg, cb_setmsr, cb_setcr, cb_setgdt, cb_exec
26 bhyveload の動作 – cb_copyin, cb_copyout • src/usr.sbin/bhyveload/bhyveload.c:297 membase へ
memcpy • src/usr.sbin/bhyveload/bhyveload.c:313 membase から memcpy
27 bhyveload の動作 – cb_setreg, cb_exec • src/usr.sbin/bhyveload/bhyveload.c:327 vm_set_register でレジスタセット
• src/usr.sbin/bhyveload/bhyveload.c:434 vm_setup_freebsd_registers でレジスタなどの初期化 – src/lib/libvmmapi/vmmapi_freebsd.c:63 vm_set_register, vm_set_desc で各種レジスタを初期化
28 bhyveload の動作 – vm_setup_freebsd_registers • src/lib/libvmmapi/vmmapi_freebsd.c:63 – CR0 =
PE | PG | NE # ページング、プロテクトモード – CR4 = PAE | VMXE # PAE 、 VMX 有効 – EFER = LME | LMA # long mode 有効 – GDT 初期化&セグメントレジスタ初期化 – タスクレジスタ初期化 – ページテーブル& CR3 初期化 – RSP 初期化 – エントリポイント設定
29 4, IO デバイス エミュレーション
30 ゲストカーネルのコンフィグレーション device pci device bvmconsole device bvmdebug device mptable
ACPI や多くのデバイスは無効 virtio.ko, if_vtnet.ko, virtio_pci.ko, virtio_blk.ko はモジュール としてビルド パラバーチャルなデバイスしか無い点は Xen の domU に 近い
31 /usr/sbin/bhyve vmm.ko BSD kernel IOCTL return Guest kernel VMExit
IO エミュレーション IO 命令 console PCI net blk io emulation 実行
32 /usr/sbin/bhyve の動作 – IO emulation • src/usr.sbin/bhyve/fbsdrun.c:494 handler[exitcode]() EXIT_REASON
に対応するエミュレー ション処理を呼び出し – src/usr.sbin/bhyve/fbsdrun.c:465 IO の場合は VM_EXITCODE_INOUT なので vmexit_inout • src/usr.sbin/bhyve/fbsdrun.c:281 EAX の値を取得して emulate_inout()
33 /usr/sbin/bhyve の動作 – IO emulation • src/usr.sbin/bhyve/inout.c:72 inout_handers[port].handler(in, port,
bytes, eax) port = 0x220 なら console ( src/usr.sbin/bhyve/consport.c:127 で定義) – src/usr.sbin/bhyve/consport.c:101 in = 1 ならキーボードから一文字を読んで eax に書く in = 0 なら eax から一文字読んで画面に書く
34 3, vmm.ko の提供するイ ンタフェース
35 sysctl • src/sys/amd64/vmm/vmm_dev.c:387 – hw.vmm.create(name) /dev/vmm/${name} に新しい VM インスタンスを指す
デバイスファイルを作成 – hw.vmm.destroy(name) /dev/vmm/${name} の VM インスタンスを削除
36 /dev/vmm/${name} へのファイル API • read/write – src/sys/amd64/vmm/vmm_dev.c:184 ゲスト空間の読み書き( offset
= ゲストの物理アドレス) • mmap – src/sys/amd64/vmm/vmm_dev.c:347 ゲスト空間のマップ (先頭ポインタがゲストの物理アドレス0番地)
37 /dev/vmm/${name} への ioctl (1) • src/sys/amd64/vmm/vmm_dev.c:144 • VM_RUN: VMLAUNCH
させる • VM_SET_PINNING/VM_GET_PINNING: CPU の固定割当 • VM_MAP_MEMORY: ゲストのメモリ空間割当 • VM_GET_MEMORY_SEG: 未調査 • VM_SET_REGISTER/VM_GET_REGISTER: ゲストレジス タの読み書き
38 /dev/vmm/${name} への ioctl(2) • VM_SET_SEGMENT_DESCRIPTOR/VM_GET_SEGMENT_D ESCRIPTOR: セグメントレジスタの読み書き • VM_INJECT_EVENT:
未調査 • VM_LAPIC_IRQ: 未調査 • VM_SET_CAPABILITY/VM_GET_CAPABILITY: VT-x のどの 機能を使うか(調査中) • VM_BIND_PPTDEV/VM_UNBIND_PPTDEV: PCI passthrough • VM_MAP_PPTDEV_MMIO: PCI passthrough
39 /dev/vmm/${name} への ioctl (3) • VM_PPTDEV_MSI: PCI passthorugh •
VM_INJECT_NMI: 未調査 • VM_STATS: 未調査 • VM_STAT_DESC: 未調査