基于USB設(shè)備的Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序開(kāi)發(fā)
做為開(kāi)放源代碼 (Open Source) 運(yùn)動(dòng)重要組成部分,Linux操作系統(tǒng)吸引了數(shù)以萬(wàn)計(jì)的程序員共同開(kāi)發(fā)。由于Linux比較完整的繼承了各種UNIX版本的穩(wěn)定和高效,并且克服和改進(jìn)了傳統(tǒng)UNIX中的很多缺點(diǎn),更因?yàn)槠溟_(kāi)放的開(kāi)發(fā)模式,Linux成為一個(gè)具有強(qiáng)大網(wǎng)絡(luò)服務(wù)功能的操作系統(tǒng)。它支持主流的TCP/IP以及IPX/SPX、 NETBEUI等眾多網(wǎng)絡(luò)協(xié)議,無(wú)論在嵌入式系統(tǒng),服務(wù)器還是桌面操作系統(tǒng)領(lǐng)域,Linux都取得了廣泛的應(yīng)用。網(wǎng)絡(luò)驅(qū)動(dòng)程序和網(wǎng)絡(luò)硬件設(shè)備實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議棧中的數(shù)據(jù)鏈路層和物理層,對(duì)上層協(xié)議提供支持,是網(wǎng)絡(luò)協(xié)議棧的重要組成部分,對(duì)Linux的網(wǎng)絡(luò)性能起著決定作用。本文主要討論基于USB總線的 Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)方法。
2. Linux體系結(jié)構(gòu)
出于穩(wěn)定性和安全性的考慮,現(xiàn)代處理器往往具有至少兩個(gè)運(yùn)行級(jí)別。權(quán)限較低的級(jí)別無(wú)法訪問(wèn)所有的寄存器,不能對(duì)硬件直接操作。而權(quán)限較高的級(jí)別能夠進(jìn)行所有的硬件操作和訪問(wèn)任何系統(tǒng)資源。Linux設(shè)計(jì)充分利用了現(xiàn)代處理器的上述特性,其內(nèi)核部分運(yùn)行于高權(quán)限級(jí)別,應(yīng)用程序運(yùn)行于低權(quán)限級(jí)別。作為宏內(nèi)核結(jié)構(gòu)的操作系統(tǒng),Linux將進(jìn)程管理、內(nèi)存管理、網(wǎng)絡(luò)協(xié)議棧、設(shè)備驅(qū)動(dòng)和文件系統(tǒng)等服務(wù)都集成在內(nèi)核中,而應(yīng)用程序則通過(guò)系統(tǒng)調(diào)用與內(nèi)核通訊,內(nèi)核結(jié)構(gòu)如圖1所示。
圖1
圖2
Linux網(wǎng)絡(luò)子系統(tǒng)基本可以分為系統(tǒng)調(diào)用接口、BSD套接字、INET套接字、TCP/IP以及數(shù)據(jù)鏈路層。其中,BSD套接字由INET套接字層提供支持,而INET套接字管理著基于IP的TCP或UDP協(xié)議端,實(shí)現(xiàn)IP分組排序以及控制網(wǎng)絡(luò)子系統(tǒng)效率等功能。各種網(wǎng)絡(luò)驅(qū)動(dòng)程序位于IP層之下,它們具有訪問(wèn)硬件設(shè)備的能力,實(shí)現(xiàn)數(shù)據(jù)鏈路層的功能。網(wǎng)絡(luò)子系統(tǒng)的結(jié)構(gòu)如圖2所示。
3. Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序結(jié)構(gòu)
一個(gè)完整的驅(qū)動(dòng)程序是一組回調(diào)(Callback)函數(shù)的集合。內(nèi)核根據(jù)用戶或自身的需要來(lái)調(diào)用驅(qū)動(dòng)程序提供的函數(shù)指針,將控制或數(shù)據(jù)請(qǐng)求交給相應(yīng)的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序負(fù)責(zé)了解相應(yīng)硬件設(shè)備的訪問(wèn)和控制方式,將內(nèi)核的請(qǐng)求翻譯成設(shè)備可以理解的操作。這樣的層次結(jié)構(gòu)使得內(nèi)核不必了解硬件設(shè)備的訪問(wèn)機(jī)制和細(xì)節(jié),驅(qū)動(dòng)程序也無(wú)需明白內(nèi)核的控制策略,大大提高了驅(qū)動(dòng)程序的兼容性,同時(shí)也方便了程序的調(diào)試。根據(jù)驅(qū)動(dòng)程序類型的不同,內(nèi)核要求驅(qū)動(dòng)程序提供的回調(diào)函數(shù)也不同。
Linux下的Ethernet驅(qū)動(dòng)程序需要注冊(cè)的回調(diào)函數(shù)分為“必要”和“可選”兩類?!氨匾钡幕卣{(diào)函數(shù)是指一個(gè)Ethernet驅(qū)動(dòng)程序正常工作所需要的回調(diào)函數(shù)最小集合,而“可選”的回調(diào)函數(shù)則是在“必要”的基礎(chǔ)上提供更豐富的特性和功能。“必要”的回調(diào)函數(shù)如表1所示。
函數(shù)名稱 | 功能 |
open | 打開(kāi)網(wǎng)絡(luò)接口;將硬件設(shè)備配置為正常工作狀態(tài)。 |
stop | 關(guān)閉網(wǎng)絡(luò)接口;停止硬件設(shè)備工作,釋放打開(kāi)該接口時(shí)分配的系統(tǒng)資源。 |
tx_timeout | 當(dāng)上層協(xié)議認(rèn)為某個(gè)數(shù)據(jù)包發(fā)送超時(shí)的時(shí)候調(diào)用;該函數(shù)應(yīng)該解決數(shù)據(jù)包發(fā)送超時(shí)問(wèn)題,并保證函數(shù)返回以后,數(shù)據(jù)包能夠正常發(fā)送。 |
hard_start_xmit | 由上層協(xié)議在希望發(fā)送數(shù)據(jù)包時(shí)調(diào)用;將來(lái)自上層協(xié)議的數(shù)據(jù)包轉(zhuǎn)換為硬件設(shè)備能夠處理的格式,發(fā)送至硬件設(shè)備。 |
get_stats | 當(dāng)上層希望了解驅(qū)動(dòng)程序控制的網(wǎng)絡(luò)設(shè)備的統(tǒng)計(jì)信息的時(shí)候被調(diào)用。 |
hard_header | 根據(jù)網(wǎng)絡(luò)子系統(tǒng)先前地址解析的結(jié)果,構(gòu)造數(shù)據(jù)包的硬件包頭。 |
rebuild_header | 在ARP解析完成之后,由上層協(xié)議在發(fā)送任何新數(shù)據(jù)包之間調(diào)用,重新構(gòu)造硬件包頭。 |
set_config | 改變網(wǎng)絡(luò)接口的配置,例如中斷號(hào)和I/O地址等。 |
表1
為了方便Ethernet驅(qū)動(dòng)程序的設(shè)計(jì),Linux內(nèi)核為hard_header、rebuild_header和set_config提供了通用的回調(diào)函數(shù)。如果對(duì)硬件包頭或設(shè)備配置沒(méi)有特殊的要求,通用的回調(diào)函數(shù)就能夠滿足網(wǎng)絡(luò)子系統(tǒng)的要求。
4. 基于USB總線的Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序設(shè)計(jì)
4.1 USB設(shè)備的訪問(wèn)和控制
與PCI、ISA等設(shè)備不同,USB、1394等新一代總線沒(méi)有IO/MEM映射、中斷和DMA硬件資源。取而代之的,是抽象出來(lái)的硬件資源概念。對(duì)于USB設(shè)備來(lái)說(shuō),資源主要包括配置(configuration)、接口(interface)和端點(diǎn)(endpoint)。三者之間的關(guān)系如圖3所示。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論