Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

garasubo
August 08, 2020
6.9k

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

garasubo

August 08, 2020
Tweet

Transcript

  1. • 修士の研究として自作ハイパーバイザ(T-Visor) を制作 • ARMv7-AのVirtualization Extensionsを利用 • 現在はGithubで公開しているが、しばらく更新していな い •

    当時は組込み開発の経験はほとんどなく、つたない部分 も多くある • 現在は某ウェブサービス会社として主にフロントエ ンド開発 • 趣味で組込みシステム開発も少々 • RustでCortex-M向け自作OSをしたり 2020/08/08 2 背景
  2. • 仮想CPUや仮想デバイスをソフトウェアで提供す ることで、同一CPU上で複数のOSなどを動かす技 術 • Xen、KVM、Virtual Boxなど • 異なるOSを動かす、マルチテナントなクラウド環境を実 現するなど

    • Dockerなどのコンテナ型仮想化はまた異なる仕組 みの仮想化 • あちらはOS内のオブジェクトを多重化して提供 • 原理的に異なるOSを提供することはやや難しい • 仕組み的にハードウェアへの依存が少ない 2020/08/08 5 ここでの仮想化
  3. • 仮想CPUを単なるバイナリ変換で行うのは実行パ フォーマンスを大きく損なう • 同じアーキテクチャ上のシステムであればほとんど は直接CPUで実行しても大丈夫 • 算術命令などはプロセスのようにそのまま実行すればい い •

    デバイスに関与するものやCPU状態を変えてしまうもの はそのまま実行できない • OSの一部コードを書き換えてしまうことで仮想化を実現 する技術もある(準仮想化) 2020/08/08 6 仮想CPUを提供する
  4. 9 ARMv7-AにおけるCPUモード Monitor Mode PL0 PL1 PL2 PL0 PL1 Non-secure

    state Secure state VM ハイパー バイザ Hyp trap 2020/08/08
  5. 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の発生 により遷移する
  6. • DistributorとCPU interfaceに分けられる • Distributorが割り込みの行き先や優先度付けなどを担当 • CPU interfaceを通して割り込みを受け取ったり、処理の 完了を通知したりする •

    CPU interfaceにはVirtual CPU interfaceが存在 • ソフトウェアでの仮想化の手間がグンと減る • 仮想割り込みと物理割り込みの対応付けをしてくれる • Distributorは別途自前で実装する必要がある 2020/08/08 11 GICv2による割り込み処理
  7. • 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での変更点
  8. 17 組込みシステムにおける仮想化 2020/08/08 Embedded Processor Real-time Tasks Complicated Tasks •

    ハイパーバイザが独立した仮想環境(VM)を提供 • RTOSと汎用OSが同時に動作可能 • 従来のアプリケーションをそのまま移植できる • 例) ロボットの制御をITRONで、インターフェースをLinuxで Hypervisor
  9. 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を減らせる • 依存するシステムがな い • スケジューリングなど が柔軟に
  10. 27 仮想化の外観 VM メモリ デバイス Stage-2 MMU MMIO Hypervisor GIC

    (割り込みコントローラ) 仮想割り込み Hyp trap 2020/08/08
  11. • CPUの状態 • VEによりPL2モードでハイパーバイザが動作し、PL1以下で VMが動作 • 汎用レジスタやシステムレジスタの状態をメモリに退避させ ることで実行するVMを切り替える • メモリ・デバイス

    • Stage-2 MMUを利用することでメモリ・デバイスへのアクセ スを制限する • 従来のMMUアクセスに対してトラップが不要 • 割り込み • 一度ハイパーバイザが受けてから仮想割り込みを発行 • 割り込みコントローラも仮想化されている 28 仮想化の実装 2020/08/08
  12. • システムレジスタアクセスはトラップしてエミュ レート • CP15はちゃんと実装 • 他はさぼっている(それでもLinuxは動く) • VCPUの切り替えをプロセス切り替えみたいに実装 •

    Stage-2 MMUの設定をしてアクセスできるデバイ スを制限 • GICへのアクセスはトラップを仕込んで一部エミュ レートする必要がある • 物理割り込みを仮想割り込みとしてVCPUに渡す処理も 2020/08/08 29 基本的な実装方針
  13. • 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の仮想化について
  14. • マルチコアに向けた実装 • 組込みシステムでもマルチコアは一般化 • スケジューリングフレームワークの再検討 • 他の種類のOSを利用した評価 • 完全仮想化のため移植は簡単

    • 実アプリケーションの構成 • ロボット、IoTデバイスなどを想定 • ここが研究としてとても弱かった • このT-Visorそのものを更新する予定は今のところ ない 2020/08/08 36 今後の課題