【正文】
絡(luò)部分采用了面向?qū)ο蟮脑O(shè)計思想,使得Linux內(nèi)核支持多種協(xié)議、多種網(wǎng)卡驅(qū)動程序變得更加的容易,為驅(qū)動的開發(fā)提供了便捷性,減少了工作量,提高了工作效率。Linux的模塊機制使得內(nèi)核保持獨立而又易于擴充。Linux支持多種平臺的虛擬內(nèi)存管理。Linux支持內(nèi)核線程(或稱守護進程)。另外,基于過程的結(jié)構(gòu)也有助于不同的人參與不同過程的開發(fā),從這個角度來說,Linux內(nèi)核又是開放式的結(jié)構(gòu),它允許任何人對其進行修正、改進和完善。作為Unix類操作系統(tǒng),Linux內(nèi)核具有下列基本特征:Linux內(nèi)核的組織形式為整體式結(jié)構(gòu)。Linux系統(tǒng)支持多個進程的并發(fā)運行,每個進程都請求系統(tǒng)資源,比如運算、內(nèi)存、網(wǎng)絡(luò)連接或其他一些資源等。GNU C Library (glibc)也在這里,它提供了連接內(nèi)核的系統(tǒng)調(diào)用接口,還提供了在用戶空間應(yīng)用程序和內(nèi)核之間進行轉(zhuǎn)換的機制。 Linux內(nèi)核簡介在最開始的時候,Linux系統(tǒng)并沒有現(xiàn)在所看到的Linux系統(tǒng)的體積這么龐大,各種免費開放的驅(qū)動代碼也還沒有來得及加入到系統(tǒng)中,所以,之初的Linux實際意義上就是Linux內(nèi)核。 Linux概述Linux操作系統(tǒng)是UNIX操作系統(tǒng)的一種克隆版本,最早是由芬蘭大學(xué)的學(xué)生Linus Torvalds于1991年開始開發(fā)的,并于1991年的10月5日第一次正式向外公布,以后借助于互聯(lián)網(wǎng),經(jīng)過一群遍布于全世界的Internet上的自愿參加的程序員的不懈努力,加上計算機公司的支持,Linux的影響和應(yīng)用日益廣泛,發(fā)展成為目前世界上用戶最多的一種類UNIX操作系統(tǒng)。采用這種構(gòu)成模式易于功能的分割以及程序的調(diào)試,在完成初期工作后,方便設(shè)備驅(qū)動的功能擴展,為后期開發(fā)減少工作。Linux網(wǎng)絡(luò)驅(qū)動程序的體系結(jié)構(gòu)分為四層,從上到下分別為協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動功能層、網(wǎng)絡(luò)設(shè)備以及網(wǎng)絡(luò)媒介層。Linux系統(tǒng)的設(shè)備主要分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種。Linux核心已經(jīng)實現(xiàn)了OSI參考模型的網(wǎng)絡(luò)層及更上層部分。Linux發(fā)行版本是不同的公司或組織將Linux核心、外殼、安裝工具、應(yīng)用軟件有效捆綁起來的結(jié)果,所以種類繁多,各有各的優(yōu)缺點。1994年3月, Linux ,它的出現(xiàn)無異于網(wǎng)絡(luò)的“自由宣言”。1992年1月,大概只有100人開始使用Linux,但他們?yōu)長inux的發(fā)展壯大作出了巨大貢獻。文章在分析了Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動程序的結(jié)構(gòu)組成和工作原理之后,重點探討了Linux環(huán)境下網(wǎng)卡驅(qū)動程序的開發(fā)技術(shù),詳細討論了實用的網(wǎng)卡驅(qū)動的開發(fā)流程及具體實現(xiàn)細節(jié)。作為一個開放源代碼的操作系統(tǒng),它為人們深入了解操作系統(tǒng)的工作原理提供了極好的機會。 network。關(guān)鍵詞:Linux; 模塊; 網(wǎng)絡(luò); 驅(qū)動; 寄存器 AbstractLinux technology is a hotspot among puter technology nowadays, and it developes at high speed not only in our country but also in the whole world, and it has applied widely in embedded system, server, network system, security area and so on. So it makes that grasping the development technology under the Linux environment is more and more noticeable in puter industry. One of the many advantages of free operating systems, as typified by Linux, is that their internals are open for all to view. The Linux kernel remains large and plex body of code. User activities are performed by means of a set of standardized calls that are independent of the specific driver。闡述了該驅(qū)動程序在開發(fā)時的需求分析。Linux內(nèi)核保留有大量的復(fù)雜代碼,通常設(shè)備驅(qū)動提供了一個門路,使硬件特殊的一部分響應(yīng)定義好的內(nèi)部編程接口,它們完全隱藏了設(shè)備工作的細節(jié)。密級: 基于ARM的LINUX網(wǎng)卡驅(qū)動程序的開發(fā)與設(shè)計Development and design of linux network card drivers based on ARM學(xué) 院: 專 業(yè) 班 級: 學(xué) 號:學(xué) 生 姓 名: 指 導(dǎo) 教 師:(教授)2009年6月I 摘 要Linux技術(shù)是當(dāng)前計算機技術(shù)中最大的一個熱點,在我國以及全世界得到了迅猛的發(fā)展,被廣泛的應(yīng)用于嵌入式系統(tǒng)、服務(wù)器、網(wǎng)絡(luò)系統(tǒng)、安全等領(lǐng)域。用戶的活動通過一套標準化來進行,設(shè)備驅(qū)動就是將這些調(diào)用映射到作用于實際硬件和設(shè)備相關(guān)的操作上。第三對Linux環(huán)境下網(wǎng)卡驅(qū)動程序的設(shè)計與實現(xiàn)作了理論上的探討,重點從網(wǎng)卡驅(qū)動模塊的加載、網(wǎng)絡(luò)設(shè)備的初始化、設(shè)備打開與關(guān)閉、數(shù)據(jù)的發(fā)送與接收、信息統(tǒng)計、網(wǎng)卡驅(qū)動模塊的卸載等方面按步驟的進行了詳細的討論。 mapping those calls to devicespecific operations that act on real hardware is then the role of the device driver.This thesis firstly introduces the fundamental knowledge about design of linux device driver, which generally includes the development procedure, kernel, and characteristic of linux. Meanwhile, the categorization of linux device, elemental terminology of exploiting network interface card driver, and loading and unloading the driver module are also mentioned in this thesis. Secondly, this thesis also presents both the hardware and software environment of the driver development, and the requirement specification of driver development are elaborated here. Thirdly, bined with the driver of ARM, this thesis discusses the design and realization of the network interface card driver in theory, especially makes more detailed discussions step by step, such as loading the driver module, initialization of the device, starting and stopping of the device, transmission and receiving of data, information statistics, unloading the driver module, etc. Allocating IP addresses and subnet masks differentiating network and host, through construction of TCP/IP network in Linux. Configuring host39。 driver。Linux作為一個開放源代碼的操作系統(tǒng),具有穩(wěn)定、高效、易裁減和硬件持廣泛等特點,被廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā)領(lǐng)域。 國內(nèi)外研究現(xiàn)狀、目的及意義Linux是由芬蘭的赫爾辛基大學(xué) (Helsinki)學(xué)生Linus Torvalds把Minix 系統(tǒng)向x86移植的結(jié)果。他們對一些不合理的代碼進行了改進,修補了代碼錯誤并上傳補丁。從此Linux用戶迅速增加,Linux的核心開發(fā)小組也日漸強大。但就其總體而言,這些發(fā)行版本具有對盡可能多的網(wǎng)卡的支持。網(wǎng)絡(luò)層的實現(xiàn)依靠于數(shù)據(jù)鏈路層的有效工作。Linux設(shè)備驅(qū)動程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼長度的日益增加,主要就是驅(qū)動程序的增加。設(shè)計網(wǎng)絡(luò)驅(qū)動程序時,最主要的工作就是完成設(shè)備驅(qū)動功能層,使其滿足自己所需要的功能。最后,每個網(wǎng)絡(luò)設(shè)備都聲明了很多能操作它的函數(shù),應(yīng)該熟悉較多的能夠?qū)W(wǎng)絡(luò)接口進行操作的函數(shù),論文深入的研究了Linux下模塊設(shè)計的必要性,并通過編寫這些操作函數(shù)來實現(xiàn)網(wǎng)卡驅(qū)動模塊的加載以及網(wǎng)絡(luò)設(shè)備的初始化、設(shè)備打開與關(guān)閉、數(shù)據(jù)的發(fā)送與接收、信息統(tǒng)計、網(wǎng)卡驅(qū)動模塊的卸載等功能,章節(jié)中對重要函數(shù)都進行了詳細的說明,這些實現(xiàn)了網(wǎng)卡驅(qū)動的基本要求。Linux 目前是計算機技術(shù)的一大熱點之一,最近幾年在我國得到迅猛發(fā)展,被廣泛應(yīng)用在嵌入式系統(tǒng)、安全產(chǎn)品、服務(wù)器和桌面應(yīng)用等領(lǐng)域。首先來分析一下Linux操作系統(tǒng)的體系結(jié)構(gòu),可以從兩個層次上來考慮操作系統(tǒng),如下圖 21所示:圖21 GNU/Linux操作系統(tǒng)的基本體系結(jié)構(gòu)圖最上面是用戶(或應(yīng)用程序)空間。這點非常重要,因為內(nèi)核和用戶空間的應(yīng)用程序使用的是不同的保護地址空間,每個用戶空間的進程都使用自己的虛擬地址空間,而內(nèi)核則占用單獨的地址空間。內(nèi)核負責(zé)處理所有這些請求,根據(jù)內(nèi)核完成任務(wù)的不同,可以將內(nèi)核劃分成如下圖22的功能模塊:圖22 Linux系統(tǒng)模塊及功能圖 Linux的特性Linux是個人計算機和工作站上的Unix類操作系統(tǒng),但是,它絕不僅僅是簡化的Unix系統(tǒng)。整個Linux內(nèi)核由很多過程組成,每個過程可以獨立編譯,然后用連接程序?qū)⑵溥B接在一起成為一個完整的目標程序。Linux的進程調(diào)度方式簡單而有效。內(nèi)核線程是在后臺運行而又與終端或登錄shell結(jié)合在一起的進程。內(nèi)存管理是和硬件平臺密切相關(guān)的部分,為了支持不同的硬件平臺而又保證虛擬存儲管理技術(shù)的通用性,Linux的虛擬內(nèi)存管理為不同的硬件平臺提供了統(tǒng)一的接口,因此把Linux內(nèi)核移植到一個新的硬件平臺并不是一件很困難的事。模塊機制可以使內(nèi)核很容易地增加一個新的模塊(如一個新的設(shè)備驅(qū)動程序),而無需重新編譯內(nèi)核;同時,模塊機制還可以把一個模塊按需添加到內(nèi)核或從內(nèi)核中卸下,這使得我們可以按需要定制自己的內(nèi)核。 Linux設(shè)備驅(qū)動程序概述驅(qū)動程序在 Linux內(nèi)核里扮演著特殊的角色。 這個編程接口能夠使得驅(qū)動程序獨立于內(nèi)核的其他部分而建立,必要的情況下可在系統(tǒng)運行時“插入”到內(nèi)核。device),塊設(shè)備(block字符終端(/dev/console)和串口(/dev/ttys0以及類似設(shè)備)就是兩個字符設(shè)備,他們能夠良好的說明“流”這種抽象概念。例如,幀抓取器就是這樣一個設(shè)備,應(yīng)用程序可以用mmap或lseek訪問抓取的整個圖象。在內(nèi)核中,和字符驅(qū)動程序相比,塊驅(qū)動程序具有完全不同的接口,但這些不同對上層用戶來說是完全透明的。許多網(wǎng)絡(luò)連接是面向流的,但網(wǎng)絡(luò)設(shè)備卻圍繞數(shù)據(jù)包的傳輸和接收而設(shè)計。內(nèi)核和網(wǎng)絡(luò)設(shè)備驅(qū)動程序間的通信,完全不同于內(nèi)核和字符設(shè)備以及塊驅(qū)動程序之間的通信,內(nèi)核調(diào)用一套和數(shù)據(jù)傳輸相關(guān)的函數(shù)而不是read、write等。這里,操作系統(tǒng)必須要提供兩個機制,一個是找到驅(qū)動程序的發(fā)送函數(shù),一個是驅(qū)動程序把收到的數(shù)據(jù)送給系統(tǒng)。一般是把一個中斷處理程序注冊到系統(tǒng)中去,操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動程序的處理程序。在網(wǎng)絡(luò)驅(qū)動程序中,如果硬件沒有中斷功能,定時器可以提供輪詢(poll)方式對硬件進行存取,或者是實現(xiàn)某些協(xié)議時需要的超時重傳等。 Linux下網(wǎng)卡驅(qū)動程序設(shè)計的數(shù)據(jù)結(jié)構(gòu)和基本方法網(wǎng)絡(luò)驅(qū)動程序能夠完成數(shù)據(jù)的接收和傳輸,依靠的是網(wǎng)絡(luò)驅(qū)動程序的數(shù)據(jù)結(jié)構(gòu)以及其對該數(shù)據(jù)結(jié)構(gòu)進行操作的設(shè)備方法。如果名稱由驅(qū)動程序設(shè)置,會包含一個%d格式串, register_netdev 將用一個數(shù)字來替換它,使它成為一個唯一的名子,分配的編號從0開始。struct net_device *next;指向全局列表中下一個設(shè)備的指針。大部分現(xiàn)代的網(wǎng)絡(luò)驅(qū)動程序不再使用這個函數(shù)了,相反,它們是在注冊接口前完成初始化工作的。這些成員保存了設(shè)備使用的共享內(nèi)存的開始地址和結(jié)束地址。unsigned long base_addr;網(wǎng)絡(luò)接口的I/O基地址。這個成員和內(nèi)存成員一樣,內(nèi)核不使用它們。unsigned char if_port;指定在多端口設(shè)備中使用哪個端口。這個成員只對某些外設(shè)總線有意義,例如 ISA。一些非以太網(wǎng)接口可以使用類似ether_setup的輔助函數(shù)。void hippi_setup(struct net_device *dev);初始化高性能并行接口(HIPPI)的高速互連驅(qū)動的成員。硬件頭部長度,即數(shù)據(jù)包中位于IP頭、或者其他協(xié)議信息之前的octet數(shù)目。以太網(wǎng)的MTU是1500octet (ETH_DATA_LEN)。unsigned short type;接口的硬件類型.。unsigned char addr_len;u