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
Armの仮想化支援機構を用いてハイパーバイザーを自作する
Search
garasubo
August 08, 2020
3
6.9k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
August 08, 2020
Tweet
Share
More Decks by garasubo
See All by garasubo
Cancel Safetyとスレッドリーク
garasubo
1
370
RustでISUCONに勝つには
garasubo
1
540
Rustでの自作OSをやってきて
garasubo
0
1k
RustからX Window Systemを触る
garasubo
0
590
Rustで始める自作組込みOS
garasubo
1
3.3k
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.7k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
550
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
334
57k
Fireside Chat
paigeccino
34
3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Building Applications with DynamoDB
mza
90
6.1k
Statistics for Hackers
jakevdp
796
220k
A better future with KSS
kneath
238
17k
Making Projects Easy
brettharned
115
5.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
Speed Design
sergeychernyshev
25
620
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Transcript
Armの仮想化支援機構を 用いてハイパーバイザー を自作する @garasubo
• 修士の研究として自作ハイパーバイザ(T-Visor) を制作 • ARMv7-AのVirtualization Extensionsを利用 • 現在はGithubで公開しているが、しばらく更新していな い •
当時は組込み開発の経験はほとんどなく、つたない部分 も多くある • 現在は某ウェブサービス会社として主にフロントエ ンド開発 • 趣味で組込みシステム開発も少々 • RustでCortex-M向け自作OSをしたり 2020/08/08 2 背景
• 仮想化支援機構(Virtualization Extensions)とは • 組込みにおけるハイパーバイザー • 自作ハイパーバイザー:T-Visorについて • まとめ 2020/08/08
3 目次
4 仮想化支援機構 Virtualization Extensions 2020/08/08
• 仮想CPUや仮想デバイスをソフトウェアで提供す ることで、同一CPU上で複数のOSなどを動かす技 術 • Xen、KVM、Virtual Boxなど • 異なるOSを動かす、マルチテナントなクラウド環境を実 現するなど
• Dockerなどのコンテナ型仮想化はまた異なる仕組 みの仮想化 • あちらはOS内のオブジェクトを多重化して提供 • 原理的に異なるOSを提供することはやや難しい • 仕組み的にハードウェアへの依存が少ない 2020/08/08 5 ここでの仮想化
• 仮想CPUを単なるバイナリ変換で行うのは実行パ フォーマンスを大きく損なう • 同じアーキテクチャ上のシステムであればほとんど は直接CPUで実行しても大丈夫 • 算術命令などはプロセスのようにそのまま実行すればい い •
デバイスに関与するものやCPU状態を変えてしまうもの はそのまま実行できない • OSの一部コードを書き換えてしまうことで仮想化を実現 する技術もある(準仮想化) 2020/08/08 6 仮想CPUを提供する
• CPU状態を変更する命令や一部のメモリアクセス などをトラップする仕組みをハードウェアレベルで 提供する • Intel VT-xによりx86系プロセッサに実装され、多 くのハイパーバイザで利用される • 新しい動作モードの追加
• CPU状態を保存・書き戻しするための仕組み 2020/08/08 7 ハードウェアによる仮想化支援
• ARMv7-Aの拡張として実装可能 • ハイパーバイザ用の特権モードとしてPL2の追加 • 各種CPU命令へのトラップを設定可能に • ゲストOS用のシステムレジスタ • 割り込みコントローラも仮想化に対応
• ゲストOSでのメモリアクセスに対してさらにアド レス変換をさせることができる(Stage-2 MMU) 2020/08/08 8 Virtualization Extensions
9 ARMv7-AにおけるCPUモード Monitor Mode PL0 PL1 PL2 PL0 PL1 Non-secure
state Secure state VM ハイパー バイザ Hyp trap 2020/08/08
10 ARMv7-AにおけるCPUモード Monitor Mode PL0 PL1 PL2 PL0 PL1 Non-secure
state Secure state VM ハイパー バイザ Hyp trap 2020/08/08 • Non-Secure stateの み使用 • PL0とPL1をVMが 使う • PL2モードでハイ パーバイザが動作 • VEにより追加 • Hyp trapの発生 により遷移する
• DistributorとCPU interfaceに分けられる • Distributorが割り込みの行き先や優先度付けなどを担当 • CPU interfaceを通して割り込みを受け取ったり、処理の 完了を通知したりする •
CPU interfaceにはVirtual CPU interfaceが存在 • ソフトウェアでの仮想化の手間がグンと減る • 仮想割り込みと物理割り込みの対応付けをしてくれる • Distributorは別途自前で実装する必要がある 2020/08/08 11 GICv2による割り込み処理
• PLはException Level(EL)という名称に変わる • EL2はセキュア状態でも利用可能に • EL2はオプショナルなので、必ず存在するわけではない • v8.1でVirtualization Host
Extensions(VHE)が導 入 • v8.3-NVではNested Virtualizationへのサポートも 追加 • 割り込みコントローラはGICv3またはGICv4が使わ れ、概念が追加されている 2020/08/08 12 ARMv8-Aでの変更点
13 組込みにおける仮想化 2020/08/08
• インターネット接続機能 • ユーザーインターフェース • プロセッサの高度化 など 2020/08/08 14 組込みシステムの発展
汎用OSも使われるようになっている • 多様なソフトウェア・ライブラリ • リアルタイム性・セキュリティなどに問題 2020/08/08 15 組込みシステムにおけるOS (c) Larry
Ewing Real-time OS (RTOS)が使われてきた • リアルタイム性 • ハードウェアリソースの消費が少ない
2020/08/08 16 組込みシステムにおけるOS • リアルタイム性を重視するタスクはRTOSに • 高度なユーザーインターフェースは汎用OSに • 高度な機能が重要度が高い部分に影響しないように したい
組込みシステムでも仮想化が注目
17 組込みシステムにおける仮想化 2020/08/08 Embedded Processor Real-time Tasks Complicated Tasks •
ハイパーバイザが独立した仮想環境(VM)を提供 • RTOSと汎用OSが同時に動作可能 • 従来のアプリケーションをそのまま移植できる • 例) ロボットの制御をITRONで、インターフェースをLinuxで Hypervisor
2020/08/08 18 研究目的 組込みシステム向けの リアルタイムハイパーバイザを構築する リアルタイム性 信頼性 機能
19 自作ハイパーバイザ T-Visorについて 2020/08/08
• ARMv7-AアーキテクチャのVirtualization Extensions (VE)を利用することに特化 • 完全仮想化のType-1型ハイパーバイザ • 仮想マシン上のOSへの変更が不要 • ハードウェア上で直接動作
• 柔軟なスケジューリングフレームワーク • 開発者がスケジューラを実装する 20 設計概要 2020/08/08
2020/08/08 21 ハイパーバイザの基本設計 Hardware Hypervisor VM1 VM2 Type-1 Hypervisor Hardware
Host OS VM1 Hypervisor VM2 Host OS App. Type-2 Hypervisor
2020/08/08 22 ハイパーバイザの基本設計 Hardware Hypervisor VM1 VM2 Type-1 Hypervisor Hardware
Host OS VM1 Hypervisor VM2 Host OS App. Type-2 Hypervisor • OSに依存しない • TCBを減らせる • 依存するシステムがな い • スケジューリングなど が柔軟に
2020/08/08 26 実装
27 仮想化の外観 VM メモリ デバイス Stage-2 MMU MMIO Hypervisor GIC
(割り込みコントローラ) 仮想割り込み Hyp trap 2020/08/08
• CPUの状態 • VEによりPL2モードでハイパーバイザが動作し、PL1以下で VMが動作 • 汎用レジスタやシステムレジスタの状態をメモリに退避させ ることで実行するVMを切り替える • メモリ・デバイス
• Stage-2 MMUを利用することでメモリ・デバイスへのアクセ スを制限する • 従来のMMUアクセスに対してトラップが不要 • 割り込み • 一度ハイパーバイザが受けてから仮想割り込みを発行 • 割り込みコントローラも仮想化されている 28 仮想化の実装 2020/08/08
• システムレジスタアクセスはトラップしてエミュ レート • CP15はちゃんと実装 • 他はさぼっている(それでもLinuxは動く) • VCPUの切り替えをプロセス切り替えみたいに実装 •
Stage-2 MMUの設定をしてアクセスできるデバイ スを制限 • GICへのアクセスはトラップを仕込んで一部エミュ レートする必要がある • 物理割り込みを仮想割り込みとしてVCPUに渡す処理も 2020/08/08 29 基本的な実装方針
• include/vcpu.h及びvcpu.cがメイン • 必要なレジスタの退避・復帰をしている • 各メンバはマニュアル参照のこと 2020/08/08 30 VCPU切り替え
• GICDについては仮想化が必要 • GICDへのレジスタ操作をすべてトラップして実 GICDを触らせない • include/virtual_gic.h及びgic.c • 割り込み処理はirq_handle.cにて •
GIC割り込み処理関数として virtual_gic_send_hardware_intを登録してあげる • 物理割り込みIDを仮想IDに変換してあげたりなど 2020/08/08 31 GICの仮想化について
• マルチコアに向けた実装 • 組込みシステムでもマルチコアは一般化 • スケジューリングフレームワークの再検討 • 他の種類のOSを利用した評価 • 完全仮想化のため移植は簡単
• 実アプリケーションの構成 • ロボット、IoTデバイスなどを想定 • ここが研究としてとても弱かった • このT-Visorそのものを更新する予定は今のところ ない 2020/08/08 36 今後の課題
2020/08/08 37 まとめ
• 組込みでも仮想化の需要あり • ARMv7-AのVEやARMv8-AでEL2が実装されてい れば比較的簡単にハイパーバイザが実装できる • 私は1年以上かかりましたが・・・ • XenやKVMがどういうふうに利用しているかを調べると 面白いかも
2020/08/08 38 まとめ