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