例項解讀網絡卡驅動

2021-04-21 13:55:33 字數 2633 閱讀 5079

tg3 gbit nic driver analysis

1, 驅動模組的載入和解除安裝

如果網路裝置(包括wireless)是pci規範的,則先是向核心註冊該pci裝置(pci_register_driver),然後由pci_driver資料結構中的probe函式指標所指向的偵測函式來初始化該pci裝置,並且同時註冊和初始化該網路裝置。

如果網路裝置(包括wireless)是pcmcia規範的,則先是向核心註冊該pcmcia裝置(register_pccard_driver),然後driver_info_t資料結構中的attach函式指標所指向的偵測函式來初始化該pcmcia裝置,並且同時註冊和初始化該網路裝置。

static int __init tg3_init(void)

static void __exit tg3_cleanup(void)

module_init(tg3_init); //驅動模組的載入

module_exit(tg3_cleanup); //驅動模組的解除安裝

申明為pci裝置:

static struct pci_driver tg3_driver = ;

2,pci裝置探測函式probe,初始化網路裝置

static int __devinit tg3_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)

3,登出網路裝置

static void __devexit tg3_remove_one(struct pci_dev *pdev)

4,開啟網路裝置

static int tg3_open(struct net_device *dev)

5,關閉網路裝置

static int tg3_close(struct net_device *dev)

6,硬體處理資料報傳送

static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)

7,中斷處理收包,發包

static void tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)

8,發包

static void tg3_tx(struct tg3 *tp)

9,收包

static int tg3_rx(struct tg3 *tp, int budget)

10, 讀取包的網絡卡收發包的狀態,統計資料

static struct net_device_stats *tg3_get_stats(struct net_device *dev)

11, 使用者的ioctl命令系統呼叫

static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

…… }

} 12, pci裝置的掛起和恢復函式

static int tg3_suspend(struct pci_dev *pdev, u32 state)

static int tg3_resume(struct pci_dev *pdev)

13,引數設定

在驅動程式裡還提供一些方法供系統對裝置的引數進行設定和讀取資訊。一般只有超級使用者(root)許可權才能對裝置引數進行設定。設定方法有:

tg3_set_mac_addr (dev->set_mac_address)

當使用者呼叫ioctl型別為siocsifhwaddr時是要設定這個裝置的mac位址。一般對mac位址的設定沒有太大意義的。

dev->set_config()

當使用者呼叫ioctl時型別為siocsifmap時,系統會呼叫驅動程式的set_config方法

使用者會傳遞乙個ifmap結構包含需要的i/o、中斷等引數。

總結:

所有的linux網路驅動程式遵循通用的介面。設計時採用的是物件導向的方法。乙個裝置就是乙個物件(net_device 結構),它內部有自己的資料和方法。乙個網路裝置最基本的方法有初始化,傳送和接收。

linux網路驅動程式的體系結構可以劃分為四層:

網路協議介面,網路裝置介面,裝置驅動功能,網路裝置和網路媒介層

網路驅動程式,最主要的工作就是完成裝置驅動功能層。在linux中所有網路裝置都抽象為乙個介面,這個介面提供了對所有網路裝置的操作集合。由資料結構struct net_device來表示網路裝置在核心中的運**況,即網路裝置介面。它既包括純軟體網路裝置介面,如環路(loopback),也包括硬體網路裝置介面,如乙太網卡。而由以dev_base為頭指標的裝置鍊錶來集體管理所有網路裝置,該裝置鍊錶中的每個元素代表乙個網路裝置介面。資料結構net_device中有很多供系統訪問和協議層呼叫的裝置方法,包括初始化,開啟和關閉網路裝置的open和stop函式,處理資料報傳送的hard_start_xmit函式,以及中斷處理函式等。

網路裝置在linux裡做專門的處理。linux的網路系統主要是基於bsd unix的socket機制。在系統和驅動程式之間定義有專門的資料結構(sk_buff)進行資料的傳遞。系統裡支援對傳送資料和接收資料的快取,提供流量控制機制,提供對多協議的支援。

例項解讀 linux 網絡卡驅動

正文 1,驅動模組的載入和解除安裝 如果網路裝置 包括wireless 是pci規範的,則先是向核心註冊該pci裝置 pci register driver 然後由pci driver資料結構中的probe函式指標所指向的偵測函式來初始化該pci裝置,並且同時註冊和初始化該網路裝置。如果網路裝置 包...

例項解讀 linux 網絡卡驅動

13,引數設定 在驅動程式裡還提供一些方法供系統對裝置的引數進行設定和讀取資訊。一般只有超級使用者 root 許可權才能對裝置引數進行設定。設定方法有 tg3 set mac addr dev set mac address 當使用者呼叫ioctl型別為siocsifhwaddr時是要設定這個裝置的...

例項解讀網絡卡驅動 Tg3 Gbit NIC

例項解讀網絡卡驅動 tg3 gbit nic tg3 gbit nic driver analysis 1,驅動模組的載入和解除安裝 如果網路裝置 包括 wireless 是pci 規範的,則先是向核心註冊該 pci裝置 pci register driver 然後由 pci driver 資料結構...