$30 off During Our Annual Pro Sale. View Details »

ARMの仮想化支援機構 arm入門勉強会

ARMの仮想化支援機構 arm入門勉強会

2020/08/08 arm入門勉強会 (https://connpass.com/event/180812/) の @nullpo_head (https://twitter.com/nullpo_head) の発表資料です。

「現代の仮想マシンはどういう仕組みで動いているのか」の包括的な入門の話と、arm v8.1アーキテクチャの仮想化支援機構の紹介をしています。armのEL2のintel vt-xとの設計思想の違い、arm kvmの特殊な構造などについても紹介しました。

logmi様による文字起こし記事があります。
『VM環境のCPU仮想化はどうやって実現しているのか
ハードウェア仮想化支援機構の仕組み - logmi』 https://logmi.jp/tech/articles/323956

Takaya Saeki

August 08, 2020
Tweet

More Decks by Takaya Saeki

Other Decks in Technology

Transcript

  1. 自己紹介 • Takaya Saeki (@nullpo_head) • ソフトウェアエンジニア • シスプロとwebプロが好き •

    過去の面白げなプロジェクト • CPU実験でXv6をMIPSと自作CPUに移植 • 未踏2016でNoah • 仮想化を乱用すればWSL1をユーザー空間で実装できるぞという手法(VEE 20 • 8/22のContainer Runtime Meetup #2でNoahの話をします • Sudo by Windows Hello in WSL
  2. いわゆる「仮想マシン」の基盤技術 • いわゆる仮想マシンとは • ソフトウェアによって、 仮想的なハードウェア上で動く別のOSをエミュレートする* • 具体的なプロダクト • Qemu-Kvm,

    VMWare, Parallels, Hyper-Vとか • 現代の仮想マシンはハイパーバイザーを通じて CPUのハードウェア仮想化支援機構を利用している • Intel VT-x, AMD-V, Arm Virtualization Extensions…
  3. CPUの仮想化 • ソフトウェア的に、別の仮想的なCPUをエミュレートすること • この上でゲストOSがブートする • 一番分かりやすいのは、機械語のシミュレータを動かす方法 • 性能がかなり悪いが、確かに仮想的なCPUができる (e.g.

    Bochs • CPUの仮想化支援機構は、大半の命令を実際にCPUで 直接実行し、 仮想化の必要がある命令だけKVMなどのハイ パーバイザーにエミュレーションを任せることで高速な仮想 CPUを実現する • 例:ハードウェアIOとか
  4. 最近のVMの仕組み 仮想CPU デバイスIO (センシティブ命令) VMEXIT Ioctl, デバイスIO要求通知 ゲストプロセス Ioctl, VCPUラ

    ン要求 VMENTRY システムコール など デバイス シミュレーション 特権レベル Userレベル ハードウェア仮想化支援 機構が仮想CPUを動かす
  5. 仮想化の必要がある命令とは • 「センシティブ命令」と呼ばれる • 仮想CPU上では実CPUと動作を変えるべき命令のこと • 要は、仮想CPUが自分を実マシン上の実CPUだと思い込むために 動作を細工する必要がある命令のこと • 例えば、CoreファミリーCPU上でPentiumマシンをエミュレートするなら、

    CPUID命令のFamilyの値をPentiumのものに変える必要がある • CPUの仮想化支援機構は、センシティブ命令をトラップする仕組み • ハイパーバイザーは普通の命令はCPUに直接実行させ、 センシティブ命令だけ命令エミュレーションをすればいい • 典型的なセンシティブ命令は、CPUで完結させることもできる機構が多い メモリマッピング変更とか
  6. PopekとGoldbergの仮想化要件 • もともとすべてのセンシティブ命令が特権レベルでトラップで きるアーキテクチャなら、実は特別な仮想化支援機構がなくて も効率的に仮想化を実現できる • ユーザーレベルでゲストOSを直接実行して、センシティブ命令 をホストOSがトラップすれば、ハイパーバイザーが実現できる • システムコールや割り込みはゲストOSのアプリケーションからゲスト

    OSのカーネルにプロクシしてあげる • 権限レベルの読み取りがきたら、ほんとはユーザーレベルなんだけど 特権レベルだと回答する(ちなみにx86だとこれができない) • ただし現代の仮想化支援機構はこういう処理に相当することを ハードウェアでやってくれるからもっと便利で高速
  7. ハードウェア仮想化支援機構まとめ • 現代の仮想マシンは、高速な仮想CPUの実行のために ハードウェア仮想化支援機構を利用している • CPUの仮想化支援機構は、大半の命令を実際にCPUで直接実行 するが、 センシティブ命令はトラップしてハイパーバイザーに 処理を任せることで高速に仮想CPUを実現する •

    PopekとGoldbergの仮想化要件として、すべてのセンシティブ 命令が特権命令であるアーキテクチャは仮想化支援機構がなく ても割合高速な仮想CPUが実現できることが知られている • ただし現代の仮想化支援機構はハードウェアで仮想化が 完結するセンシティブ命令がたくさんあってもっと効率的
  8. 資料ポインタ 数字の順に読むとかなり理解が深まります 1. 公式ドキュメントによる簡潔な外観。詳細はないがざっと読める (https://developer.arm.com/architectures/learn-the-architecture/armv8-a- virtualization) 2. KVM on ARMの実装の論文

    (Arm v7での仮想化の話). ARMの仮想化支援機構について かなり詳細に理解できる (http://systems.cs.columbia.edu/files/wpid-asplos2014-kvm.pdf) 3. Virtualization Host Extensionの論文. Arm v8で導入されたVHEのモチベーションの話. (http://www.cs.columbia.edu/~cdall/pubs/isca2016-dall.pdf) 4. 1, 2, 3の資料がかなりよくまとまったクレタ大の講義資料。事前知識なしに読んでも ふーんという感じだが、1,2,3を読んだうえで読むと概念の整理がされる (https://www.csd.uoc.gr/~hy428/reading/vm-support-ARM-may6-2019.pdf)
  9. Arm Virtualization Extension • Hypervisor用の Exception Level、EL2 が導入された • EL2はEL0,

    EL1での センシティブ命令を トラップできる • トラップしないように もできる。 例えばシステムコール はEL0 -> EL1にしたい Virtualization in AArch64 | arm Developerより引用 https://developer.arm.com/architectures/learn-the- architecture/armv8-a-virtualization/virtualization-in-aarch64
  10. EL2によるゲストOSの仮想化 • ゲストOSやそのユーザーアプリケーションがEL1/EL0でセンシ ティブ命令を発行すると、例外としてトラップされてEL2にス イッチする • 例えば • WFI (次のスライドにて説明)

    • MMIO • メモリマップの変更 (メモリマップに関してはもっと効率的な方法がある) • ハイパーバイザーがセンシティブ命令を仮想化されたCPUの状 態とつじつまが合うよう処理してCPUの仮想化を実現する
  11. EL2による仮想化; TWI命令を例に TWI命令:Wait For Interrupt, CPUを待機状態に ⇒ゲストOSに勝手に発行させず、トラップし て別のゲストOSにCPUを明け渡したい 1. あるOSがEL1でWFIを発行する

    2. 仮想化支援機構により、 例外としてEL2にトラップされる 3. EL2でハイパーバイザがレジスタなど EL1の状態を退避 4. 別のゲストOSの状態を EL0/EL1に復元する 5. 復元した別のゲストOSのELに切り替え https://developer.arm.com/architectures/learn- the-architecture/armv8-a-virtualization/trapping- and-emulation-of-instructions より引用
  12. X86 VT-xとの違い • Intel VT-xは権限レベル(リング)とは直 交する概念としてroot modeとnon-root modeを導入した • ホストOSもゲストOSもRing

    0で動く • 一方、ArmはOSより上の権限レベルとし てEL2を導入した =>これが結構本質的な違いとして、 ハイパーバイザーの作りやすさに影響する ハイパーバイザの作り方 https://syuu1228.github.io/howto_implem ent_hypervisor/part1.html より引用
  13. Type-2 Hypervisorが実装しづらい (1/2) • HypervisorはType 1とType 2に分類される • Hyper-VがType 1で、KVMがType

    2 ARM Virtualization: Performance and Architectural Implications (C. Dall, et al.) http://www.cs.columbia.edu/~cdall/pubs/isca2016- dall.pdfより引用
  14. • EL2では EL1用カーネルが動かない • 触るべきレジスタがEL1と違う • EL1では、ユーザー空間とカーネ ル空間用の二つのページテーブル レジスタがあるが、EL2には一つ しかない

    • Host OSがHypervisorを兼ねる Type-2の実装が大変 (e.g. KVM EL2では 実現できない https://developer.arm.com/architectures/learn-the- architecture/armv8-a-virtualization/introduction-to- virtualizationより引用 Type-2 Hypervisorが実装しづらい (2/2)
  15. KVM on ARM v7での工夫 • EL2で動くLowvisorとEL1 で動くHighvisorに 分けた • LowvisorとHighvisorの

    スイッチにコストがかかる うえ、 メモリ空間が共有しづらい ので実装が複雑に KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor (C. Dall, et al.) https://www.cs.columbia.edu/~nieh/pubs/asplos20 14_kvmarm.pdfより引用
  16. Virtualization Host Extensions (VHE) • ARMv8.1から • EL2でEL1のレジスタをエミュ レートしたりして、EL2用の OSを小さな修正で動かせるよう

    にした • Type-2 Hypervisorを 作りやすくする • KVMもARMv8.1以降ではx86と 同じ構造のまま素直に動く (クレタ大の講義資料によると) https://www.csd.uoc.gr/~hy428/reading/vm- support-ARM-may6-2019.pdfより引用
  17. メモリ空間の仮想化 • Stage 2 Translationとよばれる CPUによるVMメモリアドレス変換機構がある • VMの中での、VM仮想アドレス -> VMの物理アドレスの変換

    • VMの外での、VMの物理アドレス -> 本当の物理アドレスの変換 の2段階変換があるから、stage 2 • もし仮にこれがなければ、VM中のメモリマッピングの読み書 きをするセンシティブ命令をトラップし、 毎回書き換える必要がある(シャドーページング) • DMAの変換をする、SMMUもある
  18. Nested Virtualizationの支援 • ARMv8.3より、EL1でEL2の レジスタにアクセスしたり、 仮想化周りの命令を発行した 場合、それをEL2でトラップ できるようになった • ⇒EL1でゲストハイパーバイ

    ザーを動かすことで、効率的 なNested Virtualizationが可 能に https://developer.arm.com/architectures/learn-the- architecture/armv8-a-virtualization/nested- virtualizationより引用
  19. Arm Virtualizationまとめ • AArch64では、EL0/EL1のセンシティブ命令をトラップできる EL2というException Levelにより仮想化支援機構を実現した • EL2は、EL1と異なる点があるが、Arm Virtualization Host

    Extensionsを有効にすると、ごく少ない修正でEL1用のカーネ ルが動作するようになる • KVM on Armでは、VHEがない環境ではEL2で動くLowvisor, EL1で動 くHighvisorに分割される。 しかし、VHEがある環境では、LinuxカーネルごとEL2で動く • メモリアドレス、割り込みコントローラ、タイマーのハード ウェア仮想化がサポート • 効率的なNested Virtualizationをサポート
  20. Apple Hypervisor Frameworkとは? • Apple謹製の、macOS組み込みのVMMを使うためのAPI • VMM: Virtual Machine Monitor.

    CPUの仮想化支援機構を抽象化したモジュール • macOS版KVMといえる • VMwareやParallelsが使用している
  21. まとめ • 最近の仮想マシンはハードウェア仮想化支援機構を利用してい る • CPUのハードウェア仮想化支援機構はセンシティブ命令をト ラップする方法を提供するもの • メモリ空間の仮想化など、単なるセンシティブ命令のトラップより効 率的な仕組みも提供される

    • AArch64の仮想化支援機構は、Type-1ハイパーバイザーを実現 するEL2を導入する。さらにType-2ハイパーバイザーを実現し やすくするVirtualization Host Extensionも • Apple Hypervisor FrameworkはARMに対応するが、APIはx86 のものとは別物