Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
仮想マシンのしくみ
Search
akam1o
March 07, 2026
Technology
55
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
仮想マシンのしくみ
akam1o
March 07, 2026
More Decks by akam1o
See All by akam1o
200GbE 時代に再考するハイパーバイザネットワーク設計
akam1o
0
35
EPYC Turin で実現する 200Gbps サーバのハイパーバイザ基盤
akam1o
0
34
OpenvSwitch で作る透過 L3DSR
akam1o
1
49
virsh の使い方
akam1o
0
5
パフォーマンス分析のススメ
akam1o
0
5
プライベートクラウドのストレージライフサイクル問題に立ち向かう!〜ストレージ間マイグレーションの話〜
akam1o
0
40
コンピュートノードのネットワーク高速化
akam1o
0
43
Other Decks in Technology
See All in Technology
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
2
630
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
970
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
230
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.1k
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
150
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
1.7k
PLATEAU で バーチャル花火大会
tatsuya1970
0
110
바이브풀 라이프
arawn
0
100
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
160
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
690
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
New Earth Scene 8
popppiees
3
2.5k
Unsuck your backbone
ammeep
672
58k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Design in an AI World
tapps
1
270
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
Building an army of robots
kneath
306
46k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
WCS-LA-2024
lcolladotor
0
790
Marketing to machines
jonoalderson
1
5.7k
Transcript
仮想マシンのしくみ Akira Kamio
仮想マシンとは ・物理マシンじゃないけど 物理マシンっぽく振る舞う何か ・プライベートクラウドにおいては大抵 x86 の エミュレーションするやつのことを指している
仮想マシンとは ・Android 開発するときのこれも仮想マシン
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
CPU 仮想化
CPU アーキテクチャ ・世の中には様々な CPU アーキテクチャがある ・今回は x86 に絞って説明していく ・ぺけはちろく <-
私はこっち派 ・えっくすはちろく
CPU アーキテクチャ ・世の中には様々な CPU アーキテクチャがある ・今回は x86 に絞って説明していく ・ぺけはちろく <-
私はこっち派 ・えっくすはちろく 実は x86 は仮想化が難しいアーキテクチャ
仮想化の歴史 ・1974年に発表された論文の中で、 第3世代アーキテクチャ 仮想化のための 要件が語られている ・Formal Requirements for Virtualizable Third
Generation Architectures
仮想化の歴史 ・1974年に発表された論文の中で、 第3世代アーキテクチャ 仮想化のための 要件が語られている ・Formal Requirements for Virtualizable Third
Generation Architectures 特権レベル機構や仮想メモリ機構を備えたアーキテクチャ -> x86 の原型
仮想化の要件 (1/3) ・等価性 ・実マシンと同じ振る舞いを示さなくてはならない ・資源管理 ・仮想化された資源を完全に管理しなくてはならない ・効率性 ・大部分の命令を実 CPU で直接実行しなくてはならない
仮想化の要件 (2/3) ・命令を3種類に分類 ・特権命令 ・特権モードでないと実行できない ・ユーザモードであればトラップ ・制御センシティブ命令 ・システムの資源状態に変更を加える命令 ・動作センシティブ命令 ・システムの資源状態に動作や結果が依存
仮想化の要件 (3/3) 仮想マシンモニタ (VMM) の構成要件 ・コンピュータが仮想化可能であるためには、 すべてのセンシティブ命令が特権命令 である必要がある ・仮想マシンでセンシティブ命令が実行 ・トラップが発生
・特権モードで動く VMM に処理が移る ・適切に処理し復帰
センシティブ命令 ⊂ 特権命令 (1/2) 要件 命令セット 特権命令 センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF?
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF? 非特権センシティブ命令
センシティブ命令 ⊂ 特権命令 (2/2) x86 命令セット 特権命令 センシティブ命令 WTF? 非特権センシティブ命令
x86 の仮想化は難しい
非特権センシティブ命令の例 ・メモリアクセス ・I/O レジスタアクセス ・DMA コントローラアクセス ・IRQ 割り込み発生
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 開始
x86 の仮想化手法 (2/2) ・完全仮想化 ・非特権センシティブ命令 の動的な置換 ・非特権センシティブ命令 の静的な置換 ・ソフトウェア ・ハードウェア
完全仮想化 ・完全仮想化 (Full virtualization) ・代表例: QEMU ・1命令ずつソフトウェアでエミュレート ・遅い ・他のプラットフォームの模倣も可能 ・昔の
Android のエミュレータが 遅かったのもこのため
非特権センシティブ命令の置換 (1/3) x86 命令セット 特権命令 センシティブ命令 非特権センシティブ命令
非特権センシティブ命令の置換 (1/3) x86 命令セット 特権命令 センシティブ命令 非特権センシティブ命令 置き換えればいいのでは?
非特権センシティブ命令の置換 (2/3) ・非特権センシティブ命令の動的な置換 (バイナリ変換 /Binary Translation) ・代表例: VMware ・非特権センシティブ命令を実行前に 動的に書き換える
・通常命令は 直接 CPU で実行 ・ゲスト OS はハイパーバイザのレイヤを意識しない
非特権センシティブ命令の置換 (3/3) ・非特権センシティブ命令の静的な置換 (準仮想化/Para virtualization) ・代表例: Xen ・非特権センシティブ命令の代わりに ハイパーバイザコール と呼ばれる命令を呼ぶ
・ゲスト OS の kernel を仮想マシン向けに 書き換える必要がある ・仮想環境でより実機に近い性能が得られるように
VT-x ・一方 Intel は x86 を拡張した ・VMX non-Root Mode と呼ばれるハイパーバイザ向け
のプロテクションモデルを追加した ・仮想マシンが非特権センシティブ命令を実行すると VMX non-Root Mode から VMX Root Mode へ 切り替えて実行する ・ゲスト OS はハイパーバイザのレイヤを意識しない ・仮想環境でより実機に近い性能が得られる
VMExit と VMEnter ・VMX non-Root Mode (VM Mode) ・VMX Root
Mode (Root Mode) ・VMExit VM Mode から Root Mode に切り替わること ・VMEnter Root Mode から VM Mode に切り替わること
KVM ・CPU は仮想化支援機能 (VT-x 等) を使うことを前提として開発 ・メモリ管理 , ドライバ, スケジューラは
Linux カーネルの機能を利用
CPU 仮想化まとめ ・x86 の仮想化は 一部のセンシティブ命令が特権命令に なっていない ため、仮想化が難しかった ・x86 の仮想化手法は下記が挙げられる ・完全仮想化
・非特権センシティブ命令の動的な置換 (e.g. VMware) ・非特権センシティブ命令の静的な置換 ・ソフトウェア (e.g. Xen) ・ハードウェア (e.g. VT-x) ・現代では VT-x 等の仮想化支援機能を用いた仮想化が主流
メモリ仮想化
KVM ・CPU は仮想化支援機能 (VT-x 等) を使うことを前提として開発 ・メモリ管理 , ドライバ, スケジューラは
Linux カーネルの機能を利用
KVM のメモリ仮想化
Linux カーネルのメモリ管理 (1/3) ・カーネルにはメモリを管理する表がある ・これをページテーブル と呼ぶ ・物理メモリとプロセスのメモリのマッピングをしている ・Linux ではプロセス毎に独立したメモリ空間 を持つ
・別のプロセスからはアクセスできない ・Windows で「仮想メモリ」という言葉を聞いたことがある人がいると 思うが、Linux の仮想メモリとは違う ので注意 ・Linux ではスワップ領域がこれにあたる
Linux カーネルのメモリ管理 (2/3) ・Linux カーネルでは物理メモリ以上のメモリ割り当てをすることができる ・この仕組みを 仮想メモリ という ・仮想メモリでは実際に読み書きしたときに物理メモリをアロケートする ・仮想メモリを実現しているのが
ページテーブル ・仮想メモリアドレスと物理メモリアドレスの管理をしている ・住所録みたいなもの ・アクセスの少ない物理メモリはスワップ領域と呼ばれるディスクに用意された領域に書き出され、 ページテーブル上のエントリは削除される (ページアウト ) ・アクセスが起こった時ディスクから読み込んでページテーブルにエントリが追加される (ページイン )
Linux カーネルのメモリ管理 (3/3) プロセスA が 1 だと思っている領域は 物理メモリ 2 プロセスB
が 1 だと思っている領域は 物理メモリ 5 プロセスB が 2 だと思っている領域は 物理メモリ 6
仮想マシンのメモリ管理 ・仮想マシンで問題になるのは 仮想メモリアドレスを 物理メモリアドレスだと思っている こと ・仮想マシンの物理メモリはホストカーネルの仮想メモリ でしかない ・仮想メモリのアドレスでメモリにアクセスしようとする ・違うメモリにアクセスしにいってしまう ・彡(゚)(゚)「何か仲介するものが必要やな〜」
・ソフトウェア : シャドーページテーブル ・ハードウェア : EPT (Extended Page Table)
シャドーページング ホストカーネルで仮想マシンの ページテーブルを複製 (シャドーページテーブル ) ゲスト OS がメモリにアクセスするときには ハイパーバイザがメモリのアドレスを CPU
に 代わりに渡す ことで正しいアドレスを伝える ※ページテーブルを読み書きする度に 複製を同期する必要がある 同期をいっぱい取る必要があるので パフォーマンスは悪い
EPT (Extended Page Table) CPU がシャドーページテーブル相当の機能をオフロード する 仮想マシンからメモリアクセスすると、 EPT のテーブルを参照して正しいメモリにアクセス
される EPT になかったときは、ホストカーネルの仮想メモリから物理メモリが割り当てられ EPT にも乗る CPU にページテーブルの変換がオフロードされる ため、パフォーマンスは良い
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% 程度 性能向上すると言われている
KVM のメモリ仮想化まとめ ・KVM の仮想化ではメモリ管理・ドライバ・スケジューラは Linux カーネルの機能を利用 している ・メモリ仮想化で課題になるのはメモリマッピング ・仮想マシンは物理メモリだと思っている ->
実際にはホストカーネルの仮想メモリ ・ハイパーバイザの層で仮想マシンのメモリとホスト カーネルのメモリをマッピングするテーブルを持っている ・ソフトウェア : シャドーページテーブル ・ハードウェア : EPT (CPU の機能の拡張 )
• CPU 仮想化 • メモリ仮想化 • ディスク仮想化 • ネットワーク仮想化
ディスク仮想化
Linux のブロックデバイスへの I/O ・カーネルから I/O 要求 ・デバイスドライバに基づいて I/O が実行される device
driver device kernel
仮想マシンの 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実行の次の命令から実行再開
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 VM HV
仮想マシンの I/O (2) virtio driver device emulation kernel device driver
device 1. [VM] デバイスへの I/O が発行 2. [VM] I/O の実行を契機に VMExit 発生 3. [HV] アクセス先のデバイス情報を特定 VM HV
仮想マシンの 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
仮想マシンの 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
仮想マシンの 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
仮想化デバイスの種類 ・完全仮想化デバイス ・実ハードウェアを完全にエミュレートしているデバイス ・準仮想化デバイス ・完全にエミュレートは行っていないが 実ハードウェアのように振る舞うデバイス ・VMExit, VMEnter がなるべく発生しないように 実装されている
完全仮想化デバイスが遅い理由 ・完全仮想化デバイスはハードウェアレジスタへの アクセスなども完全にエミュレートする ・ハードウェアレジスタにアクセスするたびに VMExit -> VMEnter が発生 ・完全仮想化デバイスとして実装されている NIC
によっては パケットの受信処理で 5〜6回のレジスタアクセスを行う
virtio ・Linux kernel に実装されている準仮想化のフレームワーク ・様々なデバイス向けの実装がある ・virtio-blk ブロックデバイス ・virtio-scsi SCSI デバイス
・virtiofs File 共有 ・virtio-net NIC ・virtio-pci PCI デバイス
virtio ・Linux kernel に実装されている準仮想化のフレームワーク ・様々なデバイス向けの実装がある ・virtio-blk ブロックデバイス ・virtio-scsi SCSI デバイス
・virtiofs File 共有 ・virtio-net NIC ・virtio-pci PCI デバイス
virtio のしくみ virtio driver virtio PCI controller virtio PCI controller
virtio device vring Guest kernel 転送のためのしくみ ゲストとホストでメモリを共有 QEMU
仮想マシンの I/O (再掲) virtio driver device emulation kernel device driver
device VM HV
仮想マシンの I/O (再掲) virtio driver device emulation kernel device driver
device VM HV virtio PCI controller virtio device vring virtio driver virtio PCI controller
QEMU Guest virtio Overview virtio driver virtio PCI controller virtio
PCI controller virtio device vring Host kernel device driver device Other Process
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 の設定によっては無視できる)
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 の設定によっては無視できる)
VM のディスクイメージ QEMU で使われるディスクイメージ形式は主に下記の 2つ ・RAW ・シックプロビジョニング (Thick Provisioning) ・割り当てたサイズだけ物理領域を確保
・QCOW2 ・シンプロビジョニング (Thin Provisioning) ・最小限の物理領域を確保/動的に領域を増やす
シックプロビジョニング (RAW) backing file 10GB ・割り当て時に物理領域を確保する ・backing file は物理的にコピーする
シンプロビジョニング (QCOW2) ・最低限の物理領域を確保する ・backing file は元のファイルを参照するだけ ・backing file との差分のみを記録していく ・物理領域を広げながら
I/O を行うためオーバーヘッドがある backing file 10GB diff
ディスク仮想化まとめ ・virtio という準仮想化デバイスフレームワーク がある ・ virtio-blk, virtio-scsi がディスク仮想化のための実装 ・極力 VMExit,
VMEnter しない実装になっている ・ディスクの割り当てとして シックプロビジョニング と シンプロビジョニング がある
ネットワーク仮想化
NIC の完全仮想化デバイス (e1000) ・Intel e1000 ドライバ互換の完全仮想化デバイス ・完全仮想化デバイスで e1000 は最も使われている ・完全仮想化デバイスの中では最も速い
・その他の完全仮想化デバイスの例 ・ne2k_pci ・pcnet ・rtl8139
virtio-net ・NIC の virtio デバイス ・レジスタアクセスを極力減らしている QEMU Guest virtio driver
virtio PCI controller virtio PCI controller virtio NIC RX TX ctrl
完全仮想化デバイスが遅い理由 ・ハイパーバイザ側でのトラップが多い ・準仮想化デバイスの場合は 1回
DPDK + vhostuser ・DPDK という仕組みがある ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を
copy ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy
DPDK + vhostuser ・DPDK という仕組みがある ・カーネルをバイパスする ことで高速化を図っている ・ポーリングプロセスが vring を
copy ・低レイテンシ/ mode 切り替えがない qemu Linux NW stack NIC OvS kernel user DPDK pmd copy NIC でのハードウェアオフロードや kernel への高速化フレームワーク実装など 現在も活発に開発がされている
ネットワーク仮想化まとめ ・virtio-net という virtio を利用したデバイス がある ・極力 VMExit, VMEnter をしない実装になっている
・カーネルをバイパスするしくみでの高速化など 現在でも活発に開発が行われている
EOP
参考文献 (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
参考文献 (2) ・bobuhiro11's blog ・https://blog.bobuhiro11.net/ ・カーネギーメロン大学の講義資料 ・https://www.cs.cmu.edu/~412/lectures/Virtio_2015-10-14.pdf ・OSC2011 Tokyo/Fall 濃いバナ(virtio)
・https://www.slideshare.net/TakeshiHasegawa1/osc2011-tokyofall-virtio ・かーねるさんとか ・https://yasukata.hatenablog.com/