关于 virtio 的重要知识点总结

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 主动发送数据的队列 (virtqueue_add_inbuf);

desc chain 包含的 desc 的个数由具体 virtio 设备前端驱动下发的 sg 个数决定(out_sg, in_sg);

组成 desc chain 的 desc[i~j].flags 都设置了 VRING_DESC_F_NEXT 标记,表明 i~j

你可能感兴趣的:(.net,p2p,c#)