vring avail の謎が解けた気がする - virtio

まず礎として desc table がある。これは addr, len, next の配列で、やりとりするデータのアドレス、大きさを指定するもの。
next は複数のページをやりとりしたいときに linked list のように次の desc を指定するために使われる。
図では先頭から数珠つなぎになっているが、使い方は自由。


avail-ring は desc table と同じ要素数を持つ index の配列。index は desc table への index 。図では desc table と avail-ring は同じ順序で並んでいるが必ずしも同じ並びでなくても良い。(例えば avail-ring[0] が desc-table[5] を指すことも可能)
avai-index は avail-ring への index である。 avail-index を適切に設定することで host 側にデータ読み書きすべきアドレスと長さを指示する。
例えば avail-index = 3 と設定した場合は
desc-table[avail-ring[3 - 1]] から始まる数珠つなぎの領域がやりとりに使われる。