通过to_vp_device将virtio_device转换成virtio-pci,我们在前端虚拟机内创建的virtio设备都是一个pci设备,因此可以利用PCI设备的配置空间来完成前后端消息通知,vp_dev->ioaddr就指向配置空间的寄存器集合的首地址。 iowrite写寄存器VIRTIO_PCI_QUEUE_SEL来通知QEMU端,当前初始化的是第index号vring_virtqueue;ioread则从...
StratoVirt 的 virtio crate 中的 lib.rs 中定义了为所有 virtio 设备定义的 VirtioDevice Trait。virtio-blk 设备实现了该 Trait。 当前StratoVirt 中 virtio-blk 设备支持一个队列:request_queue。该队列负责 block 设备的初始化以及 IO 命令传输。StratoVirt 为该队列配置了对应的 event_fd 和 handler 函数。 定...
1、virtio418是一个virtio_blk设备,在probe过程中调用 __setup_irq 返回了-16。 2、[25338.496174] genirq: Flags mismatch irq 0. 00000080 (virtio418) vs. 00015a00 (timer),说明我们的virtio_blk 设备去申请了0号中断,由于0号中断被timer占用,irq子系统在比较flags时发现不符合,则打印这行。 具体代码为:...
打开dts文件可以看到,virtio_mmio默认已经配置好了。 其中a000000表示的是virtio mmio region的GPA地址。虚拟机会根据设备驱动树的配置在启动的时候写0xa000000-0xa000200区域里的寄存器来探测virtio设备。interrupts里的0x10表示的是0xa000000对应的virtio设备的中断号是0x30(SPI中断的基础偏移(0x20)+0x10)。实现virti...
Virtio设备可以通过发送中断通知虚拟机,每个virtio设备有一个对应的中断号(这个中断号在设备树中声明),虚拟机在收到中断后,会根据中断号找到对应的driver,driver则需要通过InterruptStatus寄存器搞清楚产生这次中断的事件是什么,比如bit 0表示已用描述符更新,bit 1表示设备配置空间更新。
virtio-blk 是虚拟化 KVM 平台下虚拟磁盘的一种实现方式,本质上为一种半模拟技术。virtio-blk 设备中采用 io_event_fd 进行前端到后端通知,采用中断注入方式实现后端到前端的通知,并通过 IO 环(vring) 进行数据的共享。 基本原理 IO 总体流程可以分为以下几个步骤,如下图所示: ...
Virtio设备可以通过发送中断通知虚拟机,每个virtio设备有一个对应的中断号(这个中断号在设备树中声明),虚拟机在收到中断后,会根据中断号找到对应的driver,driver则需要通过InterruptStatus寄存器搞清楚产生这次中断的事件是什么,比如bit 0表示已用描述符更新,bit 1表示设备配置空间更新。