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

KVM vs HVF (AHF) vs HAXM

Takaya Saeki
November 18, 2017

KVM vs HVF (AHF) vs HAXM

2017/11/18(土) カーネル/VM探検隊@関西 8回目 (https://connpass.com/event/68374/) の @nullpo_head (https://twitter.com/nullpo_head) の発表資料です。

kvmとapple hypervisor framework(HFV/AHF)とintel haxmのAPIについて、それぞれを使ってVMMを作った経験から、VMMを作る観点からその機能や使いやすさの比較をした発表です。

Takaya Saeki

November 18, 2017
Tweet

More Decks by Takaya Saeki

Other Decks in Technology

Transcript

  1. るくす氏 未踏にて • まず当初の予定通りQemu ベースのソフトウェアを 書いて • そのあと何故か未踏の時 間が余っておりType-1の VMも書いた

    2人目めちゃ くちゃVM書 いてる! つまり統計的に 参加者全員VM書 いてるやんけ! (カーネルVMすごい
  2. KVM • 📒 言わずと知れたLinux用 の元祖VMMカーネルモ ジュール • 💻 Linux /

    FreeBSD • 💡 X86だけではなく、 ARM/PPC/IA-36/s390などで も動く • 説明が雑でごめんなさい、 みんな知ってるよね
  3. Apple Hypervisor Framework • 📒 Apple謹製、OS組み込み のあまり知名度のないVMM • 💻 macOS

    • 💡3VMMの中でも特に Intel VMXの薄いラッパーラ イブラリ的実装 • 💡 仮想NICを作るフレーム ワークまでmacOS組み込み で載っていて案外クール • 💡 macOS版bhyveとしてよ く言及されるxhyveはAHFを 使っている
  4. Intel HAXM (Hardware Accelerated Execution Manager) • 📒 Intelが実はVMMを作っ てる

    • 💻 Win/macOS • 💡 X86 Androidエミュレー タの高速化モジュールとし て配布されているが、実態 は汎用のVMM • 💡 QemuがmainlineでKVM 同様に対応している HAXM
  5. 比較? • インターフェースの使いやすさと機能の面から 比較して、優劣と得意不得意をまとめます • パフォーマンスの比較はしません • そもそもマシンが違うしそろえて測るのは本質的に 難しい •

    今日はsatさんがWSLについてそれをやる予定だった そうなので楽しみだったが残念 • どこかで公開してくれるでしょう • Satさんは残念ながら今回もSEGVしてしまった • がちゃぴん先生のmalloc動画みたいな感じでsatさんが SEGVする動画が見たいんですがないんでしょうか
  6. だいたい共通するVMMの使い方 (AHFを例に) 1. hv_vm_create まずVMを作る 2. hv_vm_map 次にメモリ空間 を作る。CR3とか 3.

    hv_vcpu_create 仮想CPUを作る 4. hv_vcpu_runと VMEXITのループ ここがエミュ レーション本体
  7. そもそもの最近のVMの仕組み 仮想化されたCPU デバイスIO等 VMEXIT Ioctl, デバイスIO要求通知 ゲストプロセス Ioctl, VCPUラン 要求

    VMENTRY システムコール など デバイス シミュレーション RUN! VMMの力を借りると、 VMMがCPUの力を借りて仮想化部分が 労力なく走る
  8. だいたい共通するVMMの使い方 (AHFを例に) 1. hv_vm_create まずVMを作る 2. hv_vm_map 次にメモリ空間 を作る。CR3とか 3.

    hv_vcpu_create 仮想CPUを作る 4. hv_vcpu_runと VMEXITのループ ここがエミュ レーション本体
  9. だいたい共通するVMMの使い方 (Libhypervisorを例に) 1.while (1) { 2. vmm_cpu_run(vm, cpu); 3. vmm_cpu_get_state(vm,

    cpu, VMM_CTRL_EXIT_REASON, &exit_reason); 4. switch (exit_reason) { 5. case VMM_EXIT_FAIL_ENTRY: 6. /* めっちゃエラーメッセージとか出す */ 7. return 0; 8. case VMM_EXIT_HLT: 9. /* 死んだ */ 10. return 0; 11. case VMM_EXIT_IO: 12. ret = vmm_cpu_get_register(vm, cpu, VMM_X64_RAX, &value); 13. /* ここでデバイスエミュレーション */ 14. break; 15. ... 16. } 17.} RunとExitのループ 複雑なCPUのエミュレーション無しに(※) 仮想マシンエミュレータを作れる!
  10. 分かる人向けTL;DR KVM AHF HAXM 複数VM操作 ✔ ✘ ✔ EPTの活用 ✘

    ✔ △(unmapだけ できない) ホストによる ページング ✔ ✔ ✔ Exception Bitmap操作 ✘ ✔ ✘ 例外のハンド ルのしやすさ △ ✔ ✘ VMCALL命令 ✘ ✔ ✘ VMFUNC命令 ✔ ✔ ✘
  11. KVM AHF HAXM 複数VM操作 ✔ ✘ ✔ EPTの活用 ✘ ✔

    △(unmapだけ できない) ホストによる ページング ✔ ✔ ✔ Exception Bitmap操作 ✘ ✔ ✘ 例外のハンド ルのしやすさ △ ✔ ✘ VMCALL命令 ✘ ✔ ✘ VMFUNC命令 ✔ ✔ ✘ 詳しい人向け 機能比較一気見表
  12. KVM AHF HAXM 複数VM操作 ✔ ✘ ✔ EPTの活用 ✘ ✔

    △(unmapだけ できない) ホストによる ページング ✔ ✔ ✔ Exception Bitmap操作 ✘ ✔ ✘ 例外のハンド ルのしやすさ △ ✔ ✘ VMCALL命令 ✘ ✔ ✘ VMFUNC命令 ✔ ✔ ✘ 詳しい人向け 機能比較一気見表
  13. KVM AHF HAXM 複数VM操作 ✔ ✘ ✔ EPTの活用 ✘ ✔

    △(unmapだけ できない) ホストによる ページング ✔ ✔ ✔ Exception Bitmap操作 ✘ ✔ ✘ 例外のハンド ルのしやすさ △ ✔ ✘ VMCALL命令 ✘ ✔ ✘ VMFUNC命令 ✔ ✔ ✘ 詳しい人向け 機能比較一気見表