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
自作ハイパーバイザーを作ってNuttXを動かした話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hidenori Matsubayashi
May 24, 2023
Science
1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自作ハイパーバイザーを作ってNuttXを動かした話
Talked at
https://elinux.org/Japan_Technical_Jamboree_80
Hidenori Matsubayashi
May 24, 2023
Other Decks in Science
See All in Science
データベース08: 実体関連モデルとは?
trycycle
PRO
0
1.1k
Endel Tulvingとエピソード記憶
rmaruy
0
130
白金鉱業Vol.21【初学者向け発表枠】身近な例から学ぶ数理最適化の基礎 / Learning the Basics of Mathematical Optimization Through Everyday Examples
brainpadpr
1
750
Kaggle: NeurIPS - Open Polymer Prediction 2025 コンペ 反省会
calpis10000
0
580
機械学習 - 授業概要
trycycle
PRO
0
520
データベース06: SQL (3/3) 副問い合わせ
trycycle
PRO
1
970
Cross-Media Technologies, Information Science and Human-Information Interaction
signer
PRO
3
32k
不動産業界における業界特化のデータ整備とAI活用 ─Vertical DataとVertical AI─
estie
1
540
生成AI・プレプリント時代における 研究成果公開の再設計 ― トップカンファレンス文化はどこへ向かうのか / Redesigning the Dissemination of Research Outputs in the Age of Generative AI and Preprints — Where Is the Top-Conference Culture Heading?
ykiyota
0
24k
Inside the Mind of an LLM
baggiponte
0
180
AIPシンポジウム 2025年度 成果報告会 「因果推論チーム」
sshimizu2006
3
520
共生概念の整理と AIアライメントの構想
hiroakihamada
0
220
Featured
See All Featured
A better future with KSS
kneath
240
18k
Prompt Engineering for Job Search
mfonobong
0
340
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Documentation Writing (for coders)
carmenintech
77
5.4k
Agile that works and the tools we love
rasmusluckow
331
21k
The Cult of Friendly URLs
andyhume
79
6.9k
What's in a price? How to price your products and services
michaelherold
247
13k
Building the Perfect Custom Keyboard
takai
2
790
Six Lessons from altMBA
skipperchong
29
4.3k
Producing Creativity
orderedlist
PRO
348
40k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Transcript
⾃作ハイパーバイザーを 作ってNuttXを動かした話 @HMatsubayashi @HidenoriMatsubayashi
はじめに 本資料は、 • Arm64 にフォーカスした(他のアーキテクチャには触れない)内容 • 細かい話より、Hypervisorの仕組みが⼤まかに理解出来ることが⽬的 • 仕事とは関係がない個⼈的なアクティビティ です
なぜHypervisorなのか?なぜ⾃作なのか? • 仮想化技術の基礎を学べる • Hypervisor ≒ ⼩さなOS + 仮想化 •
OSに必要な基本的な機能が⼀通り必要 • タスク (vCPU) スケジューラ、MMU/メモリ管理、マルチコアなど • ソースコード規模が⼩さい • 実⽤的なHypervisorでも数〜10万⾏程度のソースコード規模 • ⾃作した eVisor は約6500⾏ • ゲストOSは既存のもの(Linux, NuttXなど)がそのまま動く • ⾃作OSだとユーザランドをそれなりに作る必要があり(動作確認などのため)、時間がかかる • ⾃作する⽬的 • 作り⽅と仕組みを学ぶため • 徐々に動くようになっていく過程が楽しいから
⽬次 • Hypervisorとは? • Arm64 Hypervisor の概要と仕組み • eVisor (⾃作Hypervisor)
を作ってみた • 今後
Hypervisorとは? • 1台の物理マシン上で複数の仮想マシン (VM) を動かす環境を提供 • そのVM上でゲストOSは動作 • ゲストOSは隔離された環境で動作 •
他のゲストOSには影響を与えない • H/Wリソースは必要に応じてゲストOSに割り当て管理 • 必要に応じて仮想化 • H/Wの仮想化⽀援機構を出来るだけ利⽤ • 結局はエミュレータみたいなものだが、Hypervisorは実際のCPU (H/W) を利⽤してVMを動かす H/W Hypervisor VM VM VM OS OS OS
Type1 と Typ2 の2種類のHypervisor • Type1 (Baremetal) • H/W上で直接動作し、VMを作成するタイプ •
例: • Linux KVM (ハードウェアの仮想化はできず、vCPUのみのはず) • JAILHOUSE • Type2 (Host) • H/W上で動作するゲストOSの上で動作し、VMを作成して動かすタイプ • 実装/Hypervisorにもよるが、エミュレータに近いイメージ • 例: • VMware Player • QEMU (ただし、KVMを利⽤可能なので厳密にはType2ではない)
ここから先はType1 Hypervisor前提の内容 (Type2のことは⼀切触れない)
Hypervisor (仮想化) の実現⽅法 • 基本的な仕組み • 前提としてCPUの仮想化⽀援が必須 • vCPU (VM)
の特定の命令やメモリアクセスなどをHypervisorがトラップ • Hypervisorに割り込みが⼊る • 何の操作が⾏われたか確認して適切な処理を⾏い、再度VMを動かす • 必要に応じてH/Wを仮想化する • 同⼀のH/Wが複数VMで利⽤される場合 • なお、メモリマップの設定次第では直接H/Wアクセスの許可も可能 • 仮想化⽀援機構 • CPUコア • Hypervisor専⽤の動作モードを持っている • 特定の動作/メモリアクセス/割り込みをトラップする仕組みを提供 • H/W • これはSoCによるが、あるものとないものがある
Arm64の仮想化⽀援機構 ‒ CPUコア • ARMv7-Aから仮想化をサポート • EL (Exception Level) という
CPUの動作モード(特権モード)がある • ELの数値が⼤きいほど、出来ること(特定レジスタへのアクセスなど)が増える • ⾃分よりもレベルが低いELの動作をトラップ出来る • 例えば、メモリアクセスフォルト、特定のCPUレジスタへのアクセスなどのセンシティブ 命令など • EL0: ユーザアプリ • EL1: OS • EL2: Hypervisor • EL1/0の動作をEL2でトラップし、必要な処理を⾏った後、またEL1に処理を戻す • EL3: Firmware (セキュアモニタ)
Arm64の仮想化⽀援機構 ‒ CPUコア • CPUタイマー (Arm Generic Timer) • 複数VMが動く場合、⾃分以外のVMが動いている間に経過したリアル時間
(オフセット)を隠蔽する必要あり ⇨ 物理的なタイマーに対してオフセットを付与できる仮想タイマー機能あり • 詳細: https://zenn.dev/hidenori3/articles/413d8ef0a67463
Arm64の仮想化⽀援機構 ‒ システムコール • HVC 命令 • EL1からEL2に処理を戻す時に利⽤ • Hypervisor⽤のシステムコールとして利⽤
• APIを実装していけば KVM みたいなことが可能
Arm64の仮想化⽀援機構 ‒ メモリの仮想化 • MMU Stage2 • Hypervisorが利⽤する通常のMMU (Stage1) の仮想アドレスに対し
て、さらにゲストOS毎に⾃由にメモリをマッピング可能 • 中間アドレス, IPAなどと呼ぶ • ゲストOS毎にメモリ空間を隔離する必要あるため • デバイスI/Oの割り当て • 必要に応じて仮想デバイスの空間に割り当て • もし仮想化の必要がなければ、実アドレスに割り当ても可能 • メモリの割り当て • eVisorはオンデマンドページングで対応 • 事前に利⽤する領域が確定している、OSの起動⾼速化などが不要 であれば、事前に割り当ても可能 • 詳細 • https://zenn.dev/hidenori3/articles/91494881d318a5
Arm64の仮想化⽀援機構 ‒ 割り込みコントローラ • ARM Generic Interrupt Controller (GIC) は
v2.0か ら仮想化をサポート • 本資料ではGICの仕組みを説明 • なお、GIC以外の割り込みコントローラの仮想化はH/W 次第 • 基本的な仕組みは以下 1. 物理的なIRQをHypervisor (EL2) が⼀旦受ける 2. IRQ要因を⾒て、それがゲストOS (EL1) 向けのもの であれば、EL2からEL1に vIRQ を発⾏ • IRQ番号はHypervisorが⾃由に設定可能 3. EL1は通常のIRQとして認識して動く • 詳細 • https://zenn.dev/hidenori3/articles/b5bad28b262db4
GICの割り込み仮想化はソフトウェア対応が必要 • Hypervisor側で⼀部エミュレーションが必要で少し⾯倒 GICD (Distributor) GICC (CPU interface) GICH (Hypervisor)
GICV (vCPU interface) GICD エミュレーション GICD (Distributor) GICC (CPU interface) 実際のH/W Hypervisor vCPU MMU Stage2でGICC領域 をGICVにマッピング GICDはvCPU毎にエミュ レーションが必要 GICD: IRQ有効設定などのレジスタ GICC: IRQ要因などのレジスタ
ARM64の仮想化⽀援機構 ‒ その他H/W • H/Wを複数のゲストOSで利⽤する場合、Hypervisor側で • H/Wをフルエミュレート • 必要なH/Wレジスタのスナップショット(バックアップ)、VM切り 替え時にスナップショットも⼀緒にコンテキストスイッチ
などの対応が必要(H/W側で仮想化⽀援機構がない限り)
ここまで分かれば、 ⾃作Hypervisorを作ることが出来る!
eVisor (⾃作Hypervisor) 概要 • 特徴 • マルチvCPUサポート • Hypervisor Shell
• シリアルコンソール仮想化 • Hypervisor デバッグ&シェル⽤ • ゲストOSのシリアル⽤ • GIC v2サポート • ファイルシステム • FAT32 • ドライバ • GPIO • MailBox • MMC (SDカード) • UART (PL011) • H/Wサポート • QEMU • Raspberry Pi 4 (BMC2711) • なお、未実装機能多数あり • マルチコアサポートなど • ソースコード • https://github.com/HidenoriMatsubayashi/evisor H/W Driver (GPIO, MMC, UART, Timer, etc) FileSystem Memory Management Scheduler Virtual Machine vCPU vCPU vCPU EL2 EL1
NuttX on eVisor on Rasberry Pi4 • NuttX は RPI4
未サポート • 仕⽅がないので、NuttXは サポート済みのQEMU向 けにビルド • MMU Stage2で辻褄が合 うようにメモリとデバイ スI/Oを割り当て • UARTはNuttXとeVisorの 両⽅が同時に使えるよう にeVisorでエミュレー ション
振り返り 1. Raspberry Pi4で動くように作り始める 2. MMUを有効にすると正常に動かずハマる@Raspberry Pi4 3. 途⽅に暮れ、デバッグのためにQEMUサポートを追加する 4.
QEMUサポート追加し、作業効率が激上げする 5. NuttXをゲストOSに利⽤するためビルドを開始 • 当時はQEMU for ARM64のみサポート 6. NuttXのソースコードを⾒ていると改善ポイントがいくつかあったので、数件のPR (Pull request) を作って送るなどする 7. QEMUでは動くが、Raspberry Pi4 だと動かないバグにハマる • このパターンの多くは、キャッシュ周りのバグ(フラッシュ忘れなど) 8. NuttXがブート成功 9. eVisorからNuttX側への仮想割り込みが正常に通知されないバグにハマる 10. NuttXのシェル操作やそこからプログラム実⾏などが出来るようになる 11. ゼルダの伝説ティアーズオブザキングダム (Switch) 以外何も⼿が付かなくなる(現在)
今後 • ゲストOSでLinuxを動かす • 未実装機能の実装 • マルチVM (ゲストOS) のサポート •
⼤体は実装済みだが、⼀部のコンテキストスイッチが未実装 • マルチCPUコアのサポート • KVMみたいなAPIの追加 など • ゼロから作る⾃作Hypervisor的な記事(本)を書く
EOF