Slide 1

Slide 1 text

Armの仮想化支援機構を 用いてハイパーバイザー を自作する @garasubo

Slide 2

Slide 2 text

• 修士の研究として自作ハイパーバイザ(T-Visor) を制作 • ARMv7-AのVirtualization Extensionsを利用 • 現在はGithubで公開しているが、しばらく更新していな い • 当時は組込み開発の経験はほとんどなく、つたない部分 も多くある • 現在は某ウェブサービス会社として主にフロントエ ンド開発 • 趣味で組込みシステム開発も少々 • RustでCortex-M向け自作OSをしたり 2020/08/08 2 背景

Slide 3

Slide 3 text

• 仮想化支援機構(Virtualization Extensions)とは • 組込みにおけるハイパーバイザー • 自作ハイパーバイザー:T-Visorについて • まとめ 2020/08/08 3 目次

Slide 4

Slide 4 text

4 仮想化支援機構 Virtualization Extensions 2020/08/08

Slide 5

Slide 5 text

• 仮想CPUや仮想デバイスをソフトウェアで提供す ることで、同一CPU上で複数のOSなどを動かす技 術 • Xen、KVM、Virtual Boxなど • 異なるOSを動かす、マルチテナントなクラウド環境を実 現するなど • Dockerなどのコンテナ型仮想化はまた異なる仕組 みの仮想化 • あちらはOS内のオブジェクトを多重化して提供 • 原理的に異なるOSを提供することはやや難しい • 仕組み的にハードウェアへの依存が少ない 2020/08/08 5 ここでの仮想化

Slide 6

Slide 6 text

• 仮想CPUを単なるバイナリ変換で行うのは実行パ フォーマンスを大きく損なう • 同じアーキテクチャ上のシステムであればほとんど は直接CPUで実行しても大丈夫 • 算術命令などはプロセスのようにそのまま実行すればい い • デバイスに関与するものやCPU状態を変えてしまうもの はそのまま実行できない • OSの一部コードを書き換えてしまうことで仮想化を実現 する技術もある(準仮想化) 2020/08/08 6 仮想CPUを提供する

Slide 7

Slide 7 text

• CPU状態を変更する命令や一部のメモリアクセス などをトラップする仕組みをハードウェアレベルで 提供する • Intel VT-xによりx86系プロセッサに実装され、多 くのハイパーバイザで利用される • 新しい動作モードの追加 • CPU状態を保存・書き戻しするための仕組み 2020/08/08 7 ハードウェアによる仮想化支援

Slide 8

Slide 8 text

• ARMv7-Aの拡張として実装可能 • ハイパーバイザ用の特権モードとしてPL2の追加 • 各種CPU命令へのトラップを設定可能に • ゲストOS用のシステムレジスタ • 割り込みコントローラも仮想化に対応 • ゲストOSでのメモリアクセスに対してさらにアド レス変換をさせることができる(Stage-2 MMU) 2020/08/08 8 Virtualization Extensions

Slide 9

Slide 9 text

9 ARMv7-AにおけるCPUモード Monitor Mode PL0 PL1 PL2 PL0 PL1 Non-secure state Secure state VM ハイパー バイザ Hyp trap 2020/08/08

Slide 10

Slide 10 text

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の発生 により遷移する

Slide 11

Slide 11 text

• DistributorとCPU interfaceに分けられる • Distributorが割り込みの行き先や優先度付けなどを担当 • CPU interfaceを通して割り込みを受け取ったり、処理の 完了を通知したりする • CPU interfaceにはVirtual CPU interfaceが存在 • ソフトウェアでの仮想化の手間がグンと減る • 仮想割り込みと物理割り込みの対応付けをしてくれる • Distributorは別途自前で実装する必要がある 2020/08/08 11 GICv2による割り込み処理

Slide 12

Slide 12 text

• 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での変更点

Slide 13

Slide 13 text

13 組込みにおける仮想化 2020/08/08

Slide 14

Slide 14 text

• インターネット接続機能 • ユーザーインターフェース • プロセッサの高度化 など 2020/08/08 14 組込みシステムの発展

Slide 15

Slide 15 text

汎用OSも使われるようになっている • 多様なソフトウェア・ライブラリ • リアルタイム性・セキュリティなどに問題 2020/08/08 15 組込みシステムにおけるOS (c) Larry Ewing Real-time OS (RTOS)が使われてきた • リアルタイム性 • ハードウェアリソースの消費が少ない

Slide 16

Slide 16 text

2020/08/08 16 組込みシステムにおけるOS • リアルタイム性を重視するタスクはRTOSに • 高度なユーザーインターフェースは汎用OSに • 高度な機能が重要度が高い部分に影響しないように したい 組込みシステムでも仮想化が注目

Slide 17

Slide 17 text

17 組込みシステムにおける仮想化 2020/08/08 Embedded Processor Real-time Tasks Complicated Tasks • ハイパーバイザが独立した仮想環境(VM)を提供 • RTOSと汎用OSが同時に動作可能 • 従来のアプリケーションをそのまま移植できる • 例) ロボットの制御をITRONで、インターフェースをLinuxで Hypervisor

Slide 18

Slide 18 text

2020/08/08 18 研究目的 組込みシステム向けの リアルタイムハイパーバイザを構築する リアルタイム性 信頼性 機能

Slide 19

Slide 19 text

19 自作ハイパーバイザ T-Visorについて 2020/08/08

Slide 20

Slide 20 text

• ARMv7-AアーキテクチャのVirtualization Extensions (VE)を利用することに特化 • 完全仮想化のType-1型ハイパーバイザ • 仮想マシン上のOSへの変更が不要 • ハードウェア上で直接動作 • 柔軟なスケジューリングフレームワーク • 開発者がスケジューラを実装する 20 設計概要 2020/08/08

Slide 21

Slide 21 text

2020/08/08 21 ハイパーバイザの基本設計 Hardware Hypervisor VM1 VM2 Type-1 Hypervisor Hardware Host OS VM1 Hypervisor VM2 Host OS App. Type-2 Hypervisor

Slide 22

Slide 22 text

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を減らせる • 依存するシステムがな い • スケジューリングなど が柔軟に

Slide 23

Slide 23 text

2020/08/08 26 実装

Slide 24

Slide 24 text

27 仮想化の外観 VM メモリ デバイス Stage-2 MMU MMIO Hypervisor GIC (割り込みコントローラ) 仮想割り込み Hyp trap 2020/08/08

Slide 25

Slide 25 text

• CPUの状態 • VEによりPL2モードでハイパーバイザが動作し、PL1以下で VMが動作 • 汎用レジスタやシステムレジスタの状態をメモリに退避させ ることで実行するVMを切り替える • メモリ・デバイス • Stage-2 MMUを利用することでメモリ・デバイスへのアクセ スを制限する • 従来のMMUアクセスに対してトラップが不要 • 割り込み • 一度ハイパーバイザが受けてから仮想割り込みを発行 • 割り込みコントローラも仮想化されている 28 仮想化の実装 2020/08/08

Slide 26

Slide 26 text

• システムレジスタアクセスはトラップしてエミュ レート • CP15はちゃんと実装 • 他はさぼっている(それでもLinuxは動く) • VCPUの切り替えをプロセス切り替えみたいに実装 • Stage-2 MMUの設定をしてアクセスできるデバイ スを制限 • GICへのアクセスはトラップを仕込んで一部エミュ レートする必要がある • 物理割り込みを仮想割り込みとしてVCPUに渡す処理も 2020/08/08 29 基本的な実装方針

Slide 27

Slide 27 text

• include/vcpu.h及びvcpu.cがメイン • 必要なレジスタの退避・復帰をしている • 各メンバはマニュアル参照のこと 2020/08/08 30 VCPU切り替え

Slide 28

Slide 28 text

• 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の仮想化について

Slide 29

Slide 29 text

• マルチコアに向けた実装 • 組込みシステムでもマルチコアは一般化 • スケジューリングフレームワークの再検討 • 他の種類のOSを利用した評価 • 完全仮想化のため移植は簡単 • 実アプリケーションの構成 • ロボット、IoTデバイスなどを想定 • ここが研究としてとても弱かった • このT-Visorそのものを更新する予定は今のところ ない 2020/08/08 36 今後の課題

Slide 30

Slide 30 text

2020/08/08 37 まとめ

Slide 31

Slide 31 text

• 組込みでも仮想化の需要あり • ARMv7-AのVEやARMv8-AでEL2が実装されてい れば比較的簡単にハイパーバイザが実装できる • 私は1年以上かかりましたが・・・ • XenやKVMがどういうふうに利用しているかを調べると 面白いかも 2020/08/08 38 まとめ