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