背景
Read the fucking source code!--By 魯迅A picture is worth a thousand words.--By 高爾基
說明:
- KVM版本:5.9.1
- QEMU版本:5.0.0
- 工具:Source Insight 3.5, Visio
- 文章同步在博客園:
https://www.cnblogs.com/LoyenWang/
1. 概述

- 前篇文章講完了Qemu中如何來創建Virtio Device,本文將圍繞Guest OS中的Virtio Driver來展開;
看一下Guest OS(Linux)中的Virtio框架高層架構圖:

- 核心模塊為virtio和virtqueue,其他高層的驅動都是基于核心模塊之上構建的;
- 顯然,本文會延續這個系列,繼續分析virtio-net驅動,重心在整體流程和框架上,細節不表;
- virtio-net,又是一個virtio設備,又是一個PCI設備,那么驅動會怎么組織呢?帶著問題上路吧,
2. 資料結構
說到驅動怎么能不提linux設備驅動模型呢,感興趣的朋友可以去看看PCI系列分析文章,簡單來說就是內核創建總線用于掛載設備,總線負責設備與驅動的匹配,Linux內核創建了一個virtio bus:

- virtio設備和virtio驅動,通過
virtio_device_id來匹配,而這個都是在virtio規范中定義好的; virtio_device結構中有一個struct virtio_config_ops,函式集由驅動來進行指定,用于操作具體的設備;
本文描述的virtio-net驅動,既是一個virtio設備,也是一個pci設備,在內核中通過結構體struct virtio_pci_device來組織:

- 該結構體中維護了幾個IO區域:
Common, ISR, Device, Notify,用于獲取virtio設備的各種資訊,這個也是由virtio規范決定的; - 通常來說一個virtio設備,由以下幾個部分組成:
- Device status field
- Feature bits
- Notifications
- Device Configuration space
- One or more virtqueues
- 從結構體看,它用于充當pci設備和virtio設備的紐帶,后續也會在probe函式中針對不同的部分進行對應的初始化;
以總線的匹配視角來看就是這樣子的:

3. 流程分析
3.1 virtio總線創建
先看一下virtio總線的創建,virtio bus當然也算是基建了:

bus_register注冊virtio總線,總線負責匹配,在匹配成功后呼叫通用的virtio_dev_probe函式;- 千里姻緣一線牽,當Virtio的ID號能對上時,就會觸發驅動探測,所以什么時候進行設備注冊呢?
3.2 virtio驅動呼叫流程
詳細的細節,建議閱讀之前PCI驅動系列的分析文章,下邊羅列關鍵部分:

- virtio-net設備通過掛在pci總線上,系統在PCI子系統初始化時會去列舉所有的設備,并將列舉的設備注冊進系統;
- 系統在匹配上之后,呼叫設備的驅動;

- PCI設備根據Vendor ID來匹配驅動;
- virtio規范中規定基于PCI的virtio設備,Vendor ID號為:
0x1AF4,因此最終呼叫的驅動入口為virtio_pci_probe;

- 在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的驅動的入口了,當然,文章也要戛然而止了,
整體執行流程及框架應該清楚了,細節就留給大家了,待續,,,
參考
https://developer.ibm.com/technologies/linux/articles/l-virtio/
Virtual I/O Device (VIRTIO) Version 1.1
歡迎關注個人公眾號,不定期更新技術文章,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/263173.html
標籤:其他
上一篇:STM32 DAC詳解
