當前位置:編程學習大全網 - 編程語言 - DPDK igb_uio驅動分析

DPDK igb_uio驅動分析

本文整理下之前的學習筆記,基於DPDK17.11版本源碼分析。主要分析壹下igb_uio驅動源碼。

首先簡單介紹壹下kernel中的總線-設備-驅動模型,以pci總線為例,pci總線上有兩個表,壹個用於保存系統中的pci設備,壹個用於保存pci設備對應的驅動。每當加載pci設備驅動時,就會遍歷pci總線上的pci設備進行匹配,每當插入pci設備到系統中時,熱插拔機制就會自動遍歷pci總線上的pci設備驅動進行匹配,如果匹配成功則使用此驅動初始化設備。

註冊pci總線

可以調用bus_register註冊總線。比如下面的pci總線,平臺總線和usb總線等。

註冊總線後,會在 /sys/bus 下生成總線目錄,比如 pci 總線會生成目錄 /sys/bus/pci

註冊總線後,會生成文件/sys/bus/pci/drivers_autoprobe,寫此文件時在kernel中會調用如下函數,如果為1,表示 bus 支持自動探測 device,則加載驅動時,自動遍歷所有pci設備進行匹配

註冊驅動到pci總線

結構體struct pci_driver表示壹個pci設備驅動,其中id_table和dynids用來保存此驅動支持的設備id等信息,如果有匹配的設備,則調用probe函數。

調用函數pci_register_driver註冊pci設備驅動。

註冊驅動後,會在/sys/bus/pci/drivers目錄下創建以驅動名字命名的目錄,並在此目錄下創建new_id, bind和unbind等sys文件,可以通過這些文件動態修改驅動信息。

向new_id寫入"0x0806 0x1521"信息(0x0806表示vendor id,0x1521為device id)時,會調用kernel中的store_new_id,解析相關字段後,保存到動態鏈表dynids,然後遍歷當前所有的pci設備進行匹配。

向bind文件寫入網卡的pci地址時,會調用kernel中的bind_store,將此網卡綁定到此驅動。

向unbind文件寫入網卡的pci地址時,會調用kernel中的unbind_store,將此網卡和此驅動解綁。

發現pci設備

系統啟動時會掃描所有的pci設備,以他們的pci地址為名字創建目錄,並在此目錄下創建相關的sys文件。並且會遍歷所有的pci設備驅動進行匹配。

向設備的driver_override文件寫入驅動名字,表示此設備只能綁定到此驅動。

如何匹配?

前面多次提到設備和驅動進行匹配,究竟如何匹配呢?

先看壹下用來表示壹個pci設備的結構體pci_dev,其中如下幾個成員變量表示此pci設備的類型,壹般vendor和device就足夠,vendor表示此設備是哪個廠商的,device表示此設備的類型。

再看壹下用來表示設備驅動的pci_driver,其中id_table和dynids用來保存此驅動支持的設備類型,前者是靜態值,後者可以通過驅動目錄下的new_id動態添加。設備類型使用pci_device_id結構體來表示,其成員變量也是vendor,device等信息,和pci_dev中的信息是壹樣的,所以可以使用這幾個字段進行匹配。

最終使用函數pci_match_device進行驅動和設備的匹配。

網卡如何綁定到igb_uio驅動呢?這裏拿DPDK提供的腳步文件dpdk-devbind.py中的函數bind_one進行分析。

igb_uio驅動的id_table為空,則在加載此驅動時,是不會匹配到任何設備的。

經過上面的分析,有三種方法可以將網卡綁定到驅動igb_uio

igb_uio probe

經過前面的分析網卡綁定到了igb_uio驅動後,會調用驅動的probe函數igbuio_pci_probe,主要做了如下幾個事情:

a. 調用pci_enable_device使能pci設備

b. 設置DMA mask

c. 填充struct uio_info信息,註冊uio設備

d. 註冊中斷處理函數

宏uio_register_device用來註冊uio設備。

簡單總結壹下,igb_uio是DPDK使用網卡的壹個通用驅動,不只intel網卡可以用,其他廠商的網卡也可以用(有壹個例外,mellanox的網卡不用綁定到igb_uio就能被使用DPDK),因為它只使能了pci設備,註冊uio,和註冊中斷處理函數,這些工作是不區分網卡類型的。

加載igb_uio時,不會自動探測pci設備,而是需要寫sys文件將設備綁定到igb_uio。

igb_uio依賴uio驅動,註冊uio設備後,會生成/dev/uiox,和網卡壹壹對應,用戶態可以poll /dev/uiox監聽中斷是否到來。

同時uio設備還會將網卡的BAR地址通過sys文件系統暴露出去,用戶態可以mmap sys文件後操作網卡寄存器。但是DPDK沒有采用這種方式,而是直接mmap網卡自身暴露出去的sys文件 /sys/bus/pci/devices/'pci address'/resource0。

blogs.com/jungle1996/p/12398915.html

blogs.com/jungle1996/p/12452636.html

  • 上一篇:java和php哪個難學?
  • 下一篇:求DCS數據庫相關資料
  • copyright 2024編程學習大全網