virtio 相关介绍文章很多,这里总结一些自认为一些关键的技术点,
1,virtio ring(vring)队列由 guest 准备(申请内存),vring(split)包含三部分:desc[], avail, used,这三部分被放置在申请的同一块内存区域。初始化时,需要将desc[0 ~ vring.num-1]组织成一个list,
/* Put everything in free lists. */
vq->free_head = 0;
for (i = 0; i < vring.num-1; i++)
vq->split.vring.desc[i].next = cpu_to_virtio16(vdev, i + 1);
vring.avail 所指向的 desc 也由 guest 准备,guest 给队列准备 desc(实际上是准备desc[i~j].addr, .len) chain分两种:
1),发送时准备,如 virtio-blk 所用队列以及 virtio-net 中 guest 主动发送数据用到的队列;
2),事先准备好,如 virtio-net 中 host 主动发送数据的队列 (virtqu