【正文】
密級(jí): 基于ARM的LINUX網(wǎng)卡驅(qū)動(dòng)程序的開(kāi)發(fā)與設(shè)計(jì)Development and design of linux network card drivers based on ARM學(xué) 院: 專 業(yè) 班 級(jí): 學(xué) 號(hào):學(xué) 生 姓 名: 指 導(dǎo) 教 師:(教授)2009年6月I 摘 要Linux技術(shù)是當(dāng)前計(jì)算機(jī)技術(shù)中最大的一個(gè)熱點(diǎn),在我國(guó)以及全世界得到了迅猛的發(fā)展,被廣泛的應(yīng)用于嵌入式系統(tǒng)、服務(wù)器、網(wǎng)絡(luò)系統(tǒng)、安全等領(lǐng)域。從而使得掌握在Linux環(huán)境下的開(kāi)發(fā)技術(shù),成為了計(jì)算機(jī)行業(yè)中引人注目的焦點(diǎn)。以Linux為代表的自由操作系統(tǒng)的優(yōu)點(diǎn)之一,是它們的內(nèi)部是開(kāi)放的。Linux內(nèi)核保留有大量的復(fù)雜代碼,通常設(shè)備驅(qū)動(dòng)提供了一個(gè)門(mén)路,使硬件特殊的一部分響應(yīng)定義好的內(nèi)部編程接口,它們完全隱藏了設(shè)備工作的細(xì)節(jié)。用戶的活動(dòng)通過(guò)一套標(biāo)準(zhǔn)化來(lái)進(jìn)行,設(shè)備驅(qū)動(dòng)就是將這些調(diào)用映射到作用于實(shí)際硬件和設(shè)備相關(guān)的操作上。論文首先介紹了Linux下設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的基本知識(shí),其中包括對(duì)Linux的發(fā)展歷程、內(nèi)核、特性的概述,Linux設(shè)備的分類及編寫(xiě)驅(qū)動(dòng)程序的一些基本概念等,以及模塊的加載和卸載。其次介紹了ARM驅(qū)動(dòng)程序開(kāi)發(fā)的硬件環(huán)境和軟件環(huán)境。闡述了該驅(qū)動(dòng)程序在開(kāi)發(fā)時(shí)的需求分析。第三對(duì)Linux環(huán)境下網(wǎng)卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)作了理論上的探討,重點(diǎn)從網(wǎng)卡驅(qū)動(dòng)模塊的加載、網(wǎng)絡(luò)設(shè)備的初始化、設(shè)備打開(kāi)與關(guān)閉、數(shù)據(jù)的發(fā)送與接收、信息統(tǒng)計(jì)、網(wǎng)卡驅(qū)動(dòng)模塊的卸載等方面按步驟的進(jìn)行了詳細(xì)的討論。通過(guò)組建在Linux操作系統(tǒng)下的TCP/IP網(wǎng)絡(luò),來(lái)分配IP地址以及區(qū)分網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的子網(wǎng)掩碼,通過(guò)配置DHCP服務(wù)器,實(shí)現(xiàn)動(dòng)態(tài)地為主機(jī)配置IP參數(shù),解決手工配置存在的問(wèn)題。最后介紹了在驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)計(jì)過(guò)程中所遇到的問(wèn)題和困難以及是如何去克服這些困難的,并提出了今后的努力方向。關(guān)鍵詞:Linux; 模塊; 網(wǎng)絡(luò); 驅(qū)動(dòng); 寄存器 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。 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。s IP arguments dynamically to well solve the problem of manual configuration, through configuration of DHCP server. Finally, this thesis lists all the problems and difficulties met during the whole process of designing driver, and how to conquer them and advanced direction of future study are also recounted.Keywords: linux。 module。 network。 driver。 registerIII 目 錄摘 要 IAbstract II第1章 緒論 1 研究背景 1 國(guó)內(nèi)外研究現(xiàn)狀、目的及意義 1 本文主要工作 2第2章 Linux下設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的基本知識(shí) 4 Linux概述 4 Linux內(nèi)核簡(jiǎn)介 4 Linux的特性 6 Linux設(shè)備驅(qū)動(dòng)程序概述 7 Linux設(shè)備驅(qū)動(dòng)程序分類 8 編寫(xiě)網(wǎng)絡(luò)驅(qū)動(dòng)程序的一些基本概念 9第3章 Linux網(wǎng)卡驅(qū)動(dòng)程序設(shè)計(jì)的理論探討 10 Linux下網(wǎng)卡驅(qū)動(dòng)程序設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和基本方法 10 網(wǎng)卡驅(qū)動(dòng)程序設(shè)計(jì)要用到的數(shù)據(jù)結(jié)構(gòu) 10 網(wǎng)卡驅(qū)動(dòng)程序的基本方法 13 套接字緩沖區(qū)介紹 14 驅(qū)動(dòng)模塊的加載和卸載 17第4章 系統(tǒng)分析 19 S3C2410 ARM 開(kāi)發(fā)板介紹 19 需求分析以及MII接口 19 寄存器的訪問(wèn)方式 21第5章 網(wǎng)卡驅(qū)動(dòng)的具體實(shí)現(xiàn) 22 驅(qū)動(dòng)程序的設(shè)計(jì) 22 網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn) 24 模塊的加載及設(shè)備初始化 24 設(shè)備成員及函數(shù)的初始化 26 設(shè)備注冊(cè)、打開(kāi)、關(guān)閉 30 數(shù)據(jù)的接受和發(fā)送 32 參數(shù)設(shè)置及數(shù)據(jù)統(tǒng)計(jì) 34 網(wǎng)卡數(shù)據(jù)信息統(tǒng)計(jì) 36第6章 結(jié)論 37參 考 文 獻(xiàn) 38致 謝 3939沈陽(yáng)工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)第1章 緒論 研究背景Linux目前是計(jì)算機(jī)技術(shù)的一大熱點(diǎn),最近幾年在我國(guó)得到迅猛發(fā)展,被廣泛應(yīng)用在嵌入式系統(tǒng)、服務(wù)器和桌面應(yīng)用等領(lǐng)域。Linux操作系統(tǒng)是UNIX操作系統(tǒng)的一種克隆版本,是目前世界上用戶最多的一種類UNIX操作系統(tǒng)。作為一個(gè)開(kāi)放源代碼的操作系統(tǒng),它為人們深入了解操作系統(tǒng)的工作原理提供了極好的機(jī)會(huì)。Linux作為一個(gè)開(kāi)放源代碼的操作系統(tǒng),具有穩(wěn)定、高效、易裁減和硬件持廣泛等特點(diǎn),被廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)領(lǐng)域。在Linux系統(tǒng)下設(shè)計(jì)驅(qū)動(dòng)程序簡(jiǎn)潔、操作方便、功能強(qiáng)大,但是支持的函數(shù)卻較少,只有一些來(lái)源于內(nèi)核Kernel中的函數(shù)。因此,在嵌入式Linux系統(tǒng)開(kāi)發(fā)應(yīng)用時(shí),需要開(kāi)發(fā)自己專用的網(wǎng)絡(luò)接口卡,這時(shí)不僅要在硬件上保證與Linux的兼容性,而且在軟件上需要開(kāi)發(fā)全新的驅(qū)動(dòng)程序。文章在分析了Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu)組成和工作原理之后,重點(diǎn)探討了Linux環(huán)境下網(wǎng)卡驅(qū)動(dòng)程序的開(kāi)發(fā)技術(shù),詳細(xì)討論了實(shí)用的網(wǎng)卡驅(qū)動(dòng)的開(kāi)發(fā)流程及具體實(shí)現(xiàn)細(xì)節(jié)。 國(guó)內(nèi)外研究現(xiàn)狀、目的及意義Linux是由芬蘭的赫爾辛基大學(xué) (Helsinki)學(xué)生Linus Torvalds把Minix 系統(tǒng)向x86移植的結(jié)果。當(dāng)時(shí) Linus 手邊有個(gè) Minix 系統(tǒng)(UNIX 的一個(gè)分支),他對(duì)這個(gè)操作系統(tǒng)相當(dāng)有興趣,由于當(dāng)時(shí)他正好有一臺(tái)個(gè)人計(jì)算機(jī),他想把這個(gè)系統(tǒng)移植到該計(jì)算機(jī)(x86 架構(gòu))上來(lái)使用。由于受益于Stallman提倡的開(kāi)放源代碼(Open Source)思想,他得以接觸到UNIX操作系統(tǒng)的一些源代碼,并仔細(xì)研讀了UNIX 的核心,然后去除較為繁復(fù)的核心程序,將它改寫(xiě)成能夠適用于一般個(gè)人計(jì)算機(jī)的一種操作系統(tǒng),即Linux系統(tǒng)的雛形。1992年1月,大概只有100人開(kāi)始使用Linux,但他們?yōu)長(zhǎng)inux的發(fā)展壯大作出了巨大貢獻(xiàn)。他們對(duì)一些不合理的代碼進(jìn)行了改進(jìn),修補(bǔ)了代碼錯(cuò)誤并上傳補(bǔ)丁。Linux的騰飛最關(guān)鍵的因素是獲得了自由軟件基金(FSF)的支持,他們制定了一個(gè)GNU計(jì)劃,該計(jì)劃的目標(biāo)就是要編寫(xiě)一個(gè)完全免費(fèi)的 UNIX版本—— 包括內(nèi)核及所有相關(guān)的組件,可以讓用戶自由共享并且改寫(xiě)軟件,而Linux正好符合他們的意愿。他們將Linux與其現(xiàn)有的GNU應(yīng)用軟件很好地結(jié)合起來(lái),使Linux擁有了圖形用戶界面。1994年3月, Linux ,它的出現(xiàn)無(wú)異于網(wǎng)絡(luò)的“自由宣言”。從此Linux用戶迅速增加,Linux的核心開(kāi)發(fā)小組也日漸強(qiáng)大。在Linux所包含的數(shù)千個(gè)文件中,有一個(gè)名為Credits的文件,里面列出了100多名對(duì)Linux有過(guò)重要貢獻(xiàn)的黑客,包括他們的名字、地址以及所做的工作。目前國(guó)內(nèi)外所使用的Linux系統(tǒng)一般是指由Linux核心、外殼(SHELL)及外圍應(yīng)用軟件構(gòu)成的發(fā)行版本。Linux發(fā)行版本是不同的公司或組織將Linux核心、外殼、安裝工具、應(yīng)用軟件有效捆綁起來(lái)的結(jié)果,所以種類繁多,各有各的優(yōu)缺點(diǎn)。但就其總體而言,這些發(fā)行版本具有對(duì)盡可能多的網(wǎng)卡的支持。就象UNIX,Linux支持的網(wǎng)卡主要是以太網(wǎng)卡。如3COM、ACCTON、AT&T、IBM、CRYSTAL、D-LINK等眾多品牌的以太網(wǎng)卡只要安裝配置正確,都可以得到你所期望的效果。Linux核心已經(jīng)實(shí)現(xiàn)了OSI參考模型的網(wǎng)絡(luò)層及更上層部分。網(wǎng)絡(luò)層的實(shí)現(xiàn)依靠于數(shù)據(jù)鏈路層的有效工作。網(wǎng)卡的驅(qū)動(dòng)程序就是數(shù)據(jù)鏈路層與物理層的接口。通過(guò)調(diào)用驅(qū)動(dòng)程序的發(fā)送例程向物理端口發(fā)送數(shù)據(jù),調(diào)用驅(qū)動(dòng)程序的接收例程從物理端口接收數(shù)據(jù)。Linux系統(tǒng)的設(shè)備主要分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種。Linux設(shè)備驅(qū)動(dòng)程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼長(zhǎng)度的日益增加,主要就是驅(qū)動(dòng)程序的增加。Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序是Linux 操作系統(tǒng)內(nèi)核的一個(gè)重要組成部分,對(duì)Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的原理與設(shè)計(jì)技術(shù)的掌握,有助于理解網(wǎng)絡(luò)鏈路層的工作原理,它對(duì)從事基于Linux平臺(tái)的網(wǎng)絡(luò)產(chǎn)品開(kāi)發(fā)具有十分重要的意義。 本文主要工作首先,論文將重點(diǎn)研究device數(shù)據(jù)結(jié)構(gòu),這是了解網(wǎng)卡設(shè)備的最好入口點(diǎn)。Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的體系結(jié)構(gòu)分為四層,從上到下分別為協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動(dòng)功能層、網(wǎng)絡(luò)設(shè)備以及網(wǎng)絡(luò)媒介層。設(shè)計(jì)網(wǎng)絡(luò)驅(qū)動(dòng)程序時(shí),最主要的工作就是完成設(shè)備驅(qū)動(dòng)功能層,使其滿足自己所需要的功能。在Linux中,把所有的網(wǎng)絡(luò)設(shè)備都抽象為一個(gè)接口,這個(gè)接口提供了對(duì)所有網(wǎng)絡(luò)設(shè)備的操作集合,由struct device數(shù)據(jù)結(jié)構(gòu)來(lái)表示,即網(wǎng)絡(luò)設(shè)備接口,所有的網(wǎng)絡(luò)設(shè)備接口構(gòu)成一個(gè)鏈表,該鏈表由dev_base為頭指針,鏈表中的元素代表一個(gè)網(wǎng)絡(luò)設(shè)備接口。其次,論文從整體上對(duì)驅(qū)動(dòng)程序進(jìn)行了分塊設(shè)計(jì),主要由模塊加載、網(wǎng)絡(luò)設(shè)備初始化、注冊(cè)、設(shè)備打開(kāi)與關(guān)閉、數(shù)據(jù)的發(fā)送與接收等模塊構(gòu)成。采用這種構(gòu)成模式易于功能的分割以及程序的調(diào)試,在完成初期工作后,方便設(shè)備驅(qū)動(dòng)的功能擴(kuò)展,為后期開(kāi)發(fā)減少工作。最后,每個(gè)網(wǎng)絡(luò)設(shè)備都聲明了很多能操作它的函數(shù),應(yīng)該熟悉較多的能夠?qū)W(wǎng)絡(luò)接口進(jìn)行操作的函數(shù),論文深入的研究了Linux下模塊設(shè)計(jì)的必要性,并通過(guò)編寫(xiě)這些操作函數(shù)來(lái)實(shí)現(xiàn)網(wǎng)卡驅(qū)動(dòng)模塊的加載以及網(wǎng)絡(luò)設(shè)備的初始化、設(shè)備打開(kāi)與關(guān)閉、數(shù)據(jù)的發(fā)送與接收、信息統(tǒng)計(jì)、網(wǎng)卡驅(qū)動(dòng)模塊的卸載等功能,章節(jié)中對(duì)重要函數(shù)都進(jìn)行了詳細(xì)的說(shuō)明,這些實(shí)現(xiàn)了