Linux 網絡卡驅動學習(二)(網路驅動介面小結)

2021-07-10 02:20:35 字數 2188 閱讀 1644

摘要】前文我們分析了乙個虛擬硬體的網路驅動例子,從中我們看到了網路裝置的一些介面,其實網路裝置驅動和塊裝置驅動的功能比較類似,都是傳送和接收資料報(資料請求)。當然它們實際是有很多不同的。首先塊裝置在/dev目錄下有裝置節點,而網路裝置沒有這樣的裝置入口。read,write等常規的檔案介面在網路裝置下也沒有意義。

最大的區別在於:塊裝置只響應核心的資料請求;而網路裝置驅動要非同步地接收來自外部的資料報。簡單地說,塊裝置驅動是被要求傳輸資料而網路裝置是主動請求傳輸資料。網路裝置驅動還需要支援設定位址,修改傳輸引數等等這樣的操作,所以網路裝置驅動的api需要提供這些介面。

本文是對上文虛擬硬體的網路驅動例子進行乙個簡單的梳理。

(1)網路裝置註冊

標頭檔案:struct net_device 網路裝置結構體

struct net_device *alloc_netdev (int size_priv, const

char *name, void (*setup)(struct net_device *));

int register_netdev(struct net_device *device); 註冊網路裝置

void unregitster_netdev(struct net_device *device); 登出網路裝置

(2)開啟和關閉

驅動在加載入核心後,核心會呼叫probe函式來探測它。在網路介面可以傳送資料報時,核心必須首先開啟它並給它設定位址。核心開啟和關閉網路介面是由ifconfig命令觸發的。

int (*open)(struct net_device*); 開啟網路裝置

int (*stop)(struct net_device*); 關閉網路裝置

void netif_start_queue(struct net_device*); 啟動網路傳輸佇列

void netif_stop_queue(struct net_device*); 關閉網路傳輸佇列

(3)網路資料的傳送

網路介面最重要的作用是傳送和接收網路資料。

標頭檔案:定義了網路驅動中傳輸的基本單元,struct sk_buff

struct netdeviceops 網路裝置驅動需要實現的介面函式

netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev); 傳輸網路資料報的函式

void (*ndo_tx_timeout) (struct net_device *dev); 傳輸超時函式

(4)網路資料的接收

接收網路資料相對於傳送資料要複雜一些,因為你需要在原子上下文中把分配乙個 sk_buff 並把它移交給上層處理。

資料報接收有兩種實現方式:中斷驅動和輪詢。大多數驅動都是中斷驅動的,有一些高吞吐量的驅動會使用輪詢的方式。

struct sk_buff *dev_alloc_skb(unsigned int

length); 原子上下文中分配skb

printk_ratelimit() 限制printk的輸出頻率,在中斷相應函式中減少輸出

實現高吞吐量的網路驅動,要減少網路阻塞最好的方法是使用napi,後面會介紹

(5)中斷處理

硬體可以中斷cpu傳送兩種事件:新的資料報到來和傳送的資料報已經傳送完成。

判斷並處理資料報事件

如果在其他地方暫時停止了傳送佇列,應該在中斷函式中重新啟動它

(6)napi

高吞吐量的網路介面如果每個資料報都用中斷來處理的話會給系統帶來很大的負擔,這個時候應該使用基於輪詢的 napi。這樣可以減輕系統的負擔,減少阻塞的時間。

只有極少數的裝置實現了napi,因為實現起來比中斷要複雜,而且有其他的一些條件。

在中斷處理函式中,首先禁止進一步的中斷處理,然後排程輪詢函式,進入輪詢函式後連續處理多個資料傳送請求。

int (*poll)(struct net_device *dev, int

*budget); 網路驅動輪詢函式

int netif_rx_schedule(struct net_device *dev); 準備呼叫輪詢函式

int (*poll)(struct net_device *dev, int

*budget); 輪詢函式

2010 03 24 網路驅動

最近幾天都在看關於網路驅動方面的東西,今天繼續看,順便記錄下來。每乙個介面由乙個net device結構體來描述。裡面定義。分配函式為 struct net device alloc netdev int sizeof priv,const char name,void setup struct n...

Linux學習筆記(二)網路介面配置

一 安裝和配置網路裝置 linux支援的網絡卡驅動程式都存放在目錄 lib modules linux kernel version net下。通過修改模組配置檔案來更改網絡卡或者增加網絡卡。修改 etc conf.modules檔案 alias eth n modelname options mo...

08 網路配置,多網絡卡

ip addr檢視一下網路的配置 cd etc sysconfig network scripts 進入到存放網路配置的資料夾 ls檢視一下有哪些配置檔案 本來應該一塊網絡卡會有乙個配置檔案的,這裡我不知道為什麼我只有兩個配置檔案,我有3個網絡卡。修改網絡卡eth0的配置 儲存退出,這裡重啟一下網路...