virtio勉強会

4
Ogata Yasuhiko @yogata

virtioデバイス = リングバッファを使って一定の役割を果たす物.NIC,ブロックデバイス,ファイルシステムなど. #kernelvm_study

2013-06-09 14:01:30
Ogata Yasuhiko @yogata

virtioデバイスはPCIデバイスとして認識される.特定のベンダID(0x1AF4),特定範囲のプロダクトID(0x1000-0x1040).Subsystem Device IDでデバイス種別を判断する. #kernelvm_study

2013-06-09 14:02:56
Ogata Yasuhiko @yogata

PCIデバイスなので,PCIデバイスっぽく初期化する.特殊なこととして,機能のネゴシエーションをvirtio headerで行う.ホストが提供出来る機能と,ゲストが使いたい機能のすり合わせを行う. #kernelvm_study

2013-06-09 14:06:47
Ogata Yasuhiko @yogata

virtioデバイスが使うリングバッファの情報もやり取りする.Qaddr/Qselect/Qsize #kernelvm_study

2013-06-09 14:09:53
Hiraku Toyooka @hiraku_wfs

あ、virtio-traceはvirtio_consoleを使うのか...

2013-06-09 14:10:47
Ogata Yasuhiko @yogata

リングバッファはゲストが用意して,書き込みをする前に一つづつ初期化してホスト(ハイパーバイザ)に渡す. #kernelvm_study

2013-06-09 14:11:00
Ogata Yasuhiko @yogata

Qaddrは4096アライメントの物理アドレスを格納する.spec 2.3 Virtqueue Configuration #kernelvm_study

2013-06-09 14:15:49
Ogata Yasuhiko @yogata

Qaddrは4096アライメントの物理アドレスを4096で割った値を格納する.spec 2.3 Virtqueue Configuration #kernelvm_study #kernelvm_study

2013-06-09 14:16:46
干し草と靄 @ioriveur

あれ、queueのそれぞれの意味を指定するんじゃないのね

2013-06-09 14:23:28
Ogata Yasuhiko @yogata

例えばNICの場合だとリングバッファを3つ使うので,virtio headerを3回やり取りする.DevFeat/DrvFeatは同じ値にして,Qaddr/Qselect/Qsizeをそれぞれで宣言する. #kernelvm_study

2013-06-09 14:24:14
Ogata Yasuhiko @yogata

virtio headerにはvirtioデバイスであること,相手がそれを認識していること,の確認フィールドがある. #kernelvm_study

2013-06-09 14:26:54
Ogata Yasuhiko @yogata

リングバッファの中身を大きく分類すると3つ.ディスクリプタテーブル,availableリング,usedリング. #kernelvm_study

2013-06-09 14:27:35
Ogata Yasuhiko @yogata

デスクリプタ:データ開始位置アドレス,サイズ,フラグ(デスクリプタチェーンの有無,ゲスト→ホスト/ホスト→ゲスト,indirect),デスクリプタチェーン #kernelvm_study

2013-06-09 14:30:39
Ogata Yasuhiko @yogata

デスクリプタの配列が,デスクリプタテーブル #kernelvm_study

2013-06-09 14:30:53
Ogata Yasuhiko @yogata

デスクリプタの数(=デスクリプタテーブルの配列数)の最大がQsize #kernelvm_study

2013-06-09 14:31:59
Ogata Yasuhiko @yogata

議論中:available ringを4096バイトでアライメントしているのはなぜだろう? →なぞい #kernelvm_study

2013-06-09 14:38:41
Ogata Yasuhiko @yogata

Specには無いけれど実装上やってること:リングバッファの空き領域の保持,avail/usedインデックスの保持など #kernelvm_study

2013-06-09 14:44:00
Ogata Yasuhiko @yogata

例えば,ゲストにおいては,ホストが処理してused ringのインデックスに書き込んだ時,最後に取得した値と更新があるのを持って,ホストで処理したと判断する必要がある #kernelvm_study

2013-06-09 14:44:41
Ogata Yasuhiko @yogata

送信処理ならゲストがリングバッファにデータを詰めてホストに渡してすぐに処理されるが,受信処理なら受信するまでホストが保持したままになる #kernelvm_study

2013-06-09 14:46:23
Ogata Yasuhiko @yogata

available/usedリングのインデックスが更新されていれば,更新分のavailabe/usedリングのリングバッファに書いているポインタからデスクリプタテーブルを参照する.そうして更新分の実データがわかる,てことかな. #kernelvm_study

2013-06-09 14:54:25
Ogata Yasuhiko @yogata

受信時はusedリングのインデックスが更新されているのと,長さフィールドがあるので,それで受信サイズがわかる. #kernelvm_study

2013-06-09 14:54:58
Ogata Yasuhiko @yogata

availableリングはゲストが書く.usedリングはホストが書く. #kernelvm_study

2013-06-09 14:58:52
Ogata Yasuhiko @yogata

送信時はゲストが送信データをリングバッファ書いてavailableリングを更新.送信完了をホストがusedリングを更新. #kernelvm_study

2013-06-09 14:58:57