前言:我們精心挑選了數(shù)篇優(yōu)質(zhì)操作系統(tǒng)論文文章,供您閱讀參考。期待這些文章能為您帶來(lái)啟發(fā),助您在寫作的道路上更上一層樓。
關(guān)鍵字組件重用操作系統(tǒng)OSKit
1引言
當(dāng)前,操作系統(tǒng)的功能不斷擴(kuò)展,操作系統(tǒng)的類型呈現(xiàn)出多樣化的趨勢(shì)。一個(gè)小規(guī)模的開(kāi)發(fā)小組已經(jīng)不可能完全從頭開(kāi)始實(shí)現(xiàn)一個(gè)實(shí)用的操作系統(tǒng),而一般情況下,研究人員只對(duì)操作系統(tǒng)的一些特定領(lǐng)域感興趣,而對(duì)于另外一些元素,如啟動(dòng)加載代碼、核心啟動(dòng)代碼、設(shè)備驅(qū)動(dòng)程序和內(nèi)存分配代碼等往往不感興趣,但是一個(gè)可運(yùn)行的原型系統(tǒng)又必須包含這些內(nèi)容。編寫這些基礎(chǔ)結(jié)構(gòu)延緩了操作系統(tǒng)研究項(xiàng)目的進(jìn)度,同時(shí)也增加了進(jìn)行操作系統(tǒng)研究的代價(jià)。為了解決這一問(wèn)題,猶他大學(xué)的FLUX研究小組開(kāi)發(fā)了OSKit,它提供了一個(gè)框架和一組模塊化的、具有簡(jiǎn)單接口的庫(kù)以及一組清晰的、可重用的OS組件。OSKit可以用來(lái)構(gòu)建操作系統(tǒng)內(nèi)核、外層服務(wù)和其他核心OS功能模塊。OSKit提供了各種功能模塊,諸如簡(jiǎn)單自舉,一個(gè)可用于內(nèi)核的最小化POSIX環(huán)境、與物理內(nèi)存和其約束一致的內(nèi)存管理、廣泛的調(diào)試支持,以及高層子系統(tǒng)如協(xié)議棧和文件系統(tǒng)。開(kāi)發(fā)者可以根據(jù)自己的研究興趣或所要考慮的性能來(lái)使用這些模塊,或用他們自己的模塊來(lái)替代標(biāo)準(zhǔn)的OSKit模塊。
OSKit公開(kāi)了它內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),允許用戶從成熟的操作系統(tǒng)中不加修改地提取代碼,然后通過(guò)一小部分經(jīng)過(guò)仔細(xì)設(shè)計(jì)的粘接代碼將它們合并到一起,隔離它們的依賴性,并輸出良好定義的接口。OSKit使用這一技術(shù)整合了許多穩(wěn)定而成熟的源代碼,包括設(shè)備驅(qū)動(dòng)、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議等等。實(shí)踐表明,使用組件軟件架構(gòu)和重用技術(shù)會(huì)給操作系統(tǒng)實(shí)現(xiàn)領(lǐng)域帶來(lái)大的影響。
2組件技術(shù)簡(jiǎn)介
組件技術(shù)是一種較新的軟件開(kāi)發(fā)技術(shù)。到目前為止,還難以確定組件技術(shù)的明確定義。比如,對(duì)組件技術(shù)的常見(jiàn)說(shuō)法有以下這些:“二進(jìn)制軟件單元”、“任意場(chǎng)合可部署的軟件”、“特別適合第三方開(kāi)發(fā)”和“規(guī)范定義的接口”等等。大致上可以這樣理解:所謂組件,其實(shí)就是一種可部署軟件的代碼包,其中包括某些可執(zhí)行模塊。組件單獨(dú)開(kāi)發(fā)并作為軟件單元使用,它具有明確的接口,軟件就是通過(guò)這些接口調(diào)用組件所能提供的服務(wù),多種組件可以聯(lián)合起來(lái)構(gòu)成更大型的組件乃至直接建立整個(gè)系統(tǒng)。組件的實(shí)現(xiàn)必須支持一種或者多種其用戶所希望獲得的接口。實(shí)現(xiàn)組件并不一定需要采用面向?qū)ο笳Z(yǔ)言。為了構(gòu)造新應(yīng)用程序,軟件開(kāi)發(fā)人員找出適當(dāng)?shù)慕M件,將這些組件加入到正在開(kāi)發(fā)中的應(yīng)用程序,同時(shí)對(duì)應(yīng)用程序進(jìn)行測(cè)試并保證應(yīng)用程序的組裝工作按照預(yù)定的規(guī)劃正常進(jìn)行。采用組件技術(shù)能降低開(kāi)發(fā)、測(cè)試和維護(hù)成本,提高可靠性和穩(wěn)定性。
3Oskit組件綜述
OSKIT的組件庫(kù)提供了一般情況下更高層的功能,它通常只對(duì)外開(kāi)放一些相關(guān)的公用調(diào)用接口。目標(biāo)系統(tǒng)通過(guò)OSKit的面向?qū)ο蟮腃OM接口來(lái)與這些組件進(jìn)行交互。以下幾節(jié)概述了OSKit所提供的組件。
3.1引導(dǎo)程序
大多數(shù)操作系統(tǒng)多有自身的啟動(dòng)加載機(jī)制,彼此互不兼容。這種加載機(jī)制的多樣性并不是由于每個(gè)OS所要求的自舉服務(wù)不同而引起,而是由于構(gòu)建啟動(dòng)加載器的特定方式造成的。因?yàn)閺牟僮飨到y(tǒng)研究的立場(chǎng)來(lái)看,啟動(dòng)加載器是一個(gè)令人不敢興趣的領(lǐng)域,因此OS開(kāi)發(fā)者通常進(jìn)行一個(gè)最小化、快捷的設(shè)計(jì)。由于設(shè)計(jì)理念和要求的輕微差別,每個(gè)啟動(dòng)加載器都不適用于下一個(gè)OS。為了解決這個(gè)問(wèn)題,OSKit直接支持多啟動(dòng)標(biāo)準(zhǔn),這一標(biāo)準(zhǔn)是由幾個(gè)OS項(xiàng)目的成員共同設(shè)計(jì)的,它的目的是提供一個(gè)簡(jiǎn)單而通用的啟動(dòng)加載器與OS內(nèi)核間的接口,從而允許一個(gè)啟動(dòng)加載器加載任何兼容的OS。
在進(jìn)行操作系統(tǒng)研究時(shí),多啟動(dòng)標(biāo)準(zhǔn)非常有用,這其中的主要原因是啟動(dòng)加載器在加載內(nèi)核自身的同時(shí)還具有加載附加文件或者啟動(dòng)模塊的能力。這里的一個(gè)啟動(dòng)模塊只是一個(gè)普通文件,啟動(dòng)加載器不以任何方式解釋它,而僅僅把它隨同內(nèi)核映像一起加載到保留物理內(nèi)存塊中。在啟動(dòng)內(nèi)核時(shí),啟動(dòng)加載器提供給內(nèi)核以下內(nèi)容:物理地址的列表、所有已加載的啟動(dòng)模塊的大小,以及與每個(gè)模塊相聯(lián)系的由用戶定義的字符串。這些啟動(dòng)模塊和與它們相聯(lián)系的用戶定義的字符串由內(nèi)核解釋。這樣做的目的是為了通過(guò)提供內(nèi)核啟動(dòng)時(shí)需要的數(shù)據(jù),諸如初始化程序、設(shè)備驅(qū)動(dòng)和文件系統(tǒng)服務(wù)器,來(lái)減輕內(nèi)核啟動(dòng)的負(fù)擔(dān)。
3.2核心支持庫(kù)
OSKit核心支持庫(kù)的主要用途是讓客戶OS更容易訪問(wèn)硬件設(shè)施。它包含了一個(gè)較大的實(shí)用函數(shù)和符號(hào)定義的集合,該集合對(duì)于管理模式代碼是非常具體的。與此相對(duì)應(yīng),OSKit的大多數(shù)其他庫(kù)在用戶模式代碼中通常很有用。和OSKit的其余部分所不同的是,多數(shù)核心支持代碼必須是針對(duì)特定系統(tǒng)結(jié)構(gòu)的,而這些特定機(jī)器的細(xì)節(jié)對(duì)客戶OS也是有用的。例如,在x86機(jī)器上,核心支持庫(kù)包含一些函數(shù),用來(lái)創(chuàng)建和操縱x86頁(yè)表和段寄存器。其他OSKit組件通常提供建立在這些低層機(jī)制上的與體系結(jié)構(gòu)無(wú)關(guān)的設(shè)施,但是為了提供最大的靈活性,與特定結(jié)構(gòu)相關(guān)的接口始終可以被訪問(wèn)。
OSKit核心支持庫(kù)在x86體系結(jié)構(gòu)上尤為重要,因?yàn)樵擉w系結(jié)構(gòu)的OS級(jí)編程環(huán)境特別復(fù)雜和模糊。核心支持庫(kù)仔細(xì)地設(shè)置了一個(gè)基本的32位執(zhí)行環(huán)境(為了與MS-DOS兼容,x86處理器通常以16位模式開(kāi)始),初始化段和頁(yè)轉(zhuǎn)換表,安裝一個(gè)中斷向量表,并提供缺省的陷阱和中斷處理程序。當(dāng)然,客戶OS能夠修改或重載這些行為。然而,在缺省情況下,核心支持庫(kù)自動(dòng)地做所有必要的工作,以便使處理器進(jìn)入一個(gè)方便的執(zhí)行環(huán)境,此時(shí)中斷、陷阱、調(diào)試以及其他標(biāo)準(zhǔn)設(shè)施已經(jīng)如預(yù)期的那樣開(kāi)始工作。該庫(kù)在缺省情況下自動(dòng)地定位所有隨內(nèi)核加載的啟動(dòng)模塊,并保留它們所在的物理內(nèi)存。接下來(lái),應(yīng)用程序可以很容易使用它們。客戶OS只需以標(biāo)準(zhǔn)C語(yǔ)言風(fēng)格提供一個(gè)main()函數(shù)。一切都設(shè)置好以后,內(nèi)核支持庫(kù)將用所有參數(shù)和由啟動(dòng)加載器傳遞過(guò)來(lái)的環(huán)境變量來(lái)調(diào)用它。
3.3內(nèi)存管理庫(kù)
如同在一個(gè)標(biāo)準(zhǔn)C語(yǔ)言庫(kù)中實(shí)現(xiàn)的malloc()一樣,內(nèi)存管理代碼典型地用于用戶空間。通常并不適用于內(nèi)核。設(shè)備驅(qū)動(dòng)常常需要分配特定類型的內(nèi)存,并伴隨具體的調(diào)整屬性。例如,對(duì)于內(nèi)建的DMA控制器只能訪問(wèn)最初的16M物理內(nèi)存。為解決這些內(nèi)存管理問(wèn)題,OSKit包含了兩個(gè)簡(jiǎn)單而靈活的內(nèi)存管理庫(kù):(1)基于隊(duì)列的內(nèi)存管理器(或稱LMM),它提供了功能強(qiáng)大且高效的原語(yǔ)來(lái)進(jìn)行分配管理,并支持在一個(gè)池中管理多種類型的內(nèi)存。(2)地址映射管理器(或稱AMM)被設(shè)計(jì)用來(lái)管理不必直接映射到物理內(nèi)存或虛擬內(nèi)存的地址空間,它對(duì)OS的其他方面提供了類似的支持,諸如進(jìn)程地址空間、分頁(yè)、空閑塊或IPC名字空間的管理。盡管這些庫(kù)可以很容易地應(yīng)用在用戶空間,但實(shí)際上它們是被特別設(shè)計(jì)用來(lái)滿足OS內(nèi)核的需求。超級(jí)秘書網(wǎng)
3.4最小C語(yǔ)言庫(kù)
成熟的OS內(nèi)核一般都包含著相當(dāng)數(shù)量的僅僅用來(lái)重新實(shí)現(xiàn)基本的C語(yǔ)言庫(kù)函數(shù)如printf()和malloc()的代碼。與此形成對(duì)比的是,OSKit提供了一個(gè)最小化C語(yǔ)言函數(shù)庫(kù),它圍繞著最小化依賴性而不是最大化函數(shù)性和性能的原則來(lái)設(shè)計(jì)。
3.5調(diào)試支持
OSKit的一個(gè)最實(shí)用的好處是:給定一個(gè)適當(dāng)?shù)挠布O(shè)置,它立刻就能提供給OS開(kāi)發(fā)者一個(gè)完全源代碼級(jí)的內(nèi)核調(diào)試環(huán)境。OSKit內(nèi)核支持庫(kù)包括一個(gè)可用于GNU調(diào)試器(GDB)的串行存根模塊,它在客戶OS環(huán)境中處理陷阱,并使用GDB的標(biāo)準(zhǔn)遠(yuǎn)程調(diào)試協(xié)議通過(guò)一個(gè)串行程序與運(yùn)行在另一臺(tái)機(jī)器上的GDB通信。甚至當(dāng)客戶機(jī)OS執(zhí)行自己的陷阱處理時(shí),OSKit的GDB存根模塊也是可用的。如果客戶OS提供適當(dāng)?shù)你^子,它甚至支持多線程調(diào)試。除了基本的調(diào)試器支持,OSKit也提供了一個(gè)內(nèi)存分配調(diào)試庫(kù),它可以跟蹤內(nèi)存分配并檢測(cè)一般的錯(cuò)誤,如緩沖區(qū)溢出和釋放已釋放的內(nèi)存。這個(gè)庫(kù)提供了與許多普通應(yīng)用程序調(diào)試器相似的功能性,所不同的是它運(yùn)行在由OSKit提供的最小內(nèi)核環(huán)境中
3.6設(shè)備驅(qū)動(dòng)支持
在OS開(kāi)發(fā)和維護(hù)中最艱巨的一個(gè)任務(wù)是支持多種多樣的I/O硬件。這些復(fù)雜的設(shè)備常會(huì)含有潛在的錯(cuò)誤,而新硬件的又常常伴隨著不兼容的軟件接口。由于這些原因,OSKit采用了為現(xiàn)有內(nèi)核開(kāi)發(fā)的穩(wěn)定的、經(jīng)過(guò)充分測(cè)試的驅(qū)動(dòng)程序。OSKit使用了一種封裝技術(shù),將現(xiàn)有的驅(qū)動(dòng)程序代碼基本上未加修改地合并到OSKit中。這些現(xiàn)有的驅(qū)動(dòng)程序被一個(gè)OSKit粘結(jié)代碼層所包裝,從而使得這些驅(qū)動(dòng)程序可以在與開(kāi)發(fā)它們的環(huán)境完全不同的環(huán)境中工作。目前,來(lái)自Linux的大多數(shù)以太網(wǎng)卡、SCSI和IDE磁盤的設(shè)備驅(qū)動(dòng)程序被包括進(jìn)來(lái),總數(shù)超過(guò)了五十種。用同樣的方式,來(lái)自FreeBSD的八個(gè)字符設(shè)備驅(qū)動(dòng)程序也被包含了進(jìn)來(lái),它們支持標(biāo)準(zhǔn)PC控制臺(tái)和串口及不同的多串口板。由于OSKit把這些驅(qū)動(dòng)仔細(xì)地進(jìn)行了包裝,F(xiàn)reeBSD驅(qū)動(dòng)程序可以與Linux驅(qū)動(dòng)程序一起工作。
3.7協(xié)議棧
OSKit提供了一個(gè)完整的TCP/IP網(wǎng)絡(luò)協(xié)議棧。如同驅(qū)動(dòng)程序一樣,有關(guān)網(wǎng)絡(luò)的代碼也可以通過(guò)封裝機(jī)制被合并進(jìn)來(lái)。OSKit當(dāng)前可以從Linux中獲取網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序,它們是PC平臺(tái)可獲得的最大的免費(fèi)資源。OSKit的網(wǎng)絡(luò)組件繼承于FreeBSD4.4,它通常被認(rèn)為具有更多成熟的網(wǎng)絡(luò)協(xié)議。這顯示了使用封裝機(jī)制將現(xiàn)有軟件包裝成靈活的組件的第二個(gè)優(yōu)點(diǎn):即從不同的資源中獲取最好的組件,并讓它們一起被使用。
3.8文件系統(tǒng)
通過(guò)使用封裝技術(shù),OSKit吸收了NetBSD的基于磁盤的文件系統(tǒng)代碼。NetBSD之所以被選擇為首要資源庫(kù),是因?yàn)樵诳捎玫南到y(tǒng)中,它的文件系統(tǒng)代碼被最清晰地分離了出來(lái),而FreeBSD和Linux的文件系統(tǒng)與它們的虛擬內(nèi)存系統(tǒng)結(jié)合的更緊密。當(dāng)前,OSKit也把Linux文件系統(tǒng)合并了進(jìn)來(lái),以便能夠支持多種類型的文件系統(tǒng)格式,如Windows95、OS/2和SystemV的文件系統(tǒng)格式等等。
OSKit文件系統(tǒng)輸出的COM接口類似于許多Unix文件系統(tǒng)所使用的內(nèi)部VFS接口。這些接口具有很好的粒度,使我們可以不必接觸OSKit文件系統(tǒng)的內(nèi)部。例如,OSKit接口只接受簡(jiǎn)單的路徑名組件,允許安全封裝的代碼執(zhí)行適當(dāng)?shù)脑L問(wèn)許可檢查。
4OSKit的現(xiàn)狀
自從在1996年6月了OSKit的第一個(gè)公開(kāi)發(fā)行版以來(lái),OSKit已經(jīng)更新了多次,每次更新都增加了一些算法,并修正了一些錯(cuò)誤。最新的發(fā)行版是2002年3月的版本。由此可見(jiàn),OSKit一直處于操作系統(tǒng)開(kāi)發(fā)平臺(tái)的前沿,其自身也在不斷完善和發(fā)展。
5結(jié)論
作為一個(gè)操作系統(tǒng)研究與開(kāi)發(fā)的平臺(tái),OSKit大大減輕了操作系統(tǒng)研究與開(kāi)發(fā)者的負(fù)擔(dān)。它可以讓開(kāi)發(fā)人員避開(kāi)復(fù)雜的底層,而把興趣集中與他們所感興趣的領(lǐng)域。開(kāi)發(fā)者可以用自己編寫的組件來(lái)取代OSKit中的部分組件,以滿足自己特定的需要,從而豐富了操作系統(tǒng)的應(yīng)用層。總之,OSKit滿足了實(shí)際客戶系統(tǒng)的需求,有助于操作系統(tǒng)的研究與開(kāi)發(fā)。
基于Web的嵌入式操作系統(tǒng)在遠(yuǎn)程監(jiān)控中的應(yīng)用
遠(yuǎn)程監(jiān)控客戶端、嵌入式Web服務(wù)器、監(jiān)控對(duì)象三部分組成了遠(yuǎn)程監(jiān)控系統(tǒng)。用戶根據(jù)具體的工業(yè)現(xiàn)場(chǎng)環(huán)境在客戶端的監(jiān)控界面開(kāi)發(fā)一個(gè)監(jiān)控界面,通過(guò)本地通過(guò)串口或者遠(yuǎn)程網(wǎng)口上傳到嵌入式Web服務(wù)器,這樣既方便遠(yuǎn)程管理又方便更新調(diào)整工業(yè)現(xiàn)場(chǎng)變化后的界面。通過(guò)遠(yuǎn)程客戶端運(yùn)行運(yùn)行軟件,在遠(yuǎn)程監(jiān)控界面以Internet網(wǎng)連接入到嵌入式Web服務(wù)器,發(fā)送用戶的請(qǐng)求,建立連接后,將監(jiān)控界面文件通過(guò)服務(wù)器傳給客戶端,還原該監(jiān)控界面后,用戶就可以根據(jù)實(shí)時(shí)控制界面獲知監(jiān)控對(duì)象的狀態(tài),用戶還可以通過(guò)對(duì)監(jiān)控界面按鈕,對(duì)監(jiān)控對(duì)象進(jìn)行控制。
嵌入式Web服務(wù)器有Confingure模式、Download模式、Upload模式、Run四種工作模式。通過(guò)Confingure模式設(shè)置服務(wù)器環(huán)境參數(shù);根據(jù)Download模式,可以從嵌入式Web服務(wù)器下載客戶端監(jiān)控界面進(jìn)行遠(yuǎn)程監(jiān)控;在Upload模式,上傳監(jiān)控界面配置文件到嵌入式Web服務(wù)器中以備用;通過(guò)Run模式,根據(jù)監(jiān)控界面為工業(yè)現(xiàn)場(chǎng)提供實(shí)時(shí)數(shù)據(jù),實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。
基于Web的嵌入式操作系統(tǒng)在信息家電中的應(yīng)用
基于Web的嵌入式操作系統(tǒng),通過(guò)嵌入式信息家電平臺(tái)控制節(jié)點(diǎn)。通過(guò)IE瀏覽器訪問(wèn)信息家電控制臺(tái),并對(duì)其進(jìn)行遠(yuǎn)程控制,達(dá)到通過(guò)以太網(wǎng)、藍(lán)牙等無(wú)線網(wǎng)絡(luò)環(huán)境對(duì)各類信息家電設(shè)備,實(shí)現(xiàn)信息家電的數(shù)據(jù)傳輸控制。信息家電是以應(yīng)用為主要目的,基于計(jì)算機(jī)技術(shù),并且對(duì)功能及其可靠性,設(shè)備成本、能耗以及體積都有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。
就象UNIX,Linux支持的網(wǎng)卡主要是以太網(wǎng)卡。如3COM、ACCTON、AT&T、IBM、CRYSTAL、D-LINK等眾多品牌的以太網(wǎng)卡只要安裝配置正確,都可以得到你所期望的效果。
一、Linux中網(wǎng)卡的工作原理
為了將這個(gè)問(wèn)題說(shuō)明的更清楚一些,不妨先簡(jiǎn)要地剖析一下Linux是如何讓網(wǎng)卡工作的。一般來(lái)說(shuō),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ù)。
1.網(wǎng)卡驅(qū)動(dòng)程序
簡(jiǎn)單地說(shuō),要將你手中的網(wǎng)卡利用起來(lái),你唯一要做的是得到這塊網(wǎng)卡的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序提供了面向操作系統(tǒng)核心的接口和面向物理層的接口。
驅(qū)動(dòng)程序的操作系統(tǒng)接口是一些用于發(fā)現(xiàn)網(wǎng)卡、檢測(cè)網(wǎng)卡參數(shù)以及發(fā)送接收數(shù)據(jù)的例程。當(dāng)驅(qū)動(dòng)程序開(kāi)始運(yùn)作時(shí),操作系統(tǒng)首先調(diào)用檢測(cè)例程以發(fā)現(xiàn)系統(tǒng)中安裝的網(wǎng)卡。如果該網(wǎng)卡支持即插即用,那么檢測(cè)例程應(yīng)該可以自動(dòng)發(fā)現(xiàn)網(wǎng)卡的各種參數(shù);否則你就要在驅(qū)動(dòng)程序運(yùn)作前,設(shè)置好網(wǎng)卡的參數(shù)供驅(qū)動(dòng)程序使用。當(dāng)核心要發(fā)送數(shù)據(jù)時(shí),它調(diào)用驅(qū)動(dòng)程序的發(fā)送例程。發(fā)送例程將數(shù)據(jù)寫入正確的空間,然后激活物理發(fā)送過(guò)程。
驅(qū)動(dòng)程序面向物理層的接口是中斷處理例程。當(dāng)網(wǎng)卡接收到數(shù)據(jù)、發(fā)送過(guò)程結(jié)束,或者發(fā)現(xiàn)錯(cuò)誤時(shí),網(wǎng)卡產(chǎn)生一個(gè)中斷,然后核心調(diào)用該中斷的處理例程。中斷處理例程判斷中斷發(fā)生的原因,并進(jìn)行響應(yīng)的處理。比如當(dāng)網(wǎng)卡接收到數(shù)據(jù)而發(fā)生中斷時(shí),中斷處理例程調(diào)用接收例程進(jìn)行接收。
2.驅(qū)動(dòng)程序工作參數(shù)
驅(qū)動(dòng)程序的工作參數(shù)因網(wǎng)卡性質(zhì)的不同而不同,大致包括I/O端口號(hào)、中斷號(hào)、DMA通道、共享存儲(chǔ)區(qū)等。輸入輸出端口號(hào)又被稱為輸入輸出基地址,當(dāng)網(wǎng)卡工作于端口輸入輸出模式時(shí)被使用。端口輸入輸出模式需要CPU的全程干預(yù),但所需硬件及存儲(chǔ)空間要求較低。CPU通過(guò)端口號(hào)指定的空間與網(wǎng)卡交換數(shù)據(jù)。中斷號(hào)是網(wǎng)卡的中斷序號(hào),只要不與其它設(shè)備沖突即可。當(dāng)網(wǎng)卡使用DMA方式時(shí),它要使用DMA通道批量傳輸數(shù)據(jù)而不需要CPU的干預(yù)。
對(duì)于一塊具體的網(wǎng)卡,如果網(wǎng)卡支持完全自動(dòng)檢測(cè),那么一個(gè)參數(shù)也不用指定,驅(qū)動(dòng)程序的檢測(cè)例程會(huì)自動(dòng)設(shè)定所需參數(shù)。一般情況,你需要人工設(shè)定這些參數(shù)的一部分。如果你的網(wǎng)卡使用端口輸入輸出模式,你要設(shè)定端口號(hào)和中斷號(hào)。如果你的網(wǎng)卡使用DMA模式,你要設(shè)定DMA通道和中斷號(hào)。如果你的網(wǎng)卡使用共享存儲(chǔ)區(qū)的模式,那你就得設(shè)定共享存儲(chǔ)區(qū)的地址范圍。
3.驅(qū)動(dòng)程序的使用方式
有了網(wǎng)卡的驅(qū)動(dòng)程序后,你可以選擇是把驅(qū)動(dòng)程序加入到Linux核心之中還是把驅(qū)動(dòng)程序加工成獨(dú)立模塊。Linux系統(tǒng)一個(gè)引人入勝的長(zhǎng)處就是可以定制系統(tǒng)的核心。把需要頻繁調(diào)用的功能加入系統(tǒng)核心,可以大大提高系統(tǒng)的效率。在這種情況下系統(tǒng)啟動(dòng)時(shí),系統(tǒng)核心自動(dòng)加載網(wǎng)卡的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的參數(shù)可以通過(guò)LILO命令參數(shù)加以指
定。系統(tǒng)啟動(dòng)后驅(qū)動(dòng)程序永久駐留核心,不能用常規(guī)的方法將其卸載。至于定制的系統(tǒng)核心,是通過(guò)重新編譯得到的;如何編譯核心將在后文敘及。
如果把驅(qū)動(dòng)程序編譯成可裝載模塊,就可以用系統(tǒng)提供的命令在系統(tǒng)啟動(dòng)后隨時(shí)加載。隨時(shí)加載的好處是減少內(nèi)存開(kāi)銷,易于管理,但同時(shí)也犧牲了一點(diǎn)網(wǎng)絡(luò)傳輸?shù)男省r?qū)動(dòng)程序的參數(shù)是在命令行中直接輸入或通過(guò)配置文件指定。二、網(wǎng)卡安裝前的準(zhǔn)備在安裝網(wǎng)卡前,務(wù)必檢查是否具備下列條件:
1.硬件方面
以太網(wǎng)卡
網(wǎng)絡(luò)連接線及連接頭,如10base-T一般為8芯雙絞線配RJ-45接口
2.軟件方面
Linux操作系統(tǒng)
網(wǎng)卡驅(qū)動(dòng)程序(目標(biāo)碼或源代碼)
*網(wǎng)卡配置程序
*軟件開(kāi)發(fā)工具,如GNU工具包(包括編譯器gcc、make等)
3.系統(tǒng)配置信息
可用的端口地址
可用的中斷號(hào)
以上不帶星號(hào)標(biāo)記的是必要條件,帶星號(hào)的是視情況不同而要求的條件。具體情況在下面進(jìn)一步說(shuō)明。
三、網(wǎng)卡的安裝及配置
第一步:配置以太網(wǎng)卡的工作參數(shù)
配置網(wǎng)卡就是配置網(wǎng)卡的工作參數(shù),如端口地址、中斷號(hào)等。網(wǎng)卡的缺省參數(shù)一般存儲(chǔ)于網(wǎng)卡內(nèi)部的EEPROM,這是網(wǎng)卡出廠前設(shè)置好的。缺省參數(shù)在大多數(shù)情況下是可行的,但如果這些參數(shù)與你的系統(tǒng)有沖突并且網(wǎng)卡又不支持軟件動(dòng)態(tài)設(shè)置,那么你就要使用網(wǎng)卡的設(shè)置程序。并不是所有的網(wǎng)卡都要經(jīng)過(guò)這一步,因?yàn)橛行┚W(wǎng)卡支持通過(guò)驅(qū)動(dòng)軟件及其輸入?yún)?shù)來(lái)確定網(wǎng)卡的工作參數(shù)。可以通過(guò)查閱網(wǎng)卡使用說(shuō)明書來(lái)確定這一點(diǎn)。
網(wǎng)卡的設(shè)置程序與驅(qū)動(dòng)程序不同,設(shè)置程序僅僅用來(lái)對(duì)網(wǎng)卡EEPROM中的設(shè)置進(jìn)行修改。網(wǎng)卡程序本身可能運(yùn)行在其它操作系統(tǒng)下,如WINDOWS95/98、OS/2、DOS等。如果是非Linux平臺(tái),那你就先在適合設(shè)置程序運(yùn)行的系統(tǒng)中安裝網(wǎng)卡,按設(shè)置程序說(shuō)明設(shè)置網(wǎng)卡參數(shù)。然后再在Linux系統(tǒng)下安裝該網(wǎng)卡。
第二步:安裝Linux系統(tǒng)
假如你將要安裝以太網(wǎng)卡的Linux系統(tǒng)本身還未安裝,那么可以先試著在安裝Linux的同時(shí)安裝網(wǎng)卡。這一步成功的前提是你的Linux發(fā)行版本包含將要安裝的網(wǎng)卡的驅(qū)動(dòng)程序。
運(yùn)行Linux的安裝程序,按提示進(jìn)行操作,別忘了安裝核心的網(wǎng)絡(luò)部分。當(dāng)進(jìn)行到LAN配置時(shí),安裝程序會(huì)列出它支持的所有網(wǎng)卡的類型。看看你的網(wǎng)卡是否榜上有名。隨著Linux發(fā)行版本的不斷升級(jí),目前RedHat6.0已經(jīng)覆蓋了常用的網(wǎng)卡類型。如果很幸運(yùn)地你的網(wǎng)卡恰好在其中,那么下文討論的很多步驟都可以不必考慮了,安裝程序會(huì)自動(dòng)完成網(wǎng)卡的安裝與驅(qū)動(dòng)。但如果沒(méi)找到適用于你的網(wǎng)卡類型,也不必?fù)?dān)心,繼續(xù)下一步。
第三步:手工安裝網(wǎng)卡
安裝網(wǎng)卡也就是安裝網(wǎng)卡的驅(qū)動(dòng)程序。網(wǎng)卡要工作必須要有驅(qū)動(dòng)程序,并且驅(qū)動(dòng)程序越成熟越好。驅(qū)動(dòng)程序一般由網(wǎng)卡的生產(chǎn)或供應(yīng)商提供。由于Linux是一個(gè)起步不久的新興操作系統(tǒng),網(wǎng)卡的生產(chǎn)商并不一定提供Linux環(huán)境下的驅(qū)動(dòng)程序。這時(shí)候你就得從其它途徑想辦法了,比如到INTERNET上專門提供硬件驅(qū)動(dòng)程序的網(wǎng)站查找一下,也可以在新聞組上貼個(gè)求助信息。總之,只有得到網(wǎng)卡的驅(qū)動(dòng)程序后,方可進(jìn)行下一步。
網(wǎng)卡的驅(qū)動(dòng)程序有兩種類型。一是可直接使用的二進(jìn)制代碼;另一種是驅(qū)動(dòng)程序的源代碼。二進(jìn)制代碼一般是預(yù)先編譯好的可裝載模塊。源代碼可以編譯成可裝載模塊,也可以編譯成系統(tǒng)核心的一部分。如何把源代碼編譯成可裝載模塊不在本文討論之列,具體可以查閱驅(qū)動(dòng)程序的說(shuō)明書。
1.可裝載模塊的使用
系統(tǒng)提供了一組命令用于將驅(qū)動(dòng)程序模塊載入內(nèi)存執(zhí)行。這些命令包括modprobe、insmod、Ismod、rmmod。modprobe與insmod命令功能相似,但是方式各異。
modprobe命令使用配置文
件/erc/config.modules來(lái)加載可執(zhí)行模塊。要用modprobe命令加載以太網(wǎng)卡的驅(qū)動(dòng)程序,可以在config.modules文件中加入:
aliaseth0drivermodule(drivermodule是驅(qū)動(dòng)程序模塊的名稱)
這行配置信息把以太網(wǎng)卡的設(shè)備名與驅(qū)動(dòng)程序模塊聯(lián)系起來(lái)。modprobe命令依據(jù)這條信息,自動(dòng)加載存放于/lib/library/xxxx/net目錄下名為drivermodule.o的模塊。因此要使modprobe命令找到驅(qū)動(dòng)程序模塊,必須將該模塊放在/lib/library/xxxx/net目錄下。
那么驅(qū)動(dòng)程序的參數(shù)如何指定呢?還是使用conf.modules文件。方法是在接著上述配置信息的后面加入下行信息:
optionsdrivermoduleparml=valuel,parm2=value2,……
這里parm1是驅(qū)動(dòng)程序可以接受的參數(shù)名,valuel是該參數(shù)值;依次類推。
比如optionscs89x0io=0x200irq=0xAmedia=aui
insmod命令直接通過(guò)命令行參數(shù)將驅(qū)動(dòng)程序模塊載入內(nèi)存,并可以在命令中指定驅(qū)動(dòng)程序參數(shù)。例如:
insmoddrivermodule.oparml=valuel,parm2=value2,……
以上兩個(gè)命令中可以使用驅(qū)動(dòng)程序參數(shù)要依據(jù)具體的網(wǎng)卡及其驅(qū)動(dòng)程序而定,要仔細(xì)閱讀網(wǎng)卡及驅(qū)動(dòng)程序的說(shuō)明書。有的網(wǎng)卡驅(qū)動(dòng)程序可以用這些參數(shù)覆蓋網(wǎng)卡本身EEPROM中存儲(chǔ)的參數(shù)。有的則必須使用EEPROM中的參數(shù)。有的因?yàn)轵?qū)動(dòng)程序不自動(dòng)檢測(cè)網(wǎng)卡使用的參數(shù),所以還得把網(wǎng)卡使用的EEPROM中的參數(shù)傳給驅(qū)動(dòng)程序。
卸載驅(qū)動(dòng)程序模塊使用rmmod命令:
rmmoddrivermodule.o
2.把驅(qū)動(dòng)程序編譯入系統(tǒng)核心
除了以可裝載模塊的形式使用驅(qū)動(dòng)程序,還可以把驅(qū)動(dòng)程序編譯進(jìn)Linux核心,以獲取更高的效率。這種方式需要驅(qū)動(dòng)程序的源代碼、Linux核心源代碼及其編譯工具。Linux核心的編譯過(guò)程包括配置核心、重建依賴關(guān)系、生成核心代碼等步驟。配置核心的過(guò)程是用系統(tǒng)提供的配置工具(makeconfig或makemenuconfig)重新生成用來(lái)編譯核心的眾多make文件的過(guò)程。為了讓核心的配置工具了解你的網(wǎng)卡驅(qū)動(dòng)程序,你需要修改一些核心的配置文件。
(1)修改配置文件:主要修改核心源代碼目錄下的四個(gè)文件,即drivers/net/CONFIG文件、drivers/net/Config.in文件、drivers/net/Makefile文件和drivers/net/Space.c文件。CONFIG和Config.in文件用于控制核心配置工具(makeconfig或makemenuconfig)的運(yùn)行,主要是加入關(guān)于是否包括該網(wǎng)卡的支持提示。Makefile和Space.c文件用于編譯核心代碼并說(shuō)明面向核心的接口。詳細(xì)語(yǔ)句參見(jiàn)下面例子。
(2)運(yùn)行核心配置工具:在核心源代碼目錄下執(zhí)行makeconfig或makemenuconfig命令。makeconfig是面向命令行的,通過(guò)逐句回答提問(wèn)來(lái)配置核心。由于其在配置過(guò)程中不可改變或撤消以前的回答,故多有不便。makemenuconfig則是通過(guò)窗口菜單方式,使用起來(lái)很方便。就本文而言,你只要在上一步中正確修改了配置文件,那么在config中會(huì)出現(xiàn)是否需要該網(wǎng)卡支持的提問(wèn),你選擇‘y’。或者在menuconfig中的network菜單中出現(xiàn)表示該網(wǎng)卡的菜單項(xiàng),把它選上即可。
(3)重建依賴關(guān)系:很簡(jiǎn)單,執(zhí)行makedep和makeclean命令。
(4)生成核心代碼:執(zhí)行makezImage命令。這個(gè)命令開(kāi)始真正編譯核心代碼,并把核心代碼存放為arch/i386/boot目錄下的zImage。
(5)為了使用新的核心代碼,你需要用新的核心代碼替換原有的。原有的核心代碼一般存放在/boot目錄下,文件名稱類似于vmlinuz-v.s.r-m(v.s.r-m)表示核心的版本號(hào))。如vmlinuz-2.0.34-1。執(zhí)行下列命令:
cparch/i386/boot/zImage/boot/vmlinuz-v.s.r-m
為了安全起見(jiàn),可以先把原有的核心代碼做個(gè)備份,以便發(fā)生錯(cuò)
誤時(shí)恢復(fù)。
至此,你可以重新引導(dǎo)系統(tǒng)以使用新的帶有正確網(wǎng)卡驅(qū)動(dòng)支持的Linux核心。唯一剩下未解決的是驅(qū)動(dòng)程序的參數(shù)問(wèn)題。有些網(wǎng)卡驅(qū)動(dòng)程序如果不輸入?yún)?shù),那它工作就會(huì)不正常,甚至根本不工作。由于現(xiàn)在網(wǎng)卡的驅(qū)動(dòng)程序是系統(tǒng)啟動(dòng)時(shí)由核心載入運(yùn)行的,系統(tǒng)啟動(dòng)之后用戶就很難改變這些參數(shù)了,所以你必須在系統(tǒng)啟動(dòng)時(shí)告訴Linux核心網(wǎng)卡驅(qū)動(dòng)程序使用的參數(shù)。具體方法有兩種:
(1)在系統(tǒng)引導(dǎo)程序LILO中輸入。
在LILO開(kāi)始引導(dǎo)系統(tǒng)時(shí),用ether子命令設(shè)定以太網(wǎng)卡驅(qū)動(dòng)程序的參數(shù)。ether命令的使用方式為:
LILO:linuxether=IRO.BASE_ADDR,NAME
這里帶下劃線的是要輸入的部分,IRQ表示中斷號(hào),BASE_ADDR表示端口號(hào),NAME表示網(wǎng)卡的設(shè)備名。例如:linuxether=15,0x320,eth0
(2)在LILO配置文件中設(shè)定。
每次在系統(tǒng)啟動(dòng)時(shí)再輸入驅(qū)動(dòng)程序參數(shù)似乎有點(diǎn)過(guò)于麻煩。幸好系統(tǒng)提供了LILO的配置文件可以用來(lái)永久性的設(shè)置Linux系統(tǒng)啟動(dòng)時(shí)的子命令。方法是在/etc/lilo.conf文件中的適當(dāng)位置加入以下一行:
append=“ether=IRQ,BASE_ADDR,NAME”
這里帶下劃線部分的意義同上。加入這一行后,還需要用/sbin/lilo命令把這個(gè)配置寫入引導(dǎo)程序。
第四步:網(wǎng)絡(luò)配置及測(cè)試
安裝完網(wǎng)卡就可以配置網(wǎng)絡(luò)通信了。配置網(wǎng)絡(luò)簡(jiǎn)單地就是使用ifconfig命令,
例如:
ifconfigeth01.2.3.4netmask255.0.0.0up
最后ping一下網(wǎng)上其它機(jī)器的ip地址,檢查網(wǎng)絡(luò)是否連通。
五、一個(gè)以太網(wǎng)卡安裝實(shí)例
下面以Cirrus公司生產(chǎn)的CrystalCS8920以太網(wǎng)卡為例,詳細(xì)說(shuō)明上述安裝配置過(guò)程。本例中,有些命令參數(shù),如核心源代碼目錄等,是以我使用的系統(tǒng)環(huán)境為出發(fā)點(diǎn)。具體應(yīng)用中還要加以本地化。為了更接近實(shí)際,例子中也包括了對(duì)安裝中碰到的問(wèn)題的描述。
1.此網(wǎng)卡是IBMPC機(jī)的內(nèi)置式網(wǎng)卡,機(jī)器只提供了Windows95/98環(huán)境下的驅(qū)動(dòng)程序。由于RedHat5.0發(fā)行版本尚未提供對(duì)此網(wǎng)卡的直接支持,所以從Cirrus的站點(diǎn)上找到并下載了該網(wǎng)卡驅(qū)動(dòng)程序的Linux版本,是一個(gè)名為L(zhǎng)inux102_tar.gz的壓縮文件。
2.文件Linux102_tar.gz解壓后包括五個(gè)文件。包括源代碼,僅適用于Linux2.0版本的目標(biāo)模塊以及readme文件。
3.查閱readme文件后,了解到這個(gè)驅(qū)動(dòng)程序只能使用網(wǎng)卡EEPROM中設(shè)定的端口號(hào)(I/O基地址)、中斷號(hào)。為了知道網(wǎng)卡EEPROM的設(shè)置,又從Cirrus站點(diǎn)下載了該網(wǎng)卡DOS版本的設(shè)置程序setup.exe
4.在DOS中運(yùn)行setup.exe,發(fā)現(xiàn)網(wǎng)卡的起始端口號(hào)為0x360,中斷號(hào)為10,與別的設(shè)備有沖突。選擇setup.exe程序的相應(yīng)菜單,把中斷號(hào)改成5。另外,此驅(qū)動(dòng)程序不支持plugandPlay,故也在setup.exe中將網(wǎng)卡的PnP功能屏蔽掉。
5.我所使用的RedHat5.0的Linux核心版本為2.0.34,所以不能用現(xiàn)成的驅(qū)動(dòng)程序目標(biāo)模塊,需要自己動(dòng)手編譯。如上文所述,有兩種方式使用此驅(qū)動(dòng)程序。
6.如果要編譯成獨(dú)立模塊,執(zhí)行下列命令:
gcc-D_KERNEL_-I/usr/src/linux/include-I/usr/src/linux/net/inet-Wall-Wstrictprototypes-02-fomit-frame-pointer-DMODULE-DCONFIG_MODVERSIONS-ccs89x0.c
編譯結(jié)果是名為cs89x0.o的驅(qū)動(dòng)程序目標(biāo)模塊。要裝載此驅(qū)動(dòng)程序,輸入下列命令:insmodcs89x0.oio=0x360irq=10
要卸載此驅(qū)動(dòng)程序,用rmmod命令:
rmmodcs89x0.o
7.如果要將驅(qū)動(dòng)程序編進(jìn)系統(tǒng)核心,
修改/usr/src/linux/drivers/net/CONFIG,加入:
CS89x0_OPTS=
修改/usr/src/linux/drivers/net/Config.in,加入:
tristate‘CS8920Support’CONFIG_CS8920
以上兩行是為了讓makeconfig在配置過(guò)程中詢問(wèn)是否增加CS8920網(wǎng)卡的支持。修改/usr/src/linux/drivers/net/Makefile加入:
ifeq((CONFIG_CS8920),y)
L_OBJS+=cs89x0.o
endif
修改/usr/src/linux/drivers/net/Space.c,加入:
externintcs89x0_probe(structdevice*dev);
……
#ifdefCONFIG_CS8920
&&cs89x0_probe(dev);
#endif
以上兩段是為了編譯并輸出網(wǎng)卡驅(qū)動(dòng)程序及其例程。
把驅(qū)動(dòng)程序源代碼拷到/usr/src/linux/drivers/net目錄下。
在/usr/src/linux目錄下執(zhí)行makeconfig或makemenuconfig,選擇核心CS8920網(wǎng)卡支持。
執(zhí)行makedep、makeclean命令。最后用makezImage編譯Linux核心。
如何設(shè)置核心驅(qū)動(dòng)程序參數(shù),上節(jié)已有說(shuō)明,不再贅述。