1 引言
無線局域網(wǎng)經(jīng)過幾年的發(fā)展,在技術(shù)上已經(jīng)日漸成熟。尤其是IEEE推出802.11-1999和802.11b以來,應(yīng)用也日漸廣泛。無線局域網(wǎng)硬件實現(xiàn)的兩大主要部分是基帶處理器和MAC控制器,軟件部分包括驅(qū)動網(wǎng)卡本身工作的嵌入式軟件和網(wǎng)絡(luò)設(shè)備驅(qū)動程序。在本文中,首先介紹了小端口驅(qū)動程序的基本要點,然后給出了基于Driver Studio開發(fā)PCMCIA接口編程I/O(Programmed IO)方式工作的無線局域網(wǎng)網(wǎng)卡NDIS(網(wǎng)絡(luò)驅(qū)動程序接口標(biāo)準(zhǔn)),并討論了小端口驅(qū)動程序?qū)崿F(xiàn)過程中的若干關(guān)鍵技術(shù)的細節(jié)。
2 小端口驅(qū)動程序
在典型的網(wǎng)絡(luò)中,如以太網(wǎng)LLC子層及其上層協(xié)議均由軟件實現(xiàn),MAC及其以下層協(xié)議由硬件實現(xiàn)。微軟Windows操作系統(tǒng)下的網(wǎng)絡(luò)設(shè)備驅(qū)動程序遵守NDIS規(guī)范,它在分層的網(wǎng)絡(luò)驅(qū)動程序框架中規(guī)定了一個標(biāo)準(zhǔn)接口,從而使抽象低層次的硬件提供了高層次網(wǎng)絡(luò)上的網(wǎng)絡(luò)管理。因此,該規(guī)范極大簡化了設(shè)備特定網(wǎng)絡(luò)驅(qū)動程序的開發(fā)。
NDIS還用于網(wǎng)絡(luò)驅(qū)動器的狀態(tài)信息和參數(shù)的維護,包括函數(shù)的指針、句柄、鏈接的參數(shù)塊和其他的一些系統(tǒng)變量。NDIS規(guī)范下的網(wǎng)絡(luò)驅(qū)動程序分為三類:小端口驅(qū)動程序、中間驅(qū)動程序和協(xié)議驅(qū)動程序。普通網(wǎng)卡的驅(qū)動程序都是小端口驅(qū)動程序,它有兩種基本功能:管理一個網(wǎng)絡(luò)接口卡(NIC),包括通過NIC收、發(fā)數(shù)據(jù);與高級驅(qū)動程序接口(如中間驅(qū)動程序和傳輸協(xié)議驅(qū)動程序)。一個小端口NIC驅(qū)動程序通過NDIS庫和它的NIC與高層驅(qū)動程序相互通訊。NDIS庫 導(dǎo)出一個完全的函數(shù)集合(NdisXXX函數(shù)),來裝入小端口需要調(diào)用的操作系統(tǒng)函數(shù)。然后,小端口必須導(dǎo)出一套MiniportX xx函數(shù)的實體指針,可供NDIS自己使用或代替高層驅(qū)動程序訪問小端口。
關(guān)于網(wǎng)絡(luò)設(shè)備驅(qū)動程序和Windows驅(qū)動程序模型,感興趣的讀者可以參考文獻。
3 無線網(wǎng)卡驅(qū)動程序框架
標(biāo)準(zhǔn)的驅(qū)動程序都是C語言寫的,Nu Mega公司卻通過引入C++和封裝基本的函數(shù)庫簡化了驅(qū)動程序的設(shè)計。
使用DriverStudio編寫網(wǎng)絡(luò)驅(qū)動程序,首先需要使用NetworkDriver Wizard生成驅(qū)動程序的框架。該框架生成兩個驅(qū)動程序的基本類:一個是 wlan_drvDriver,它是KndisMiniDriver的繼承類;另一個驅(qū)動程序必須且只有一個KndisMiniDriver的繼承類。wlan_drvDriver的定義如下
wlan_drvDriver的唯一工作是定義DriverEntry。操作系統(tǒng)通過該函數(shù)得知驅(qū)動程序的入口。DriverEntry例化NetworkDriver Wizard生成的另外一個類wlan_drvAdapter,并將本驅(qū)動程序注冊。
wlan_drvDriver類不用開發(fā)者干預(yù)。開發(fā)者需要關(guān)心的是另外一個類wlan_drvAdapter,它是KndisMiniAdapter的子類。
4 驅(qū)動程序的初始化
wlan_drvAdapter類的實現(xiàn)是整個驅(qū)動程序的主體部分,包括初始化驅(qū)動程序、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、中斷處理、網(wǎng)卡復(fù)位等。
驅(qū)動程序在被裝入操作系統(tǒng)后的第一步工作是進行初始化。該工作由wlan_drv Adapter::Initialize函數(shù)完成。該函數(shù)完成的工作如下:
(1)選擇媒體類型。對于無線局域網(wǎng)為 NDISMedium802_3,而不是NdisMedium-WirelessWan。聲明為 NdisMediumWirelessWan將支持各種無線媒體類型,NdisMedium802_3原本為以太網(wǎng)設(shè)計,這里無線局域網(wǎng)似乎應(yīng)該聲明為NdisMediumWirelessWan媒體類型,但事實并不是這樣。通過查詢OID_GEN_PHYSICAL_MEDIUM,協(xié)議驅(qū)動程序
可以得知物理媒體為NdisPhysical-MediumWirelessLan類型。
(2)從注冊表讀取網(wǎng)卡地址。
(3)注冊適配器的類型,如指定設(shè)備為 NdisInterfacePcMcia,代表網(wǎng)卡為PCMCIA標(biāo)準(zhǔn)的PC Card。這里需要強調(diào)的是PCMCIA接口的配置存儲器和功能寄存器都是由主機自行維護的,雖然驅(qū)動程序也可以讀寫配置存儲器和功能寄存器,但這樣做會導(dǎo)致系統(tǒng)工作的不一致,除非特別需要,驅(qū)動程序無需讀寫配置存儲器和功能寄存器。
(4)選擇并注冊IO端口。
(5)選擇并注冊中斷。
(6)設(shè)定網(wǎng)卡所支持的包種類,如廣播中的多播等。
(7)設(shè)定網(wǎng)卡的MAC屬性,如網(wǎng)卡是否支持環(huán)回等。
(8)初始化網(wǎng)卡硬件使其進入工作狀態(tài)。該工作由wlan_drvAdapter::CardInit()完成。主要是設(shè)置相應(yīng)的寄存器,讀取永久網(wǎng)卡地址等。
(9)初始化自定義變量。
5 發(fā)送數(shù)據(jù)
當(dāng)需要發(fā)送數(shù)據(jù)包時,NDIS調(diào)用MiniportSend 函數(shù),對應(yīng)本設(shè)計中wlan_drvAdapter::Send函數(shù)。如果當(dāng)前沒有數(shù)據(jù)包正在被發(fā)送,則調(diào)用 CopyDataDown(Packet)將數(shù)據(jù)發(fā)送給NIC,否則將數(shù)據(jù)插入發(fā)送隊列。當(dāng)中斷產(chǎn)生后,發(fā)現(xiàn)代表網(wǎng)卡準(zhǔn)備好接收下一個包,此時將數(shù)據(jù)包出列。
CopyDataDown(Packet)函數(shù)與具體的網(wǎng)卡實現(xiàn)有關(guān)。
6 接收數(shù)據(jù)
由于本設(shè)計中的網(wǎng)卡是程控I/O的網(wǎng)卡,速度較慢。每次產(chǎn)生中斷時,如果發(fā)現(xiàn)NIC上緩存了一個數(shù)據(jù)包需要接收,則通過NdisMEthIndicateReceive 通知給NDIS,對應(yīng)于m_Lookahead.In di cate函數(shù)。如果是DMA設(shè)備,可以一次將整個數(shù)據(jù)包通知給上層,對于PIO方式的NIC,DDK建議只通知部分?jǐn)?shù)據(jù),然后讓NDIS調(diào)用MiniportTransferData來讀取余下的數(shù)據(jù)。當(dāng)然NDIS也許對該數(shù)據(jù)不感興趣,就不會讀剩下的數(shù)據(jù)。
7 中斷處理
與中斷處理有關(guān)的函數(shù)包括中斷服務(wù)程序 wlan_drvAdapter::Isr和延遲過程調(diào)用函數(shù)wlan_drvAdapter::HandleInterrupt。
中斷服務(wù)程序Isr工作在DIRL,會搶斷工作在更低中斷優(yōu)先級的線程,所以應(yīng)該盡快退出。該程序的主要任務(wù)是判斷中斷當(dāng)前是否是本網(wǎng)卡產(chǎn)生的,如果沒有應(yīng)該將*InterruptRecognized 設(shè)定為FALSE,并退出程序。如果是,則將中斷處理程序HandleInterrupt插入DPC列隊,以在Passive Level上進一步處理中斷。
中斷處理程序是真正處理中斷的函數(shù),它完成所有數(shù)據(jù)處理工作,它需要處理包括與統(tǒng)計信息有關(guān)的接收數(shù)據(jù)、發(fā)送數(shù)據(jù)等所有中斷。
8 結(jié)論
網(wǎng)絡(luò)設(shè)備驅(qū)動程序是無線局域網(wǎng)網(wǎng)絡(luò)接口卡實現(xiàn)的關(guān)鍵部分,它與傳統(tǒng)的以太網(wǎng)卡稍有不同,但網(wǎng)卡與主機之間數(shù)據(jù)通信的基本格式與以太線網(wǎng)卡是相同的。本文首先介紹了小端口驅(qū)動程序的特點,然后給出了基于DriverStudio開發(fā)PCMCIA接口程控I/O方式工作的無線局域網(wǎng)網(wǎng)卡的NDIS小端口驅(qū)動程序,其主體部分中包括驅(qū)動程序框架、驅(qū)動程序的初始化、發(fā)送和接收數(shù)據(jù)和中斷處理在內(nèi)的關(guān)鍵技術(shù)細節(jié)。本文所設(shè)計的網(wǎng)卡已經(jīng)在原型網(wǎng)卡中運行,基本滿足了設(shè)計要求。
責(zé)任編輯:gt
-
嵌入式
+關(guān)注
關(guān)注
5147文章
19613瀏覽量
316457 -
無線
+關(guān)注
關(guān)注
31文章
5546瀏覽量
175788 -
局域網(wǎng)
+關(guān)注
關(guān)注
5文章
774瀏覽量
46997
發(fā)布評論請先 登錄
無線局域網(wǎng)NDIS小端口驅(qū)動怎么實現(xiàn)?
LCD顯示的關(guān)鍵技術(shù)
視覺導(dǎo)航關(guān)鍵技術(shù)及應(yīng)用
CITECT驅(qū)動程序結(jié)構(gòu)及其重用性的研究
基于NDIS中間層的包過濾的研究與設(shè)計
NDIS驅(qū)動程序研究和基于NDIS網(wǎng)絡(luò)監(jiān)測程序實現(xiàn)
基于NDIS中間驅(qū)動的包過濾器的設(shè)計實現(xiàn)
Windows CE設(shè)備驅(qū)動程序開發(fā)
Linux驅(qū)動程序缺陷檢測研究

基于符號執(zhí)行技術(shù)實現(xiàn)的驅(qū)動程序的漏洞檢測

Linux設(shè)備驅(qū)動程序的平臺驅(qū)動程序和字符驅(qū)動程序介紹
步進電機驅(qū)動器的關(guān)鍵技術(shù)研究

評論