QEMU 中关于 virtio-net-pci 和 virtio-net 的混淆

Confusion about virtio-net-pci and virtio-net in QEMU

我对 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 网络后端。