Linux網路裝置驅動架構學習(二)

2022-09-05 03:21:08 字數 3113 閱讀 8278

接下來會從以下幾個方面介紹網路裝置驅動的編寫流程:

1、網路裝置的註冊與登出

2、網路裝置的初始化

3、網路裝置的開啟與釋放

4、網路資料傳送流程

5、網路資料接收流程

6、網路連線狀態

7、網路引數設定和統計資料

了解了這幾部份內容,網路裝置驅動的編寫方法也就基本明白了

網路裝置的註冊與登出

網路裝置驅動的註冊與登出使用成對出現的register_netdev()和unregister_netdev()函式完成,這兩個函式的原型為: 

int register_netdev(struct net_device *dev); 

void unregister_netdev(struct net_device *dev); 

這兩個函式都接收乙個 net_device 結構體指標為引數,可見 net_device 資料結構在網路裝置驅動中的核心地位。 

net_device 的生成和成員的賦值並非一定要由工程師逐個親自動手完成,可以利用下面的函式幫助我們填充:

struct net_device *alloc_netdev(int sizeof_priv, const char *name, void(*setup) (struct net_device*)); 

struct net_device *alloc_etherdev(int sizeof_priv); 

alloc_netdev()函式生成乙個 net_device 結構體,對其成員賦值並返回該結構體的指標。第乙個引數為裝置私有成員的大小,第二個引數為裝置名,第三個引數為net_device 的 setup()函式指標。setup()函式接收的引數也為 struct net_device 指標,用

於預置 net_device 成員的值。 

alloc_etherdev()是 alloc_netdev()針對乙太網的「快捷」函式。

完成與 alloc_enetdev()和 alloc_etherdev()函式相反功能,即釋放 net_device 結構體的函式為: 

void free_netdev(struct net_device *dev); 

net_device 結構體的分配和網路裝置驅動註冊需在網路裝置驅動程式的模組載入函式中進行,而 net_device 結構體的釋放和網路裝置驅動的登出則需在模組解除安裝函式中完成,如**清單所示。

1   int ***_init_module(void) 

2

13

14 void ***_cleanup(void)

15

網路裝置的初始化

網路裝置的初始化主要需要完成如下幾個方面的工作。 

1、進行硬體上的準備工作,檢查網路裝置是否存在,如果存在,則檢測裝置所使用的硬體資源。 

2、進行軟體介面上的準備工作,分配 net_device 結構體並對其資料和函式指標成員賦值。 

3、獲得裝置的私有資訊指標並初始化其各成員的值。如果私有資訊中包括自旋鎖或訊號量等併發或同步機制,則需對其進行初始化。 

對 net_device 結構體成員及私有資料的賦值都可能需要與硬體初始化工作協同進行,即硬體檢測出了相應的資源,需要根據檢測結果填充 net_device 結構體成員和私有資料。 乙個網路裝置驅動初始化函式的模板如**清單所示,具體的裝置驅動初始化函式並不一定完全和本模板一樣,但是其本質過程是一致的。

1   void ***_init(struct net_device *dev) 

2

30

31 /* 取得私有資訊,並初始化它*/

32 priv = netdev_priv(dev);

33 ... /* 初始化裝置私有資料區 */

34 }

上述**第 7 行的 ***_hw_init()函式完成硬體相關的初始化操作,如下所示。 

1、探測 *** 網路裝置是否存在。探測的方法類似於數學上的「反證法」,即先假設存在裝置 ***,訪問該裝置,如果裝置的表現與預期的一致,就確定裝置存在;否則,假設錯誤,裝置 *** 不存在。 

2、探測裝置的具體硬體配置。一些裝置驅動編寫得非常通用,對於同類的裝置使用統一的驅動,我們需要在初始化時探測裝置的具體型號。另外,即便是同一裝置,在硬體上的配置也可能不一樣,我們也可以探測裝置所使用的硬體資源。 

3、申請裝置所需要的硬體資源,如用 request_region()函式進行 i/o 埠的申請等,但是這個過程可以放在裝置的開啟函式 ***_open()中完成。

針對mini2440 dm9000 驅動probe方法做乙個分析就可以對上面兩個過程有乙個更清晰的認識

請移步:mini2440 dm9000 驅動分析(三)

網路裝置的開啟與釋放

網路裝置的開啟函式需要完成如下工作。 

1、使能裝置使用的硬體資源,申請 i/o 區域、中斷和 dma 通道等。 

2、呼叫 linux 核心提供的 netif_start_queue()函式,啟用裝置傳送佇列。 

網路裝置的關閉函式需要完成如下工作。 

1、呼叫 linux 核心提供的 netif_stop_queue()函式,停止裝置傳輸包。 

2、釋放裝置所使用的 i/o 區域、中斷和 dma 資源。 

linux 核心提供的 netif_start_queue()和 netif_stop_queue()兩個函式的原型為: 

void netif_start_queue(struct net_device *dev); 

void netif_stop_queue (struct net_device *dev); 

根據以上分析,可得出如**清單所示的網路裝置開啟和釋放函式的模板。 

1   int ***_open(struct net_device *dev) 

2

9

10 int ***_release(struct net_device *dev)

11

針對mini2440 dm9000 驅動open,stop方法做乙個分析就可以對上面兩個過程有乙個更清晰的認識

請移步:mini2440 dm9000 驅動分析(四)

linux網路裝置驅動

linux網路裝置驅動 linux網路驅動程式的體系結構可劃分為4個層次。linux核心源 中提供了網路裝置介面及以網路子系統的上層的 移植特定網路硬體的驅動程式的主要工作就是完成裝置驅動功能層的相應 根據底層具體的硬體特性,定義網路裝置介面struct net device型別的結構體變數,並實現...

linux 網路裝置驅動

linux 網路驅動 謹以此文紀念過往的歲月 一.前言 在linux中網路驅動也是乙個大頭,如何去理解網路驅動是作為乙個linux驅動工程師必備的技能。不過同樣的裝置,在不同人的手中會有不同的效果,其原因就在於驅動的好與否。二.裝置註冊 學習網路的驅動與學習普通cdev驅動一樣,都是學習其模板,然後...

Linux網路裝置驅動 一

一 網路裝置驅動基礎 1.乙太網基礎理論 乙太網是區域網的一種,它使用載波監聽多路訪問及衝突檢測技術 csma cd 並以10m s的速率執行在多種型別的電纜上,常用的網絡卡晶元有dm9000 dm9161 cs8900晶元。乙太網的拓撲結構有匯流排型和星型,乙太網的工作模式有半雙工和全雙工。目前雙...