问题描述
我对 QEMU 源代码中存在的两个模拟设备 hw/net/virtio-net.c 和 hw/virtio/virtio-net-pci.c 感到有些困惑。 看起来 virio-net-pci.c 是基于 virtio 规范的 NIC 仿真,但我不知道 hw/net/virtio-net.c 用于什么?
除此之外,我看到了 hw/net/vhost_net.c 但不明白在什么情况下使用了它?
解决方法
从概念上讲,QEMU 实现中的 virtio 设备分为两部分:“传输”和“后端”。 “后端”是执行实际工作的部分(网络、块设备、随机数生成器等); “传输”是作为来宾接口的部分(PCI、MMIO、s390 CCW...)。这使我们能够以多种不同的方式提供 virtio 设备,而无需重复代码。
hw/net/virtio-net.c 实现了“net”后端。 hw/virtio/virtio-pci.c 实现了 PCI 传输。 hw/virtio/virtio-net-pci.c 实现了一个 PCI 设备,该设备为 virtio 网络后端设备提供 PCI 传输(这是一个相当小的文件,因为它只是将公共传输和公共后端代码粘合在一起)。
不出所料,hw/net/vhost_net.c 是 the RedHat blog post that KagurazakaKotori gave you a link to 中描述的 vhost-net 支持的实现。您可以将 virtio 网络设备传递给来宾,而无需使用 vhost-net -- 您可以使用任何 QEMU 网络后端。