91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 24KB
    文件類型: .c
    金幣: 1
    下載: 1 次
    發布日期: 2022-10-06
  • 語言: 其他
  • 標簽: pci??napi??ixgevf??

資源簡介

這是一份關于 ixgbevf 的10G高性能網卡的驅動分析, 里面都是本人對centos內核 ixgbevf驅動源碼的跟蹤,里面涵蓋了關于pci, napi的知識。 這一類形的高性能解決方案非常通用,而且也是行業的標準。 一個驅動從上電啟動,到初始化,到掛載帶pci總線, 到注冊到napi模型,到poll接收數據包。 都用分析。

資源截圖

代碼片段和文件信息

一,?PCI?nic驅動
1?初始化
在pci_driver中包含一個名為*id_table的pci_device_id結構,
用于標識該驅動所能支持的網卡類型,這里IGB所能支持的相應結構為:???
static?struct?pci_device_id?ixgbevf_pci_tbl[]?=?{
{pci_vdevice(intel?ixgbe_dev_id_82599_vf)?board_82599_vf}?
{pci_vdevice(intel?ixgbe_dev_id_x540_vf)?board_x540_vf}
{0?}
};

ixgbe驅動定義了pci_driver類型的結構——ixgbevf_driver,
并通過對其修改設置了該驅動的名稱、其支持的網卡型號、
以及對該網卡進行各種操作時候應該調用的相應函數句柄,代碼如下:???
static?struct?pci_driver?ixgbevf_driver?=?{
.name?????=?ixgbevf_driver_name
.id_table?=?ixgbevf_pci_tbl
.probe????=?ixgbevf_probe?//當PCI層檢測到一個PCI設備能夠被某PCI驅動所支持?就調調用此函數
.remove???=?__devexit_p(ixgbevf_remove)
.shutdown?=?ixgbevf_shutdown
};

當PCI層檢測到一個PCI設備能夠被某PCI驅動所支持時(這是通過函數pci_match_one_device來進行檢測的),
就會調用這個PCI驅動上的probe函數,在該函數中會對該特定的PCI設備進行一些具體的初始化等操作。
其probe函數為ixgbevf_probe,其主要作用是網卡設備net_device的初始化。
而在網卡設備的初始化之前,首先需要完成的是將網卡設備注冊到PCI層。

2.?驅動的初始化
Linux-2.6下的驅動有統一的入口和出口,即:module_init()和module_exit()。
module_init(ixgbevf_init_module);
module_exit(ixgbevf_exit_module);

其中的ixgbevf_init_module()和ixgbevf_exit_module()分別為用于加載和注銷ixgbe驅動的真正起作用的代碼,
其中引起網卡在PCI層注冊的函數為ixgbevf_init_module(),如下:?
該函數中調用了pci_register_driver()來注冊PCI驅動。?
/**
?*?ixgbe_init_module?-?Driver?Registration?Routine
?*
?*?ixgbe_init_module?is?the?first?routine?called?when?the?driver?is
?*?loaded.?All?it?does?is?register?with?the?PCI?subsystem.
?**/
static?int?__init?ixgbevf_init_module(void)
{
int?ret;
printk(KERN_INFO?“ixgbevf:?%s?-?version?%s\n“?ixgbevf_driver_string
???????ixgbevf_driver_version);

printk(KERN_INFO?“%s\n“?ixgbevf_copyright);

ret?=?pci_register_driver(&ixgbevf_driver);?
return?ret;
}

module_init(ixgbevf_init_module);


3.?網卡驅動在PCI層的注冊過程?
PCI的注冊就是將PCI驅動程序掛載到其所在的總線的drivers鏈,
同時掃描PCI設備,將它能夠進行驅動的設備掛載到driver上的devices鏈表上來,

3.1?pci_register_driver()?
從前面已經得知,ixgbevf_init_module()通過調用pci_register_driver()來對網卡驅動進行注冊。
而通過閱讀內核代碼可知,pci_register_driver并非一個函數,而是一個宏,
它通過?__pci_register_driver()來完成驅動的注冊。
__pci_register_driver()首先通過傳入的參數struct?pci_driver?*ixgbevf_driver進行一些初始化工作,
具體如下:


/**
?*?__pci_register_driver?-?register?a?new?pci?driver
?*?@drv:?the?driver?structure?to?register
?*?@owner:?owner?module?of?drv
?*?@mod_name:?module?name?string
?*?
?*?Adds?the?driver?structure?to?the?list?of?registered?drivers.
?*?Returns?a?negative?value?on?error?otherwise?0.?
?*?If?no?error?occurred?the?driver?remains?registered?even?if?
?*?no?device?was?claimed?during?registration.
?*/
int?__pci_register_driver(struct?pci_driver?*drv?struct?module?*owner
const?char?*mod_name)
{
int?error;

/*?initialize?common?driver?fields?*/
drv->driver.name?=?drv->name;
drv->driver.bus?=?&pci_bus_type;
drv->driver.owner?=?owner;
drv->driver.mod_name?=?mod_name;

spin_lock_init(&drv->dynids.lock);
INIT_LIST_HEAD(&drv->dynids.list);

/*?register?with?core?*/
error?=?driver_register(&drv->driver);
if?(error)
goto?out;

error?=?pci_create_newid_file(drv);
if?(error)
goto?out_newid;

error?=?pci_create_removeid_file(drv);
if?(error)
goto?out_removeid;
out:
return?error;

out_re

評論

共有 條評論