學習分享-170828

這周又沒看書。。。

由于最近要做些網絡方面的優化,就又學習了下網絡驅動模型。

e1000e網卡驅動分析—網卡驅動的體系結構在硬件上電初始化時,BIOS統一檢查所有的PCI設備,并為每個設備分配一個物理地址,該地址通過BIOS獲得并寫到設備的配置空間內,CPU不能直接訪問,驅動程序可以將這部分配置空間通過ioremap映射到普通內存供CPU問。

當操作系統初始化時,其為每個

PCI

設備分配了一個

pci_dev

結構,并將前面分配的物理地址寫到

pci_dev

resource

字段中。在驅動程序中,可以通過讀取這個字段得到設備的配置空間地址,由函數

pci_resource_start()

以及

pci_resource_len()

獲得配置空間的起始地址和大小,再通過

ioremap

映射到內存中,供

CPU

訪問,來控制該設備。

e1000e網卡驅動加載時,顯而易見的是調用module_init(e1000_init_module)宏,然后調用e1000_init_module()函數,該函數又會進一步的調用pci_register_driver()函數。
pci_register_driver()函數以一個pci_driver的結構作為入參,該結構定義了PCI設備相關的操作函數,如probe、shutdown、remove等,最主要的是定義了id_table。我們知道,網卡設備也是一個PCI設備,而系統所有PCI設備的id_table在系統啟動階段就已經分配,這里的主要目的是用pci_driver結構的id_table和所有PCI設備的id_table比較,找到匹配項,然后取出該PCI設備的pci_dev結構,最后調用probe方法。
/* PCI Device API Driver */
static struct pci_driver e1000_driver = {
? .name = e1000e_driver_name,
? .id_table = e1000_pci_tbl, // 驅動所能操縱的設備id列表
? .probe = e1000_probe,
? .remove = __devexit_p(e1000_remove),
#ifdef CONFIG_PM
? .driver.pm = &e1000_pm_ops,
#endif
? .shutdown = e1000_shutdown,
? .err_handler = &e1000_err_handler
};
在介紹具體的代碼前,先介紹下驅動相關的三個數據結構:pci_dev、net_device以及e1000_adapter。這三個數據結構實現了硬件到軟件驅動的過渡,要讀懂網卡驅動,必須弄清楚這三個結構的關系。
pci_dev結構是在啟動階段保留下來的,體現了PCI設備所有應有的規范。net_device結構,是驅動層的網卡操作結構。這兩個結構都表示網卡設備,只是體現的角度不一樣,net_device是對特定適配器的抽象,其為上層協議提供了統一的結構,網卡驅動則基于特定的適配器實現了這一抽象。網卡驅動實際操作的是特定的適配器,是由硬件相關的adapter即該驅動中的e1000_adapter所表示的結構體,adapter體現了大部分與硬件相關的特性,網卡驅動除了直接對pci_dev結構操作外,其他隊網卡設備的操作基本都是對adapter結構的操作。adapter結構體現了net_device與pci_dev的關聯,也實現了網絡設備的適配器無關性。
上圖中,描述了這三個數據結果的關系。pci_dev結構體現了網卡的配置空間和I/O內存區域,net_device結構則向內核同了操作網卡的抽象接口。e1000_adapter結構除了體現相應的硬件無關性外,還管理了發送與接受數據包的相應緩沖區,網卡的物理地址空間映射后的虛擬地址也在改結構中保存。e1000_adapter結構中的e1000_hw結構主要保存網卡的硬件參數,其值就是通過讀取pci_dev的結構獲取出來的。
舉個例子來說,用戶態的收發包驅動netmap,在實現是就繼承了網卡驅動中的e1000_adapter和net_device結構,來操作硬件、收發隊列以及向上提供接口。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容