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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for garasubo garasubo
August 08, 2020
7.5k

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

Avatar for garasubo

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 今後の課題