在vhost-kernel方案中,QEMU使用ioctl系统调用和内核的vhost-scsi模块建立联系,从而把QEMU中模拟的SCSI设备部分传递到了内核态,即内核态对该SCSI设备不是完全模拟的,仅仅负责对virtqueue进行处理,因此这个ioctl的消息主要负责3部分的内容传递:Guest内存映射;Guest Kick Event、vhost-kernel驱动用来接收Guest的消息,当接收到该...
前端 guest 驱动在 linux kernel 里面,即drivers/scsi/virtio_scsi.c。 SCSI Host Device virtio-scsi 定义了一个 SCSI host device。virtio SCSI host device 把一个或者多个 lun 聚合在一起,允许通过 SCSI transport protocol 来通信。 一个设备实例代表一个SCSI host,上面有多个 target 和 lun attach 在上面。
DPDK vhost接口 DPDK本身提供的是一套vhost库接口,由上层应用通过调用对应的接口实现特定的vhost驱动,目前已有的实现包括DPDK自带的vhost-net驱动、SPDK基于DPDK vhost接口实现的vhost-blk和vhost-scsi驱动等。DPDK vhost提供的几个关键接口如下: rte_vhost_driver_register:注册vhost驱动; rte_vhost_driver_set_features:...
Vhost是client与kernel(server)的交互,client与内核共享内存,局限性是如果client要发送消息到用户进程,很不方便; Vhost-user使用unix domain来进行通信,两个用户进程共享内存,达到和vhost一样的效果。 Virtio-blk与virtio-scsi 他们都是在 virtio spec 里面定义的两种块设备实现。区别是 virtio-blk 是作为 pci 设备挂...
内核提供一个通用的 virtio-pci 驱动程序,供实际的 Virtio 传输设备(例如 virtio-net 或 virtio-scsi)使用。 2)virtqueues 规范 virtqueue 是在 virtio 设备上进行批量数据传输的实现机制。每个设备可以有零个或多个 virtqueue。它由 Guest 分配的缓冲区队列组成,Host 通过读取或写入缓冲区与之交互。此外,virtio 规...
vhost-net驱动程序模拟主机内核中的virtio-net网卡。 Vhost-net是最早的vhost设备,也是主流Linux中唯一可用的设备。 也已经开发了实验vhost-blk和vhost-scsi装置。 在Linux 3.0中,vhost代码存放在drivers / vhost /中。 所有设备使用的通用代码在drivers / vhost / vhost.c中。 这包括virtio vring访问功能,所有virtio...
vhost-net驱动在内核态模拟了网卡相关的IO,它是最早以vhost形式实现的并且是唯一的被linux主线接纳的驱动。同时,vhost-blk和vhost-scsi项目也在开发中。 Linux内核v3.0的vhost代码在drivers/vhost/中。 被所有virtIO设备使用的通用代码位于drivers/vhost/vhost.c中,其中包含了所有设备都会用来与vm交互的vring处理函数。
vhost-vdpa back-end设备的实现流程大体与vhost-net/vhost-blk/vhost-scsi一致。其主要差别在于:其一,支持vdpa的设备驱动通过rte_vdpa_register_device函数注册了rte_device和支持的功能接口到vdpa_device_list链表中,如此应用程序可以通过rte_vhost_driver_attach_vdpa_device将其赋给vhost_user_socket并最终与标识vhost...
而 virtio-scsi 作为 scsi 子系统,挂在 scsi 总线上,数量上可以多得多。由于 virtio-scsi 实现了 scsi 的协议 ,所以复杂度来说要高一些。 此时,在 qemu 里面看,这块盘跟普通的 scsi 盘一样,支持 scsi 命令查询,例如 sg3_utils 提供的工具。但是 virtio-blk 盘不支持 scsi 命令。
virtio-scsi 实现了 scsi 的协议,支持scsi命令,复杂度更高一些 virtio-blk的io路径更短,所以性能上略好于virtio-scsi,两者io路径对比: 【virtio-blk】 guest: app -> Block Layer -> virtio-blk host: QEMU -> Block Layer -> Block Device Driver -> Hardware ...