virtioデバイス = リングバッファを使って一定の役割を果たす物.NIC,ブロックデバイス,ファイルシステムなど. #kernelvm_study
2013-06-09 14:01:30virtioデバイスはPCIデバイスとして認識される.特定のベンダID(0x1AF4),特定範囲のプロダクトID(0x1000-0x1040).Subsystem Device IDでデバイス種別を判断する. #kernelvm_study
2013-06-09 14:02:56Subsystem Device ID一覧 http://t.co/WonO3WxOXU #kernelvm_study
2013-06-09 14:03:55PCIデバイスなので,PCIデバイスっぽく初期化する.特殊なこととして,機能のネゴシエーションをvirtio headerで行う.ホストが提供出来る機能と,ゲストが使いたい機能のすり合わせを行う. #kernelvm_study
2013-06-09 14:06:47virtioデバイスが使うリングバッファの情報もやり取りする.Qaddr/Qselect/Qsize #kernelvm_study
2013-06-09 14:09:53リングバッファはゲストが用意して,書き込みをする前に一つづつ初期化してホスト(ハイパーバイザ)に渡す. #kernelvm_study
2013-06-09 14:11:00Qaddrは4096アライメントの物理アドレスを格納する.spec 2.3 Virtqueue Configuration #kernelvm_study
2013-06-09 14:15:49Qaddrは4096アライメントの物理アドレスを4096で割った値を格納する.spec 2.3 Virtqueue Configuration #kernelvm_study #kernelvm_study
2013-06-09 14:16:46例えばNICの場合だとリングバッファを3つ使うので,virtio headerを3回やり取りする.DevFeat/DrvFeatは同じ値にして,Qaddr/Qselect/Qsizeをそれぞれで宣言する. #kernelvm_study
2013-06-09 14:24:14virtio headerにはvirtioデバイスであること,相手がそれを認識していること,の確認フィールドがある. #kernelvm_study
2013-06-09 14:26:54リングバッファの中身を大きく分類すると3つ.ディスクリプタテーブル,availableリング,usedリング. #kernelvm_study
2013-06-09 14:27:35デスクリプタ:データ開始位置アドレス,サイズ,フラグ(デスクリプタチェーンの有無,ゲスト→ホスト/ホスト→ゲスト,indirect),デスクリプタチェーン #kernelvm_study
2013-06-09 14:30:39議論中:available ringを4096バイトでアライメントしているのはなぜだろう? →なぞい #kernelvm_study
2013-06-09 14:38:41Specには無いけれど実装上やってること:リングバッファの空き領域の保持,avail/usedインデックスの保持など #kernelvm_study
2013-06-09 14:44:00例えば,ゲストにおいては,ホストが処理してused ringのインデックスに書き込んだ時,最後に取得した値と更新があるのを持って,ホストで処理したと判断する必要がある #kernelvm_study
2013-06-09 14:44:41送信処理ならゲストがリングバッファにデータを詰めてホストに渡してすぐに処理されるが,受信処理なら受信するまでホストが保持したままになる #kernelvm_study
2013-06-09 14:46:23available/usedリングのインデックスが更新されていれば,更新分のavailabe/usedリングのリングバッファに書いているポインタからデスクリプタテーブルを参照する.そうして更新分の実データがわかる,てことかな. #kernelvm_study
2013-06-09 14:54:25受信時はusedリングのインデックスが更新されているのと,長さフィールドがあるので,それで受信サイズがわかる. #kernelvm_study
2013-06-09 14:54:58送信時はゲストが送信データをリングバッファ書いてavailableリングを更新.送信完了をホストがusedリングを更新. #kernelvm_study
2013-06-09 14:58:57