Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基说明:linux
https://www.cnblogs.com/LoyenWang/
看一下Guest OS(Linux)中的Virtio框架高层架构图:数据结构
说到驱动怎么能不提linux设备驱动模型呢,感兴趣的朋友能够去看看PCI系列分析文章,简单来讲就是内核建立总线用于挂载设备,总线负责设备与驱动的匹配。Linux内核建立了一个virtio bus:架构
virtio_device_id
来匹配,而这个都是在virtio规范中定义好的;virtio_device
结构中有一个struct virtio_config_ops
,函数集由驱动来进行指定,用于操做具体的设备;本文描述的virtio-net驱动,既是一个virtio设备,也是一个pci设备,在内核中经过结构体struct virtio_pci_device
来组织:框架
Common, ISR, Device, Notify
,用于获取virtio设备的各类信息,这个也是由virtio规范决定的;以总线的匹配视角来看就是这样子的:函数
先看一下virtio总线的建立,virtio bus固然也算是基建了:工具
bus_register
注册virtio总线,总线负责匹配,在匹配成功后调用通用的virtio_dev_probe
函数;详细的细节,建议阅读以前PCI驱动系列的分析文章,下边罗列关键部分:spa
0x1AF4
,所以最终调用的驱动入口为virtio_pci_probe
;struct virtio_pci_device
结构,前文中也提到过它负责将virtio设备和pci设备绑定到一块儿,最终会在两个设备驱动的probe函数中完成总体结构的初始化,也就是virtio_pci_probe
完成一部分,实际的virtio设备驱动中完成一部分;virtio_pci_modern_probe
:该函数的内容就与virtio规范紧密相关了,简单来讲,virtio设备都会按照规范填充common、device、isr、notification等功能部分,而virtio_pci_modern_probe
函数经过virtio_pci_find_capability
去获取对应的能力,而且经过map_capability
完成IO空间的映射;virtio_pci_probe
中还设置了virtio_pci_config_ops
操做函数集,并传递给virtio驱动,在驱动中调用这些回调函数来操做virtio设备;register_virtio_device
:向系统注册virtio设备,从而也就触发了virtio总线的匹配操做,最终调用virtio_dev_probe
函数;virtio_dev_probe
函数中按照virtio规范分阶段设置不一样的状态、获取virtio设备的feature等,并最终调用实际设备的驱动程序了;At last,终于摸到本文要说的virtio-net的驱动的入口了,固然,文章也要戛然而止了。code
总体执行流程及框架应该清楚了,细节就留给你们了,待续。。。blog
https://developer.ibm.com/technologies/linux/articles/l-virtio/
Virtual I/O Device (VIRTIO) Version 1.1
ci
欢迎关注我的公众号,不按期更新技术文章。