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
400
RustでISUCONに勝つには
garasubo
1
600
Rustでの自作OSをやってきて
garasubo
0
1k
RustからX Window Systemを触る
garasubo
0
600
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
550
Featured
See All Featured
For a Future-Friendly Web
brad_frost
175
9.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Mobile First: as difficult as doing things right
swwweet
222
9k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Site-Speed That Sticks
csswizardry
2
190
Writing Fast Ruby
sferik
628
61k
Fireside Chat
paigeccino
34
3.1k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
4 Signs Your Business is Dying
shpigford
181
21k
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 まとめ