Linux網路卡驅動

 

NE2000乙太網卡的基礎上進行的。
只要看懂一塊網路卡的驅動,那麼其他網路卡的驅動是類似的,模組的劃分也是一致的,只是具體的函式和晶片的操作有區別。
文件中紅色的標註都是重點。
自己看程式碼的時候避免依賴於硬體和晶片的程式碼,而對整個網路裝置管理機制的學習,並關注一般網路裝置所共有的東西。

 

 

一. 網路裝置驅動

網路的物理裝置,稱為介面(Interface)。所有對網路硬體的訪問都是通過介面進行的,介面提供了一個對所有型別的硬體一致化的操作集合來處理基本資料的傳送和接收。
一個網路介面被看作是一個傳送和接收資料包(packets)的實體。
對於每個網路介面,都用一個device的資料結構表示,有關該資料結構的具體內容,將在本文的後面詳細介紹,週日的程式碼中已經將主要的部分註釋了。
網路裝置是一個物理裝置如乙太網卡,但軟體也可以作為網路裝置,如回送裝置(loopback)。
在核心啟動時,通過網路裝置驅動程式,將登記存在的網路裝置。裝置用標準的支援網路的機制來轉遞收到的資料到相應的網路層。

所有被髮送和接收的包都用資料結構sk_buff表示。這是一個具有很好的靈活性的資料結構,可以很容易增加或刪除網路協議資料包的首部,是和上層的介面,對於IP層的網路來說,只能識別和區分skbuff
網路介面的核心用一個device資料結構表示的。網路裝置在做資料包傳送和接收時,直接通過介面訪問。
網路介面是在系統初始化時實時生成的,對於核心支援的但不存在的物理網路裝置,將不可能有與之相對應的device結構
在核心中也存在著一張網路介面管理表dev_base,但與前兩張表不同,dev_base是指向device結構的指標,因為網路裝置是通過device資料結構來表示的。dev_base實際上是一條device結構連結串列的表頭,在系統初始化完成以後,系統檢測到的網路裝置將自動地儲存在這張連結串列中,其中每一個連結串列單元表示一個存在的物理網路裝置。當要傳送資料時,網路子系統將根據系統路由表選擇相應的網路介面進行資料傳輸,而當接收到資料包時,通過驅動程式登記的中斷服務程式進行資料的接收處理
網路裝置工作原理圖: