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
99
BHyVe Internals
Takuya ASADA
May 26, 2012
Tweet
Share
More Decks by Takuya ASADA
See All by Takuya ASADA
Interrupt Affinityについて
syuu1228
0
210
僕のIntel NUCが起動しないわけがない
syuu1228
3
4.3k
Introduction to bhyve
syuu1228
1
350
OSv on bhyve
syuu1228
3
370
ruby-virtualmachine
syuu1228
0
240
BHyVeでOSvを起動したい 〜BIOSがなくてもこの先生きのこるには〜
syuu1228
2
810
10GbE時代のネットワークI/O高速化
syuu1228
14
8.6k
Play with UEFI
syuu1228
1
290
仮想化環境での利用者公平性
syuu1228
0
150
Other Decks in Technology
See All in Technology
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
130
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
3
2.4k
.NET 9 のパフォーマンス改善
nenonaninu
0
1k
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
19
18k
[Ruby] Develop a Morse Code Learning Gem & Beep from Strings
oguressive
1
170
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
110
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
170
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1.1k
Wantedly での Datadog 活用事例
bgpat
1
530
サーバーなしでWordPress運用、できますよ。
sogaoh
PRO
0
110
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
120
Featured
See All Featured
Building Your Own Lightsaber
phodgson
103
6.1k
Speed Design
sergeychernyshev
25
670
Become a Pro
speakerdeck
PRO
26
5k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Mobile First: as difficult as doing things right
swwweet
222
9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Adopting Sorbet at Scale
ufuk
73
9.1k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
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
まで