例項解讀網絡卡驅動――
tg3 gbit nic
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 ***_device *dev) 5
,關閉網路裝置
static int tg3_close(struct ***_device *dev) 6
,硬體處理資料報傳送
static int tg3_start_xmit(struct sk_buff *skb, struct ***_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 ***_device_stats *tg3_get_stats(struct ***_device *dev)
11,
使用者的ioctl
命令系統呼叫
static int tg3_ioctl(struct ***_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
網路驅動程式遵循通用的介面。設計時採用的是物件導向的方法。乙個裝置就是乙個物件
(***_device 結構)
,它內部有自己的資料和方法。乙個網路裝置最基本的方法有初始化
,傳送和接收。
linux
網路驅動程式的體系結構可以劃分為四層:
網路協議介面,網路裝置介面,裝置驅動功能,網路裝置和網路媒介層
網路驅動程式,最主要的工作就是完成裝置驅動功能層。在
linux
中所有網路裝置都抽象為乙個介面,這個介面提供了對所有網路裝置的操作集合。由資料結構
struct ***_device
來表示網路裝置在核心中的運**況,即網路裝置介面。它既包括純軟體網路裝置介面,如環路(
loopback
),也包括硬體網路裝置介面,如乙太網卡。而由以
dev_base
為頭指標的裝置鍊錶來集體管理所有網路裝置,該裝置鍊錶中的每個元素代表乙個網路裝置介面。資料結構
***_device
中有很多供系統訪問和協議層呼叫的裝置方法,包括初始化
,開啟和關閉網路裝置的
open
和stop
函式,處理資料報傳送的
hard_start_xmit
函式,以及中斷處理函式等。
網路裝置在
linux
裡做專門的處理。
linux
的網路系統主要是基於
bsd unix
的socket
機制。在系統和驅動程式之間定義有專門的資料結構
(sk_buff)
進行資料的傳遞。系統裡支援對傳送資料和接收資料的快取,提供流量控制機制,提供對多協議的支援。
例項解讀網絡卡驅動
tg3 gbit nic driver analysis 1,驅動模組的載入和解除安裝 如果網路裝置 包括wireless 是pci規範的,則先是向核心註冊該pci裝置 pci register driver 然後由pci driver資料結構中的probe函式指標所指向的偵測函式來初始化該pci裝...
例項解讀 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時是要設定這個裝置的...