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
歡迎關注我的公衆號,不按期更新技術文章。