摘要:Linux以其自身內(nèi)核強(qiáng)大穩(wěn)定、工作效率高、易于擴(kuò)展以及豐富的硬件支持等優(yōu)點(diǎn),現(xiàn)已被廣泛應(yīng)用于嵌入式系統(tǒng)當(dāng)中。驅(qū)動程序?qū)嵸|(zhì)上就是在操作系統(tǒng)當(dāng)中添加一個代碼,其中主要包含與硬件設(shè)備相關(guān)的信息,擁有這些信息后,便可以實(shí)現(xiàn)計(jì)算機(jī)與設(shè)備之間的通信。如果沒有驅(qū)動程序,計(jì)算機(jī)的硬件設(shè)備便無法進(jìn)行正常工作。而網(wǎng)卡驅(qū)動程序是驅(qū)動程序中較為重要的一個部分?;诖它c(diǎn),本文就基于Linux的光纖通道網(wǎng)卡驅(qū)動程序開發(fā)進(jìn)行淺談。
關(guān)鍵詞:Linux;光纖通道;網(wǎng)卡驅(qū)動;程序開發(fā)
中圖分類號:TP311.52 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9599 (2012) 18-0000-02
1 基于Linux系統(tǒng)下的網(wǎng)卡驅(qū)動原理
當(dāng)前,在科學(xué)技術(shù)不斷發(fā)展的推動下,使Linux操作系統(tǒng)獲得了進(jìn)一步完善,該系統(tǒng)的核心部分現(xiàn)已實(shí)現(xiàn)了OSI的網(wǎng)絡(luò)層及更上層部分。其中網(wǎng)絡(luò)層的實(shí)現(xiàn)是以數(shù)據(jù)鏈路的高效、可靠運(yùn)行為基礎(chǔ),它的實(shí)現(xiàn)為網(wǎng)卡驅(qū)動程序提供了可靠的接口。
1.1 網(wǎng)卡驅(qū)動程序
由上述分析可知,在基于Linux的操作系統(tǒng)當(dāng)中,驅(qū)動程序可以為系統(tǒng)以及物理層提供接口,下面分別對系統(tǒng)的接口和物理層的接口進(jìn)行介紹。
(1)系統(tǒng)接口。驅(qū)動程序?yàn)橄到y(tǒng)的接口包括以下一些例程:發(fā)現(xiàn)網(wǎng)卡、檢測網(wǎng)卡參數(shù)、數(shù)據(jù)接收和數(shù)據(jù)發(fā)送等等。當(dāng)驅(qū)動程序啟動后,系統(tǒng)會自行對相關(guān)的例程進(jìn)行檢測和調(diào)用,借助該過程發(fā)現(xiàn)網(wǎng)卡,如果系統(tǒng)使用的是即插即用型網(wǎng)卡,系統(tǒng)在對例程進(jìn)行檢測時便可以發(fā)現(xiàn)其中的參數(shù),如果不是即插即用型網(wǎng)卡,那么便需要在驅(qū)動程序運(yùn)行前,預(yù)先設(shè)置好網(wǎng)卡的具體參數(shù),以供驅(qū)動程序使用。當(dāng)系統(tǒng)核心需要對數(shù)據(jù)進(jìn)行發(fā)送時,其便會通過調(diào)用由驅(qū)動程序發(fā)送的例程來完成這一操作。這一過程實(shí)質(zhì)上就是發(fā)送例程將數(shù)據(jù)寫入空間的過程。(2)物理層接口。該接口屬于中斷處理例程,它的工作原理可概括為網(wǎng)卡在接收或發(fā)送數(shù)據(jù)時,如果發(fā)現(xiàn)數(shù)據(jù)有誤,其會自動生成一個中斷,此時系統(tǒng)的核心會對中斷處理例程進(jìn)行調(diào)用,并在判斷其產(chǎn)生的原因后完成響應(yīng)處理。
1.2 工作參數(shù)
由于網(wǎng)卡的類型各不相同,導(dǎo)致了驅(qū)動程序的具體工作參數(shù)也都不相同,但無論是哪種類型的網(wǎng)卡,都會包括以下幾個部分:如中斷號、共享存儲區(qū)、DMA通道以及I/O端口號等等。其中I/O端口號又被稱之為輸出/輸入地址,常被應(yīng)用在網(wǎng)卡運(yùn)行端口數(shù)據(jù)輸出/輸入模式的狀態(tài)下,該模式主要是以CPU干預(yù)為前提,其優(yōu)點(diǎn)是所需存儲空間小、對硬件設(shè)備的要求相對較低。當(dāng)系統(tǒng)的CPU利用端口號指定的空間與網(wǎng)卡進(jìn)行數(shù)據(jù)交換時,中斷號在運(yùn)行中不允許與其他設(shè)備產(chǎn)生沖突。當(dāng)網(wǎng)卡在使用DMA方式時,并不需要CPU的干預(yù),只需要DMA通道批量傳輸數(shù)據(jù)即可。對于具體網(wǎng)卡而言,若其支撐自動檢測,則只需要人工設(shè)定部分參數(shù);對于使用端口輸入輸出模式的網(wǎng)卡而言,必須設(shè)定中斷號和端口號,在DMA模式下,必須設(shè)定DMA中斷號和通道。
2 基于Linux的光纖通道網(wǎng)卡驅(qū)動程序開發(fā)
2.1 網(wǎng)絡(luò)設(shè)備初始化
利用 中的init函數(shù)可以實(shí)現(xiàn)網(wǎng)絡(luò)設(shè)備初始化,當(dāng)系統(tǒng)內(nèi)核對網(wǎng)絡(luò)驅(qū)動模塊進(jìn)行加載后,便會對初始化過程進(jìn)行調(diào)用。Init函數(shù)需要完成的工作主要有以下幾個方面:
(1)對內(nèi)核中通用的設(shè)置函數(shù) 進(jìn)行調(diào)用。(2)對 這一結(jié)構(gòu)體變量中的其它成員進(jìn)行填充。(3)對 檢測I/O地址空間進(jìn)行調(diào)用,并調(diào)用 申請以 為起始地址的16個連續(xù)的I/O地址空間。(4)探測網(wǎng)卡同時對ID信息進(jìn)行讀取,然后設(shè)置中斷信號輸出引腳。(5)將MAC地址寫入到IA寄存器當(dāng)中。(6)通過 將CS8900A注冊到Linux網(wǎng)絡(luò)設(shè)備鏈表當(dāng)中。
2.2 打開或關(guān)閉網(wǎng)絡(luò)設(shè)備
當(dāng)系統(tǒng)接收到來自于ifconfig這一命令時,便會打開或者關(guān)閉一個網(wǎng)絡(luò)接口。Ifconfig命令通過對ioctl進(jìn)行調(diào)用并將地質(zhì)賦予接口,這一響應(yīng)過程主要是由內(nèi)核來完成,基本與設(shè)備沒有任何關(guān)聯(lián)。隨后,ifconfig命令會對ioctl設(shè)置 的 位進(jìn)行調(diào)用,并以此來打開設(shè)備,該調(diào)用會使設(shè)備的open方法獲得相應(yīng)地調(diào)用。實(shí)際開發(fā)中,可以利用 函數(shù)來打開網(wǎng)絡(luò)設(shè)備,具體需要完成的工作包括以下幾個方面:其一,利用 將網(wǎng)絡(luò)設(shè)備的中斷處理程序注冊至內(nèi)核當(dāng)中;其二,利用 設(shè)置網(wǎng)卡中的配置和控制寄存器;其三,利用內(nèi)核中的 函數(shù)對網(wǎng)絡(luò)接口的數(shù)據(jù)傳輸隊(duì)列進(jìn)行開啟。
2.3 網(wǎng)絡(luò)數(shù)據(jù)包發(fā)送
在整個驅(qū)動過程中,網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送是非常重要的環(huán)節(jié)之一,也是驅(qū)動程序必須完成的任務(wù)。當(dāng)網(wǎng)絡(luò)設(shè)備啟動后, 結(jié)構(gòu)中的open方法便會被調(diào)用,它的主要工作是負(fù)責(zé)設(shè)備的打開以及對 中的 函數(shù)指針進(jìn)行調(diào)用,以此來完成硬件幀頭信息的建立,然后利用 這一函數(shù)調(diào)用 結(jié)構(gòu)中的 方法將存放在 中的數(shù)據(jù)傳送到網(wǎng)絡(luò)物理設(shè)備當(dāng)中。若該數(shù)據(jù)傳送成功,便會在 中釋放 然后返回0;若是傳送過程中,硬件設(shè)備處于繁忙狀態(tài)而無法對該數(shù)據(jù)進(jìn)行處理時,便會返回1。當(dāng)網(wǎng)絡(luò)硬件設(shè)備完成數(shù)據(jù)包發(fā)送后,會自行產(chǎn)生中斷,并將 置0,隨后通知系統(tǒng)可繼續(xù)進(jìn)行數(shù)據(jù)包發(fā)送。在實(shí)際開發(fā)中,通過 方法可實(shí)現(xiàn)網(wǎng)絡(luò)設(shè)備數(shù)據(jù)發(fā)送函數(shù) ,該函數(shù)能夠?qū)崿F(xiàn)將數(shù)據(jù)發(fā)送至網(wǎng)絡(luò)當(dāng)中,并由網(wǎng)絡(luò)接口層函數(shù)對其進(jìn)行調(diào)用。在這一過程中, 需要完成以下工作:
1.在對數(shù)據(jù)進(jìn)行發(fā)送前,首先將中斷關(guān)閉,然后再對網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)傳輸隊(duì)列進(jìn)行中止處理。2.利用 對CS8900A寄存器中的BusST信息進(jìn)行反復(fù)讀取,直至其準(zhǔn)備好接收來自于主機(jī)的數(shù)據(jù)為止。3.對數(shù)據(jù)幀的發(fā)送時間進(jìn)行相應(yīng)地記錄,當(dāng)記錄完成后將中斷打開,與此同時再將 緩存釋放出來,最后函數(shù)返回0。
2.4 網(wǎng)絡(luò)數(shù)據(jù)包的接收和中斷處理
網(wǎng)絡(luò)設(shè)備的使用功能在于不同步地通過中斷接收來自外部的數(shù)據(jù)包,并且主動將從硬件中獲取的數(shù)據(jù)包壓縮至內(nèi)核。在網(wǎng)絡(luò)接口接收新數(shù)據(jù)包的狀態(tài)下,一旦出現(xiàn)報(bào)告錯誤信息、發(fā)送完成數(shù)據(jù)或在連接狀態(tài)時均有可能引發(fā)中斷,一般情況下,中斷處理方式應(yīng)當(dāng)以檢測硬件狀態(tài)寄存器為基礎(chǔ),作出處理行動。在設(shè)備收到數(shù)據(jù)后產(chǎn)生一個中斷,通過硬件來完成對驅(qū)動程序的通知,使其明確數(shù)據(jù)包已到達(dá)。在中斷處理程序中驅(qū)動程序申請一塊 緩沖區(qū),而后將被讀出的數(shù)據(jù)放置緩沖區(qū)內(nèi),并對 中的部分信息進(jìn)行填充,如在 中填入數(shù)據(jù)幀類型;設(shè)置 ,標(biāo)明鏈路層數(shù)據(jù)類型等。最后對協(xié)議的接口層函數(shù)進(jìn)行調(diào)用,并將接收到的數(shù)據(jù)包傳輸至層協(xié)議當(dāng)中進(jìn)行中斷處理。
參考文獻(xiàn):
[1]劉春琳,郭紅琳,高珂.Linux系統(tǒng)以太網(wǎng)卡驅(qū)動程序加載與配置[J].山東煤炭科技,2011(3).
[2]羅燁,涂曉東,丁林.基于PCI-Ezpress接口的光纖通道協(xié)議處理卡驅(qū)動的研究與實(shí)現(xiàn)[A].第十四屆全國青年通信學(xué)術(shù)會議論文集[C].2009(7).