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

KVM vs HVF (AHF) vs HAXM

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Takaya Saeki 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を作る観点からその機能や使いやすさの比較をした発表です。

Avatar for Takaya Saeki

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命令 ✔ ✔ ✘ 詳しい人向け 機能比較一気見表