https://blogs.oracle.com/linux/post/introduction-to-virtio
SNS界隈で見つけて、面白そうなので読んでみることにした。
ポイント
- 仮想マシンとホストデバイスの抽象化を行うレイヤのこと
- ホストマシンと仮想マシンでのデバイスの取り扱いには、2つの考え方がある?
- エミュレーション
- ソフトウェアによりハードウェアの動作を模倣する
- ハードウェアが存在していなくても動かすことができる
- パファーマンスに影響が出る。時間がかかる
- 仮想化
- ハードウェアを分割して、ゲストVMが使用できるようにする
- 共有できるようにする、というイメージ
- ゲストにとっては、任意のデバイスを使えるようにするわけではなく、仮想化デバイスを使えや、というように認識される、というイメージ
- パフォーマンスに影響が出にくい。高速。
- VirtIOのドライバはフロントエンドとバックエンドで構成されている
- フロントエンド:ゲスト側
- バックエンド:ホスト側
- ハイパーバイザにより動作する、というイメージ
- フロントエンドからの要求を受け入れる。
- 物理ハードウェアで動かす。
- レスポンスをフロントエンドに返す。
- 図の例だと、
VirtQueue
とVRings
という機能でフロントエンドとバックエンドが接続されている。
- これはQEMUの例だと思う。Linuxだと
virtqueue
と書いてある。
- VirtQueueはゲストとホストで共有メモリとなっている。こういうデータ構造。
- VirtQueueはゲストOSに固有の情報が組まれている?
- VRingsは転送される実際のデータ構造を含んでいるらしい。
- 少なくともLinuxの持っているVirtQueueと若干機能が異なる。
- Descriptor Ring (Descriptor Area)
- ゲスト → ホストの領域?
- 物理アドレス・データバッファの長さ・フラグ
- ドライバのみがリングに追加可能
- デバイスはDescriptor Ringに書き込み可能
- Available Ring (Driver Area)
- Descriptor Ringの使用可能な領域の循環配列
- Used Ring (Device Area)
- VRingについて
- 間接Descriptors, Used Buffer Notification Supression, Packed VirtQueueなど
- どのデータがゲストとホストで交換されたかを示している。