嵌入式Linux網絡驅動程序的開發及實現原理
隨著人們對開放源代碼軟件熱情的日益增高,Linux作為一個功能強大而穩定的開源操作系統,越來越受到成千上萬的計算機專家和愛好者的青睞。在嵌入式領域,通過對Linux進行小型化裁剪后,使其能夠固化在容量只有幾十兆字節的存儲器芯片或單片機中,成為應用于特定場合的嵌入式Linux系統。Linux強大的網絡支持功能實現了對包括TCP/IP在內的多種協議的支持,滿足了面向21世紀的嵌入式系統應用聯網的需求。因此,在嵌入式系統開發調試時,網絡接口幾乎成為不可或缺的模塊。
1 嵌入式Linux網絡驅動程序介紹
Linux網絡驅動程序作為Linux網絡子系統的一部分,位于TCP/IP網絡體系結構的網絡接口層,主要實現上層協議棧與網絡設備的數據交換。Linux的網絡系統主要是基于BSD Unix的套接字(socket)機制,網絡設備與字符設備和塊設備不同,沒有對應地映射到文件系統中的設備節點。
通常,Linux驅動程序有兩種加載方式:一種是靜態地編譯進內核,內核啟動時自動加載;另一種是編寫為內核模塊,使用insmod命令將模塊動態加載到正在運行的內核,不需要時可用rmmod命令將模塊卸載。Linux 2.6內核引入了kbuild機制,將外部內核模塊的編譯同內核源碼樹的編譯統一起來,大大簡化了特定的參數和宏的設置。這樣將編寫好的驅動模塊加入內核源碼樹,只需要修改相應目錄的Kconfig文件,把新的驅動加入內核的配置菜單,然后需要修改相應子目錄中與模塊編譯相關的Kbuild Makefile,即可使新的驅動在內核源碼樹中被編譯。在嵌入式系統驅動開發時,常常將驅動程序編寫為內核模塊,方便開發調試。調試完畢后,就可以將驅動模塊編譯進內核,并重新編譯出支持特定物理設備的Linux內核。
2 嵌入式Linux網絡驅動程序的體系結構和實現原理
2.1 Linux網絡設備驅動的體系結構
如圖1所示,Linux網絡驅動程序的體系結構可劃分為4個層次。Linux內核源代碼中提供了網絡設備接口及以上層次的代碼,因此移植特定網絡硬件的驅動程序的主要工作就是完成設備驅動功能層的相應代碼,根據底層具體的硬件特性,定義網絡設備接口struct net_device類型的結構體變量,并實現其中相應的操作函數及中斷處理程序。
Linux中所有的網絡設備都抽象為一個統一的接口,即網絡設備接口,通過struct net_device類型的結構體變量表示網絡設備在內核中的運行情況,這里既包括回環(loopback)設備,也包括硬件網絡設備接口。內核通過以dev_base

2.2 net_device 數據結構
struct net_device結構體是整個網絡驅動結構的核心,其中定義了很多供網絡協議接口層調用設備的標準方法,該結構在2.6內核源碼樹
2.2.1全局信息及底層硬件信息
name:網絡設備名稱,默認是以太網;
*next:指向全局鏈表下一個設備的指針,驅動程序中不修改;
mem_,rmem_:發送和接收緩沖區的起始,結束位置;
base_addr,irq:網絡設備的I/O基地址,中斷號,ifconfig命令可顯示和修改;
hard_header_len:硬件頭的長度,以太網中值為14;
mtu:最大傳輸單元,以太網中值為1500B;
dev_addr[MAX_ADDR_LEN]:硬件(MAC)地址長度及設備硬件地址,以太網地址長度是48bit,ether_setup會對其進行正確的設置;
評論