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

仮想マシンのしくみ

Avatar for akam1o akam1o
March 07, 2026

 仮想マシンのしくみ

Avatar for akam1o

akam1o

March 07, 2026

More Decks by akam1o

Other Decks in Technology

Transcript

  1. x86 の仮想化手法 (1/2) ・困難と言われながらもなんだかんだ仮想化される  ・1998年 VMware社が PC 向けの x86 エミュレータ発表

     ・2001年 VMware社がサーバ向けの x86 エミュレータ発表  ・2003年 Xen 1.0 公開  ・2005年 OpenVZ リリース  ・2005年 VT-x 対応 Pentium 4 発売  ・2006年 KVM プロジェクト開始  ・2006年 Hyper-V 開始
  2. VT-x ・一方 Intel は x86 を拡張した  ・VMX non-Root Mode と呼ばれるハイパーバイザ向け

      のプロテクションモデルを追加した  ・仮想マシンが非特権センシティブ命令を実行すると   VMX non-Root Mode から VMX Root Mode へ   切り替えて実行する   ・ゲスト OS はハイパーバイザのレイヤを意識しない   ・仮想環境でより実機に近い性能が得られる
  3. VMExit と VMEnter ・VMX non-Root Mode (VM Mode) ・VMX Root

    Mode (Root Mode) ・VMExit  VM Mode から Root Mode に切り替わること ・VMEnter  Root Mode から VM Mode に切り替わること
  4. CPU 仮想化まとめ ・x86 の仮想化は 一部のセンシティブ命令が特権命令に  なっていない ため、仮想化が難しかった ・x86 の仮想化手法は下記が挙げられる  ・完全仮想化

     ・非特権センシティブ命令の動的な置換 (e.g. VMware)  ・非特権センシティブ命令の静的な置換   ・ソフトウェア (e.g. Xen)   ・ハードウェア (e.g. VT-x) ・現代では VT-x 等の仮想化支援機能を用いた仮想化が主流
  5. Linux カーネルのメモリ管理 (1/3) ・カーネルにはメモリを管理する表がある  ・これをページテーブル と呼ぶ   ・物理メモリとプロセスのメモリのマッピングをしている   ・Linux ではプロセス毎に独立したメモリ空間 を持つ

       ・別のプロセスからはアクセスできない ・Windows で「仮想メモリ」という言葉を聞いたことがある人がいると 思うが、Linux の仮想メモリとは違う ので注意  ・Linux ではスワップ領域がこれにあたる
  6. Linux カーネルのメモリ管理 (2/3) ・Linux カーネルでは物理メモリ以上のメモリ割り当てをすることができる ・この仕組みを 仮想メモリ という  ・仮想メモリでは実際に読み書きしたときに物理メモリをアロケートする ・仮想メモリを実現しているのが

    ページテーブル  ・仮想メモリアドレスと物理メモリアドレスの管理をしている  ・住所録みたいなもの ・アクセスの少ない物理メモリはスワップ領域と呼ばれるディスクに用意された領域に書き出され、  ページテーブル上のエントリは削除される (ページアウト ) ・アクセスが起こった時ディスクから読み込んでページテーブルにエントリが追加される (ページイン )
  7. Linux カーネルのメモリ管理 (3/3) プロセスA が 1 だと思っている領域は 物理メモリ 2 プロセスB

    が 1 だと思っている領域は 物理メモリ 5 プロセスB が 2 だと思っている領域は 物理メモリ 6
  8. シャドーページング ホストカーネルで仮想マシンの ページテーブルを複製 (シャドーページテーブル ) ゲスト OS がメモリにアクセスするときには ハイパーバイザがメモリのアドレスを CPU

    に 代わりに渡す ことで正しいアドレスを伝える ※ページテーブルを読み書きする度に  複製を同期する必要がある 同期をいっぱい取る必要があるので パフォーマンスは悪い
  9. EPT (Extended Page Table) CPU がシャドーページテーブル相当の機能をオフロード する 仮想マシンからメモリアクセスすると、 EPT のテーブルを参照して正しいメモリにアクセス

    される EPT になかったときは、ホストカーネルの仮想メモリから物理メモリが割り当てられ EPT にも乗る CPU にページテーブルの変換がオフロードされる ため、パフォーマンスは良い
  10. CERN では EPT disable? EPT を切ったほうがパフォーマンスが出た という記事を CERN が 2015/08

    に公開した http://openstack-in-production.blogspot.com/2015/08/ept-and-ksm-for-high-throughput.html 当時再現試験を行ったが、同じような結果を 得ることはできなかった なおその後、TLB miss した際に EPT を利用 しているほうがペナルティが大きいという 記事を出している これは HugePage を使用することで緩和できる http://openstack-in-production.blogspot.com/2015/09/ept-huge-pages-and-benchmarking.html 一般に EPT を使ったほうが 30% 程度 性能向上すると言われている
  11. KVM のメモリ仮想化まとめ ・KVM の仮想化ではメモリ管理・ドライバ・スケジューラは  Linux カーネルの機能を利用 している ・メモリ仮想化で課題になるのはメモリマッピング  ・仮想マシンは物理メモリだと思っている   ->

    実際にはホストカーネルの仮想メモリ  ・ハイパーバイザの層で仮想マシンのメモリとホスト   カーネルのメモリをマッピングするテーブルを持っている   ・ソフトウェア : シャドーページテーブル   ・ハードウェア : EPT (CPU の機能の拡張 )
  12. 仮想マシンの I/O (1) 1. [VM] デバイスへの I/O が実行される 2. [VM]

    I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う 5. [HV] VMEnter して VM を再開させる 6. [VM] I/O実行の次の命令から実行再開
  13. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 VM HV
  14. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 VM HV
  15. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 VM HV
  16. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) VM HV
  17. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 5. [HV] VMEnter して VM を再開させる 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) VM HV
  18. 仮想マシンの I/O (2) virtio driver device emulation kernel device driver

    device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 5. [HV] VMEnter して VM を再開させる 3. [HV] アクセス先のデバイス情報を特定 4. [HV] デバイス I/O のエミュレーション処理を行う(代わりに I/O) 6. [VM] I/O実行の次の命令から実行再開 VM HV
  19. virtio のしくみ virtio driver virtio PCI controller virtio PCI controller

    virtio device vring Guest kernel 転送のためのしくみ ゲストとホストでメモリを共有 QEMU
  20. 仮想マシンの I/O (再掲) virtio driver device emulation kernel device driver

    device VM HV virtio PCI controller virtio device vring virtio driver virtio PCI controller
  21. QEMU Guest virtio Overview virtio driver virtio PCI controller virtio

    PCI controller virtio device vring Host kernel device driver device Other Process
  22. virtio-blk ・vring (virtqueue, virtio-buffer) をホストと共有 ・VM のディスクの実体は仮想ホストのディスクイメージ ・I/O 実行 ->

    virtio-blk -> host I/O 命令 -> I/O 完了  ・VMExit せずに IO を完了できる   ・VM は処理を続行できる  ・VMExit する場合もある   ・sync や Direct I/O をするとき    (QEMU の設定によっては無視できる)
  23. virtio-blk ・vring (virtqueue, virtio-buffer) をホストと共有 ・VM のディスクの実体は仮想ホストのディスクイメージ ・I/O 実行 ->

    virtio-blk -> host I/O 命令 -> I/O 完了  ・VMExit せずに IO を完了できる   ・VM は処理を続行できる  ・VMExit する場合もある   ・sync や Direct I/O をするとき    (QEMU の設定によっては無視できる)
  24. ディスク仮想化まとめ ・virtio という準仮想化デバイスフレームワーク がある  ・ virtio-blk, virtio-scsi がディスク仮想化のための実装  ・極力 VMExit,

    VMEnter しない実装になっている ・ディスクの割り当てとして シックプロビジョニング と  シンプロビジョニング がある
  25. DPDK + vhostuser ・DPDK という仕組みがある  ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を

    copy  ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy
  26. DPDK + vhostuser ・DPDK という仕組みがある  ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を

    copy  ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy NIC でのハードウェアオフロードや kernel への高速化フレームワーク実装など 現在も活発に開発がされている
  27. ネットワーク仮想化まとめ ・virtio-net という virtio を利用したデバイス がある  ・極力 VMExit, VMEnter をしない実装になっている

    ・カーネルをバイパスするしくみでの高速化など  現在でも活発に開発が行われている
  28. EOP

  29. 参考文献 (1) ・ハイパーバイザの作り方  ・https://syuu1228.github.io/howto_implement_hypervisor/ ・CERN TechBlog  ・https://techblog.web.cern.ch/techblog/ ・Virtio: An I/O

    virtualization framework for Linux - IBM Developer  ・https://developer.ibm.com/articles/l-virtio/ ・Virtual I/O Device (VIRTIO) Version 1.1  ・https://docs.oasis-open.org/virtio/virtio/v1.1/virtio-v1.1.html