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
410
RustでISUCONに勝つには
garasubo
1
620
Rustでの自作OSをやってきて
garasubo
0
1k
RustからX Window Systemを触る
garasubo
0
610
Rustで始める自作組込みOS
garasubo
1
3.4k
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.7k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
560
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
521
39k
The Cost Of JavaScript in 2023
addyosmani
46
7.2k
Gamification - CAS2011
davidbonilla
80
5.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
3
180
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
How GitHub (no longer) Works
holman
312
140k
Rails Girls Zürich Keynote
gr2m
94
13k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Music & Morning Musume
bryan
46
6.3k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
192
16k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
870
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 まとめ