本文基於dpdk-1.8.0分析。
網絡卡驅動模型一般包含三層,即,pci匯流排裝置、網絡卡裝置以及網絡卡裝置的私有資料結構,即將裝置的共性一層層的抽象,pci匯流排裝置包含網絡卡裝置,網絡卡裝置又包含其私有資料結構。在dpdk中,首先會註冊裝置驅動,然後查詢當前系統有哪些pci裝置,並通過pci_id為pci裝置找到對應的驅動,最後呼叫驅動初始化裝置。
一、網絡卡驅動註冊
以e1000網絡卡驅動為例說明。
在1.8.0版本中,網絡卡驅動的註冊使用了一種奇技淫巧的方法,使用gcc attribute擴充套件屬性的constructor屬性,使得網絡卡驅動的註冊在程式main函式之前就執行了。
static其中pmd_register_driver()巨集的定義如下:struct rte_driver pmd_igb_drv =;
static
struct rte_driver pmd_igbvf_drv =;
pmd_register_driver(pmd_igb_drv);
pmd_register_driver(pmd_igbvf_drv);
#define pmd_register_driver(d)\使用attribute的constructor屬性,在main函式執行前,就執行rte_eal_driver_register()函式,將pmd_igb_drv驅動掛到全域性dev_driver_list鍊錶上。void devinitfn_ ##d(void
);\void __attribute__((constructor, used)) devinitfn_ ##d(void
)\
二、掃瞄當前系統有哪些pci裝置
呼叫rte_eal_init()--->rte_eal_pci_init()函式,查詢當前系統中有哪些網絡卡,分別是什麼型別,並將它們掛到全域性鍊錶pci_device_list上。
1、首先初始化全域性鍊錶pci_driver_list、pci_device_list。用於掛載pci驅動及pci裝置。
2、pci_scan()通過讀取/sys/bus/pci/devices/目錄下的資訊,掃瞄當前系統的pci裝置,並初始化,並按照pci位址從大到小的順序掛在到pci_debice_list上。
intpcai_scan()通過讀取/sys/bus/pci/devices/目錄下相關pci裝置的如下檔案,獲取對應的資訊,初始化struct rte_pci_device資料結構,並將其按照pci位址從大到小的順序掛到pci_device_list鍊錶上。rte_eal_pci_init(
void
)#ifdef vfio_present
pci_vfio_enable();
if(pci_vfio_is_enabled())
#endif
return0;
}
structrte_pci_device ;
root@ubuntu:~# ls -ltr /sys/bus/pci/devices/0000\:00\:09.0/total目錄名:就是pci裝置的位址,記錄在struct rte_pci_addr資料結構中。0-rw-r--r-- 1 root root 4096 nov 15
12:18
uevent
lrwxrwxrwx
1 root root 0 nov 15
12:18 subsystem -> ../../../bus/pci
-r--r--r-- 1 root root 4096 nov 15
12:19
class
-r--r--r-- 1 root root 4096 nov 15
12:19
vendor
-r--r--r-- 1 root root 4096 nov 15
12:19
device
-rw-r--r-- 1 root root 256 nov 15
12:19
config
-r--r--r-- 1 root root 4096 nov 15
12:19
local_cpus
-r--r--r-- 1 root root 4096 nov 15
12:19
irq-r--r--r-- 1 root root 4096 nov 15
12:20
resource
drwxr-xr-x 2 root root 0 nov 15
12:20
power
-r--r--r-- 1 root root 4096 nov 19
14:33
subsystem_vendor
-r--r--r-- 1 root root 4096 nov 19
14:33
subsystem_device
-r--r--r-- 1 root root 4096 nov 19
14:33
numa_node
-rw------- 1 root root 8 nov 19
14:58
resource2
-rw------- 1 root root 131072 nov 19
14:58
resource0
--w------- 1 root root 4096 nov 19
14:58
reset
--w--w---- 1 root root 4096 nov 19
14:58
rescan
--w--w---- 1 root root 4096 nov 19
14:58
remove
-rw-r--r-- 1 root root 4096 nov 19
14:58
msi_bus
-r--r--r-- 1 root root 4096 nov 19
14:58
modalias
-r--r--r-- 1 root root 4096 nov 19
14:58
local_cpulist
-rw------- 1 root root 4096 nov 19
14:58
enable
-r--r--r-- 1 root root 4096 nov 19
14:58
dma_mask_bits
-r--r--r-- 1 root root 4096 nov 19
14:58
consistent_dma_mask_bits
-rw-r--r-- 1 root root 4096 nov 19
14:58
broken_parity_status
drwxr-xr-x 3 root root 0 nov 19
15:31
uiolrwxrwxrwx
1 root root 0 nov 19
15:31 driver -> ../../../bus/pci/drivers/igb_uio
-rw-r--r-- 1 root root 4096 nov 19
15:32 max_vfs
vendor檔案:獲取pci_id.vendor_id。
device檔案:獲取pci_id.device_id。
subsystem_vendor檔案:獲取pci_id.subsystem_vendor_id。
subsystem_device檔案:獲取pci_id.subsystem_device_id。
numa_node檔案:獲取pci裝置屬於哪個cpu socket。
resource檔案:獲取pci裝置的在位址匯流排上的實體地址,以及實體地址空間的大小,記錄在struct rte_pci_resouce資料結構中。
DPDK收發包處理流程 網絡卡初始化
本文基於dpdk 1.8.0分析。網絡卡驅動模型一般包含三層,即,pci 匯流排裝置 網絡卡裝置以及網絡卡裝置的私有資料結構,即將裝置的共性一層層的抽象,pci 匯流排裝置包含網絡卡裝置,網絡卡裝置又包含其私有資料結構。在 dpdk 中,首先會註冊裝置驅動,然後查詢當前系統有哪些 pci設 備,並通...
LINUX一網絡卡多IP設定
方法1 少量ip手動繫結 這裡以繫結ip到eth0為例,其它網絡卡的話修改相應的檔名即可 1.複製ifcfg eth0的網絡卡配置檔案並改名為ifcfg eth0 0 root akinlau cp etc sysconfig network scripts ifcfg eth0 etc sysco...
Linux網路管理(一) 網絡卡驅動與Linux核心
下圖簡單描述了網絡卡驅動與linux核心之間的聯絡 關於上圖的一些說明 系統初始化 1.協議模組呼叫 dev add pack 來註冊協議處理函式到鍊錶 ptype base 2.init br init 用於初始化橋接相關的操作 3.init net dev init 初始化了兩個軟中斷 網絡卡驅...