Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
BHyVe Internals
Search
Takuya ASADA
May 26, 2012
Technology
0
100
BHyVe Internals
Takuya ASADA
May 26, 2012
Tweet
Share
More Decks by Takuya ASADA
See All by Takuya ASADA
Interrupt Affinityについて
syuu1228
0
280
僕のIntel NUCが起動しないわけがない
syuu1228
3
4.4k
Introduction to bhyve
syuu1228
1
400
OSv on bhyve
syuu1228
3
410
ruby-virtualmachine
syuu1228
0
260
BHyVeでOSvを起動したい 〜BIOSがなくてもこの先生きのこるには〜
syuu1228
2
840
10GbE時代のネットワークI/O高速化
syuu1228
14
8.7k
Play with UEFI
syuu1228
1
340
仮想化環境での利用者公平性
syuu1228
0
170
Other Decks in Technology
See All in Technology
ビジネス文書に特化した基盤モデル開発 / SaaSxML_Session_2
sansan_randd
0
270
Bet "Bet AI" - Accelerating Our AI Journey #BetAIDay
layerx
PRO
4
1.6k
専門分化が進む分業下でもユーザーが本当に欲しかったものを追求するプロダクトマネジメント/Focus on real user needs despite deep specialization and division of labor
moriyuya
1
1.2k
ホリスティックテスティングの右側も大切にする 〜2つの[はか]る〜 / Holistic Testing: Right Side Matters
nihonbuson
PRO
0
620
「Roblox」の開発環境とその効率化 ~DAU9700万人超の巨大プラットフォームの開発 事始め~
keitatanji
0
120
僕たちが「開発しやすさ」を求め 模索し続けたアーキテクチャ #アーキテクチャ勉強会_findy
bengo4com
0
2.1k
猫でもわかるQ_CLI(CDK開発編)+ちょっとだけKiro
kentapapa
0
3.4k
Claude Codeから我々が学ぶべきこと
oikon48
10
2.8k
AWS re:Inforce 2025 re:Cap Update Pickup & AWS Control Tower の運用における考慮ポイント
htan
1
220
SRE新規立ち上げ! Hubbleインフラのこれまでと展望
katsuya0515
0
170
Findy Freelance 利用シーン別AI活用例
ness
0
350
大規模イベントに向けた ABEMA アーキテクチャの遍歴 ~ Platform Strategy 詳細解説 ~
nagapad
0
190
Featured
See All Featured
How GitHub (no longer) Works
holman
314
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Code Review Best Practice
trishagee
69
19k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
750
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Faster Mobile Websites
deanohume
308
31k
The Pragmatic Product Professional
lauravandoore
36
6.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Transcript
1 BHyVe internals @syuu1228
2 1, BHyVe 概要
3 BHyVe とは • FreeBSD 版の Linux KVM のようなもの •
Intel VT を用いたハイパーバイザ • 開発の初期段階でごく限定的な機能が実装されている ↓ 最低限のハイパーバイザ実装のよいサンプルになりそう
4 新しい Web サイトと GSoC web site http://www.bhyve.org/ GSoC 2012:
BHyVe BIOS emulation to boot legacy systems http://bit.ly/bhyve_bios
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
6 /usr/sbin/bhyve vmm.ko BSD kernel IOCTL(VM_RUN) Guest kernel User program
VMLAUNCH VMExit 動作イメージ
7 使い方 • /boot/loader.conf hw.physmem="0x100000000" (ホストのメモリ割り当てを減らしてゲスト用の領域を 用意) • kldload vmm.ko
/usr/sbin/bhyveload -m ${lowmem} -M {highmem} -h {bootdir} $ {vmname} /usr/sbin/bhyve -c ${cpus} -m ${lowmem} -M{highmem} \ -s 1,virtio-net,tap0 -s 2,virtio-blk,${diskdev}
8 各コマンドの役割分担 • /usr/sbin/bhyveload VM インスタンスを作成し、 BSD カーネルを VM インスタンスのメモ
リ領域にロードして起動可能な状態を作る • /usr/sbin/bhyve bhyveload が初期化した VM インスタンスを実行し、ディス ク、 NIC 、コンソールなどのデバイスエミュレーション処理を行う VM インスタンスの状態は、プロセス内ではなく /dev/vmm/${vmname} というデバイス上、つまりカーネル内に保持される。 このファイルへ read(), write(), mmap() する事により VM 内のメモリ空 間にアクセス出来る。
9 bhyveload の動作 • sysctl(“hw.vmm.create”, vm_name) → /dev/vmm/${vm_name} を作成 •
open(/dev/vmm/${vm_name}) • seg.gpa = 0 seg.len = mem_size ioctl(fd, VM_MAP_MEMORY, seg) membase = mmap(NULL, mem_size, PROT_READ| PROT_WRITE, MAP_SHARED, fd, 0) • userboot.so を使って membase の領域へ BSD カーネルを memcpy()
10 userboot.so • FreeBSD のブートローダをユーザ空間で動くように移植 したもの • メモリやレジスタへの読み書きを wrap 、ゲストのメモリ
空間/レジスタへアクセス (メモリ空間は mmap 、レジスタの読み書きは ioctl 経由 で VMM が管理するゲストのデスクリプタへ) • これを利用して kload が実装されている ( Linux における kexec と同じ)
11 bhyve の動作 • open(/dev/vmm/${vm_name}) • デバイス初期化 • pthread_create(fbsdrun_start_thread) fbsdrun_start_thread()
{ while(1) { ioctl(VM_RUN, &vmexit) handler[vmexit.exitcode](&vmexit, &vcpu); } } • メイン関数はデバイスエミュレーションの処理要求イベントを kevent() で待つ
12 デモ http://www.youtube.com/watch?v=N2TbKzE_puA
13 2, CPU の初期化と OS のロード
14 vCPU の初期化 • bhyveload で以下の初期化を実施 – CR0 = PE
| PG | NE # ページング、プロテクトモード – CR4 = PAE | VMXE # PAE 、 VMX 有効 – EFER = LME | LMA # long mode 有効 – GDT 初期化&セグメントレジスタ初期化 – タスクレジスタ初期化 – ページテーブル& CR3 初期化 – RSP 初期化 – エントリポイント設定
15 mptable の初期化 • /usr/sbin/bhyve から実行(引数の CPU 数を使用) • (未実装な
ACPI を使わずに)セカンダリ CPU の情報を OS に伝える • BIOS ROM 領域上にテーブルを用意 • PCI デバイスや割り込みの情報の伝達にも使ってる?
16 bhyveload の役割 • ホストのユーザ空間でブートローダを起動して、カーネ ルをロードする為のレジスタ/セグメント/ページテー ブルの初期化を行う • ゲストはいきなり 64bit
モードでカーネルを実行
17 3, IO デバイス エミュレーション
18 ゲストカーネルのコンフィグレーション device pci device bvmconsole device bvmdebug device mptable
ACPI や多くのデバイスは無効 virtio.ko, if_vtnet.ko, virtio_pci.ko, virtio_blk.ko はモジュール としてビルド
19 /usr/sbin/bhyve vmm.ko BSD kernel IOCTL return Guest kernel VMExit
IO エミュレーション IO 命令 console PCI net blk io emulation 実行
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 ポートに割り当てられ たハンドラが実行される
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);
22 PCI バス • CONFIG_ADDRESS レジスタ: 0xcf8 • CONFIG_DATA レジスタ:
0xcfc – 0xcff • 各仮想 PCI デバイスは初期化時に自分のコンフィグレジ スタの値を設定 • 各仮想 PCI デバイスの IO レジスタはデバイス初期化時に 動的に確保
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 にフラグをセット
24 MSR register のエミュレーション • Local APIC をエミュレートする為に、 wrmsr/rdmsr 命令で
VMExit を発生させ、エミュレーションを行なっている • ほぼ vmm.ko でエミュレーションを行なっているが、初期 化周りの一部の処理で /usr/sbin/bhyve へエミュレーション を行わせている
25 タイマー • Local APIC Timer vmlaunch 前にタイマーの値を計算、 vlapic へ割り込みを設定
vmm.ko 内でエミュレーション • TSC rdtsc を trap していないように見える (その場合どうなるんだろう??) • PIT 8254 /usr/sbin/bhybe で IO ポートアクセスのエミュレーションをして いる 割り込むコードが見当たらないような…??
26 virtio-net, blk • PCI デバイス、 IO エミュレーションと MSI 割り込みを使
用 • /usr/sbin/bhyve でエミュレーション • MMIO は使っていない (そもそも MMIO に対応していないっぽい…)
27 pci passthrough(VT-d) • デフォルトでは使わない • Intel VT-d を使って PCI
デバイスをゲストに割り当てる機 能 • 物理デバイス→ゲストへの割り込み転送は vmm.ko 内で行 なっているが、 io は一度 /usr/sbin/bhyve へ戻しているよう に見える • MMIO 空間は EPT 経由でゲストにマップしている模様
28 UART • ( bvm_console がダサいので)最近実装されました • てっきり PC の
COM ポートをエミュレーション出来るよ うにしたのかと思ったら、なんと PCI デバイス…。 • Siig CyberSerial 1-port と自己申告 • IOAPIC 未実装だから割り込みも未実装\ (^o^) /
29 まとめ • たったこれだけのデバイスエミュレーションで、 (ちょっと苦しいけど)ゲスト OS が動く事が分かる – 但し、準仮想化デバイスを幾つか使っているのでゲスト側ドラ イバが必須
• 現状では FreeBSD しか動かないが、 FreeBSD カーネルに 依存している訳ではない事がわかる – bhyveload を fork して自分の起動したい OS に対応したものを書 けば、動きそう
30 おまけ • BHyVe Hackathon 参加者募集中 • http://bit.ly/bhyve_hackathon 詳しくは @syuu1228
まで