本人目前就职于烽火集成,从事云计算产品架构设计相关工作,长期专注于内核、虚拟化、分布式、云计算等方向。
技术交流请联系:xiaoding@fiberhome.com
接上节,这次主要讲virtio-pci设备初始化,以及建立相应的通信通道。
一个virtio-pci设备有2个区域,一个是data区域,一个是config区域
使用 info mtree 可以看到这个结果。
data区域是pci-conf-data
config区域是virtio-pci
其中data区域主要记录了pci设备的 设备号,厂商等等信息。
而config区域就是用来前后协商,以及irq中断通知。
首先,检测到pci设备,会加载virtio-pci驱动,主要就是初始化相关寄存器,
这是一个pci设备。
然后向virtio-bus注册设备,开始实体化我们的virtio设备。
register_virtio_device主要是注册设备,并且对设备进行状态设置,
VIRTIO_CONFIG_S_ACKNOWLEDGE 表示是发现了设备,这里注册设备到virtio_bus,这里会触发vritio_bus的probe函数。
会调用的virtio设备的virtio_dev_probe初始化设备。然后调用具体的vritio设备驱动来初始化。
可以看到virtio_bus主要控制了设备的连接状态,对于真正需要virito前后端建立连接的工作还是
调用了具体的virtio_blk的probe函数继续进行。
VIRTIO_CONFIG_S_DRIVER 发现了设备
VIRTIO_CONFIG_S_DRIVER_OK 驱动初始化完成。
virtblk_probe 函数主要做了这些,读取配置,初始化ring环。
vq_init->virtio_find_single_vq,调用了virtio-pci驱动中的vp_find_vqs->vp_try_to_find_vqs。
这里,根据情况 初始化msix或者是irq中断。并注册了callback。
setup_vq用来初始化vring,并且通知后端msix中断。