149 words
1 minute
virtio-net
Virtio-net的简单发包流程
start_xmitxmit_skbvirtnet_add_outbuf- 以上是设备相关代码,以下的都是virtio通用代码
virtqueue_add_outbufvirtqueue_addvirtqueue_add_packedvirtqueue_add_split
virtqueue_add_splitvirtqueue_add_desc_splitsg地址转换后,填充desc ringvring_map_one_sg->virtqueue_add_desc_split
- 更新avail ring
在virtio-net中,desc中填充的地址,是哪里来的
在调用virtnet_add_outbuf前,会调用skb_to_sgvec函数,把skb指向的数据(虚拟地址)转成用一组scatterlist条目,每个条目都是struct page和页内偏移来描述对应的物理内存页。
在virtqueue_add_split中,通过vring_map_one_sg,调用dma_map_page函数,把每个sg条目映射为设备可用的DMA地址,将结果赋给addr变量。