亚洲日本成本线在观看,最新国自产拍在线,免费性爱视频日本,久久精品国产亚洲精品国产精品

            現在位置:范文先生網>理工論文>計算機論文>windows nt環(huán)境下fddi網卡驅動程序設計 2

            windows nt環(huán)境下fddi網卡驅動程序設計 2

            時間:2023-02-20 22:38:03 計算機論文 我要投稿
            • 相關推薦

            windows nt環(huán)境下fddi網卡驅動程序設計 2

            總體結構介紹
            第一節(jié)windows  nt網絡結構
            §1.1.1  windows  nt網絡體系結構
            windows  nt的網絡體系結構是基于國際標準化(iso)制定的標準模型──開放式系統(tǒng)互連(open  system  interconnection:osi)參考模型分層建立的,這種方式有利于隨時擴展其它功能和服務。
            windows  nt網絡模型開始于mac子層,網卡驅動程序就駐留在其中。它通過相關的網卡把windows  nt與網絡連接起來,圖中的多個網卡表明在一臺運行windows  nt的計算機上能使用多種網卡。
            這一網絡體系結構包括兩個重要接口──ndis接口與傳輸驅動
            程序接口(tdi)。這兩個接口把兩個層隔離開來,辦法是相鄰的部件只允許按單一的標準來寫,不允許多重標準。例如一個網卡驅動程序(在ndis接口的下面)就不需要特地按每個傳輸協(xié)議來寫它的代碼塊,恰恰相反,該驅動程序是寫給ndis接口的,它通過符合ndis的相應傳輸協(xié)議來請求服務。這些接口包含在windows  nt的網絡體系結構中,以容納可移植、可互換的模塊。
            在兩個接口之間,是傳輸協(xié)議。它在網絡中起著組織者的作用。一個傳輸協(xié)議規(guī)定了數據以何種方式呈遞給下一個接收層,以及如何對數據相應地進行打包。它通過ndis把數據傳給網卡驅動程序,并通過tdi把數據傳給轉發(fā)程序(redirector)
            tdi之上是轉發(fā)程序,它把本地的網絡資源申請轉送給網絡。
            為了能和其他廠商的網絡互連,windows  nt允許有多個轉發(fā)程序。對于每一個轉發(fā)程序windows  nt計算機必須也有一個相應的供應者(provider)(由網絡廠商提供)。多供應者路由選擇程序決定適當的供應者,然后借助于供應者,對應用請求到相應的轉發(fā)程序做出選擇。
            §1.1.2  windows  nt網絡驅動程序
            windows  nt支持兩種類型的網絡驅動程序
            傳輸驅動程序  
            實現數據鏈路層中的邏輯鏈路控制子層協(xié)議和傳輸層協(xié)議。向  下與ndis接口,向上與tdi接口。
            網卡驅動程序  
            實現對物理層的管理和數據鏈路層中介質訪問控制子層協(xié)議,通過ndis向下管理物理網卡,向上與傳輸驅動程序通信。
            §1.1.3  windows  nt網卡驅動程序
            windows  nt環(huán)境下的網卡驅動程序也分為兩種:  
            miniport網卡驅動程序:miniport驅動程序只須實現與網絡硬件相關的操作(包括發(fā)送和接收)。而所有底層網卡驅動程序的通用操作(如同步),一般由ndis接口程序來實現。  
            full網卡驅動程序:full網卡驅動程序必須實現所有硬件相關和同步、排隊等操作。例如full網卡驅動程序為了響應數據接收,需要保持本身的捆綁信息,而miniport就可以由ndis接口庫來實現。  
            在windows  nt的早期版本中,full網卡驅動程序要求開發(fā)者實現許多底層操作,來處理多處理器的核心問題以及處理器、線程的同步,這樣不同的開發(fā)者在大量重復著許多相同的工作。
            而miniport網卡驅動程序允許開發(fā)者僅僅寫一些與網絡硬件相關的代碼即可,而那些通用的函數由ndis接口庫來實現,這樣開發(fā)出來的驅動程序減少了不必要的工作。
            第二節(jié)miniport驅動程序的結構
            ndis接口規(guī)范了網卡驅動程序的實現,同時也對tdi驅動程序的實現提出了一定的要求,在nt中,ndis約束下的網卡驅動程序、tdi驅動程序和系統(tǒng)的關系如下圖所示:
            圖2.0  ndis約束下的網卡驅動程序、tdi驅動程序和系統(tǒng)的關系
            miniport驅動程序包括驅動程序對象、驅動程序源代碼和ndis接口庫代碼。windows  nt  ddk提供ndis.h作為miniport驅動程序的主要頭文件,定義了miniport驅動程序的入口點、ndis接口庫函數和通用數據結構。
            上邊緣函數的作用是網卡驅動與ndis接口庫進行通信,而下邊緣函數是tdi協(xié)議驅動程序與ndis通信的手段。
            §1.2.1  miniport網卡對象
            ndis用一個叫做邏輯網卡的軟件對象來描述系統(tǒng)中的每塊網卡,而邏輯網卡與windows  nt設備對象的通信由i/o子系統(tǒng)來管理,描述網卡的設備對象包括相關的網絡信息如名字、網絡地址和網卡內存基地址等,它還包含與硬件相關的驅動程序狀態(tài)數據(捆綁數目,捆綁句柄,包過濾數據庫等)。ndis分配一個句柄到miniportinitialize這個上邊緣函數的一個結構中,然后miniport網卡驅動程序將在以后提供這個句柄來給ndis調用,這個結構一直被ndis保持,并且對miniport驅動程序不透明。  

            當miniport網卡驅動程序初始化一塊網卡時,它創(chuàng)立自己的內部數據結構來描述網卡,記錄需要它管理的與設備相關的狀態(tài)信息。當miniport網卡驅動程序調用ndismsetatttibutes或ndismsetattributesex兩ndis庫函數時,它傳遞一個句柄給這數據結構。這樣,當調用miniport驅動程序入口點時,它就傳遞這個句柄來驗證驅動程序所對應的網卡的正確性。這個數據結構為miniport網卡驅動程序所擁有并維護。
            §1.2.2網絡對象標識符
            miniport  nic驅動程序還需要維護一組對象,這些對象是系統(tǒng)定義的對象標識符(object  idetifier:oid)來標識,以描述驅動程序的性能和當前狀態(tài)信息。為查詢這些信息,上層驅動程序調用ndisrequest向ndis接口庫指示oid。oid表示了調用所需的信息類型,如miniport驅動程序所支持的lookahead緩沖區(qū)大小等。ndis接到上層驅動程序的查詢請求,將oid傳遞給上邊緣函數miniportqueryinformation實現對oid的查詢,如果上層驅動程序請求改變狀態(tài)信息則調用miniportsetinformation實現對oid的設置。
            §1.2.3  miniport網卡驅動程序代碼
            典型的miniport  nic驅動程序必須有一些函數來通過ndis接口實現上層驅動程序與硬件的

            通信。這些函數稱為上邊緣服務函數。
            這些上邊緣服務函數由驅動程序的開發(fā)者根據驅動程序面向的特定低層網絡類型和硬件以及相應環(huán)境,可以有選擇地實現,但必須保證驅動程序最基本的功能,這些基本功能包括初始化、發(fā)送、中斷處理、重置、參數查詢與設置和報文接收。
            miniportinitialize:操作系統(tǒng)根據系統(tǒng)配置信息,檢測出網卡已安裝時,由ndis接口在初始化時調用,主要完成低層網絡類型確定,對應于物理網卡的邏輯網卡初始化,中斷信息注冊,網卡與主機通訊方式的確認。i/o端口的申請與注冊,內存映像,mib的初始化,物理網卡的驗證與初始化等。
            miniportreconfigure:支持網卡參數動態(tài)變化,和miniportinitilize一樣由ndis接口以初始化級別調度執(zhí)行(不能屏蔽中斷,必須由驅動程序承認并清除在此期間產生的中斷),支持即插即用和軟配置的網卡在動態(tài)改變參數時,必須提供此函數。  
            miniportqueryinformation:查詢網卡的狀態(tài)以及網卡驅動程序的操作或統(tǒng)計參數,如是否支持組通訊、網卡的物理速率是否支持回環(huán)、是否支持直接拷貝等,這些參數以oid方式統(tǒng)一管理。
            miniportsetinformation:ndis接口或協(xié)議驅動程序通過調用此接口改變驅動程序維護的oid庫,一些操作參數的改變也將同時改變驅動程序狀態(tài),例如組地址的設置。
            miniportreset:包括網卡硬件重置和驅動程序軟件重置,軟件重置包括驅動程序狀態(tài)重置,以及一些相關的參數重置,還需考慮有些參數的恢復,重置時不必完成所有正在活躍的外部請求,但必須釋放已占用的外部資源。
            miniporthalt:掛起網卡并釋放該網卡驅動程序占用的所有資源,在此期間不屏蔽中斷。
            miniportisr:高優(yōu)先級的中斷處理程序,進行的工作包括初始中斷處理類型,決定是否進行中斷轉交,對卡上中斷進行處理  等,該服務類型只在以下情況被調用:  
            ndis接口調用miniportinitialize和miniporthalt兩函數時。  
            .中斷處理類型設為每此中斷處理過程都調用時。
            為使系統(tǒng)能及時響應所有硬件中斷,高優(yōu)先級的硬件中斷處理程序應盡可能的減少運行時間,防止長時間的屏蔽低優(yōu)先級中斷,避免造程中斷丟失。
            miniporthandleinterrupt:由中斷延時處理程序在中斷延時處理時進行調用。ndis排隊所有的延時處理,該服務主要處理發(fā)送完成、報文接收、描述符用盡、溢出、網卡異常等中斷。
            miniportsend:ndis收到上層發(fā)送請求時經過若干協(xié)議處理再向下調用此服務過程,發(fā)送的packet已含有l(wèi)lc和mac頭,該服務過程進行邊界對齊、packet約束重整、描述符映射和報文發(fā)送、以及發(fā)送資源和packet緩沖隊列管理。
            miniporttransferdata:多個已和網卡捆綁的協(xié)議驅動程序在接收到報文到達指示后,向網卡驅動程序發(fā)出傳送請求以拷貝各自所需的報文數據部分,網卡驅動程序根據各協(xié)議驅動程序對單個packet是否進行多次拷貝,以決定是否暫存只允許單次拷貝的packet等。
            miniportcheckhandle:ndis每秒調用此服務函數一次,驅動程序發(fā)現網卡異常時報告給ndis由ndis調用miniportreset進行硬件重恢復。

            miniportenableintrrupt:中斷使能。
            miniportdisableinterrupt:中斷屏蔽。
            另外,每個網卡驅動程序必須有一個初始化入口點,由driver  entry函數實現,它和系統(tǒng)相關,由操作系統(tǒng)在裝入驅動程序時調用,主要完成初始化ndis  wrapper,再由wrapper初始生成驅動程序管理塊并完成相應各種初始化工作,登錄網卡驅動程序所有上邊緣服務入口點,同時寫入ndis版本信息。
            §1.2.4  ndis接口庫
            ndis接口庫包括在ndis.sys中,它是一個核態(tài)函數庫,有一套抽象的函數,無論協(xié)議驅動程序還是nic驅動程序都連接到這個庫中,以實現上下層之間的操作。
            第二章fddi網卡驅動程序的加載和運行
            第一節(jié)  網卡驅動程序的安裝
            windows  nt網卡驅動程序安裝的目的是實現網卡相應硬件信息和驅動程序在windows  nt注冊庫中的注冊,使windows  nt能夠正確識別網卡,了解所必需的軟硬件信息并能在windows  nt啟動時加載相應驅動程序。
            網卡驅動程序安裝時,首先在主群組的控制面板中選擇“網絡”,然后添加網卡,指定相應信息文件──oemsetup.inf的路徑,以完成以下兩個必要的操作:  
            復制驅動程序到相應的系統(tǒng)目錄(windows  nt根目錄\system32\drivers\)中;  
            在windows  nt注冊庫中存入相應軟硬件信息。  
            下面主要以fddi網卡為例介紹安裝驅動程序所必需的工作:
            §2.1.1網卡一般硬件參數
            對于fddi網卡,必須在編寫其oemsetup.inf文件時確定以下硬件參數:  
            總線類型:pci(5)……括號中的數字5表示pci總線在ndis中的總線類型代碼;  
            廠商代號:0x5588……系統(tǒng)加載時確定網卡的標記,也是編程時確定pci槽號的標識;  
            cfid:  0x01;  
            介質類型:光纖(3)  ……括號中的數字表示光纖在ndis中的介質類型代碼;  
            是否支持全雙工:支持。  
            對于其它的硬件信息在此inf配置信息文件中可有可無,如若配置,則可在驅動程序的編寫時利用這些信息,方便編程,同時有利于其它應用對其參數的確定和使用。
            §2.1.2  fddi網卡加載時需在注冊庫登錄表里做的網絡配置
            網卡驅動程序的安裝通常將創(chuàng)建登錄表中的四個不同子鍵:
            software  registrion鍵,對應于驅動程序,存在于hkey_local_machine\software\company\  productname\version中。我們的fddi網卡驅動程序所對應的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;  
            網卡的軟件登錄鍵,存在于hkey_local_machine\so

            ftware\microsoft\  windows  nt\nt3.51\networkcards\yhfddi1;  
            驅動程序的服務登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services  
            網卡的服務登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services  
            對于每一個網絡部件,一個名為netrules的特殊子鍵在鄰近的驅動程序或網卡登錄子鍵里創(chuàng)建,netrules標識網絡部件為網絡整體的一部分。
            fddi網卡驅動程序對應的標準軟件登錄表項將出現在以下路徑:
            hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
            驅動程序對應的標準項的值為:
            description  =yhfddi/pci  adapter  controller
            install  date  =……
            ……
            refcount  =0x01
            servicename  =yhfddi
            softwaretype  =driver
            title  =yhfddi/pci  adapter  controller
            而且在yhfddi驅動程序相關的netrules子鍵下,這些值項為:
            bindable  =yhfddi  driver  yhfddi  adapter  non  exclusiver
            bindform  =“yhfddisys”yes  no  container
            class  =  reg_multi_sz  “yhfddi  driver  basic”
            infname  =oemnad1.inf
            type  =yhfddisys  ndisdriver  yhfddidriver
            use  =driver
            yhfddi網卡在如下路徑的networkcards子鍵里介紹:
            hkey_local_machine\software\microsoft\
            windows  nt\nt3.51\networkcards\yhfddi1;
            網卡的標準項包括以下這些值:
            description  =yhfddi/pci  adapter  controller
            install  date  =……
            manufacturer  =net612
            productname  =yhfddi
            servicename  =yhfddi01
            title  =[01]yhfddi/pci  adapter  controller
            §2.1.3編寫inf信息配置文件
            gui  inf描述語言被windows  nt用以書寫系統(tǒng)所有部件的配置文件,當然也可以用以書寫網絡系統(tǒng)各部件的配置文件,該配置文件描述了網絡部件安裝、配置、刪除的執(zhí)行過程。當網絡部件進行初始安裝或二次安裝(通常通過ncpa進行)時,安裝程序讀取部件對應的配置文件,進行解釋執(zhí)行。gui  inf描述語言由節(jié)、命令、邏輯操作、變量規(guī)范、流程控制以及一套調用dll或外部程序的機制組成,其中,節(jié)是配置文件的主體,節(jié)可分為install節(jié)(類似于函數),shell節(jié)(也類似于函數,但可調用insall和shell節(jié)),detect節(jié)(不包含命令),一個配置文件一般由若干不同類型的節(jié)組成。驅動程序的開發(fā)者根據需要可以在配置文件中編寫相應代碼,使得用戶和系統(tǒng)之間能進行交互,并且由用戶決定一些配置參數。  
            nt網卡配置文件有其一套規(guī)范,驅動程序開發(fā)者必須按規(guī)范編寫配置文件,一般來說,一個配置文件至少應該提供下面三個節(jié):
            安裝入口點:[identify]shell節(jié)。該節(jié)主要功能是給出安裝部件的類型名,系統(tǒng)通過它識別該部件屬于哪一大類(display,mouse,scsi,network等)中的哪一類(網絡adapter,driver,transport,service,network和netprovidor),同時,還需要給出映像文件和配置文件所在的源介質及標識。  
            [returnoption]shell節(jié)。系統(tǒng)執(zhí)行安裝identify節(jié)后,執(zhí)行該節(jié)。它主要功能是檢查所需安裝的部件是否支持的硬件平臺和語言,并給出網卡名(有些配置文件支持多類網卡,此時必須讓用戶進行選擇,并獲得選擇結果)。  
            [installoption]shell節(jié)。該節(jié)是配置文件得主體,也是上次安裝完后再次進行配置、刪除、更新的入口點。主要功能是拷貝映像文件和配置文件,生成配置的各種選項,創(chuàng)建該部件在注冊庫中對應的各種登錄子樹并更新重寫。  

            第二節(jié)  驅動程序的加載過程
            §2.2.1  windows  nt的啟動過程
            第一階段:調入裝入程序。和硬件平臺相關,x86機器首先由rom裝入根扇區(qū),再由根扇區(qū)裝入ntldr;
            第二階段:硬件檢測。x86機器調ntdetect程序最大限度地獲取各種硬件設備信息,引導hal及基本卷設備驅動程序,以便引導nt內核;
            第三階段:獲取注冊庫中各種控制信息,如用戶定義的非頁內存大;第四階段:初始化注冊庫  \registry\machine下system和hardware并創(chuàng)建currentcontrolset,為裝入相關硬件設備驅動程序作準備;
            第五階段:裝入基本核心驅動程序;
            第六階段:釋放一些已經完成使命的裝入初始數據塊;
            第七階段:進一步初始化注冊庫,以便有些依賴于基本核心驅動程

            序的上層驅動程序能順利裝入;
            第八階段:服務控制器裝入應該由該服務控制器裝入的各種驅動程序。

            §2.2.2  fddi網卡驅動程序的加載過程
            在windows  nt啟動的第五個階段,將加載核心驅動程序。而對于ndis網卡驅動程序是在ndis接口(ndis.sys)加載后調入運行,向ndis  wrapper注冊、初始化、查詢設置參數等。
            windows  nt啟動時,相應的實體如nt的服務控制器根據注冊庫中yhfddi驅動程序的配置注冊信息,初始化ndis  wrapper,并裝入相應的驅動程序,生成驅動程序管理塊結構,申請內存以保存各種信息,向ndis  wrapper注冊驅動程序。初始化和注冊完畢后,再由服務控制器讀取注冊庫中相應的鏈接信息。
            在ndis  wrapper和yhfddi驅動程序初始化和注冊成功后,ndis  wrapper根據系統(tǒng)相應的注冊信息,加入和yhfddi驅動程序所對應的fddi網卡,同時讀入網卡的注冊信息,并進行網卡注冊和網卡初始化。
            在以上過程成功后,wrapper將查詢和設置驅動程序的各種參數,了解驅動程序對哪些操作支持,決定對上層驅動程序的支持范圍。
            第三節(jié)fddi網卡驅動程序的注冊
            driverentry函數是windows  nt  ddk規(guī)定的核心驅動程序的入口點,wrapper識別到入口點后,調入驅動程序,在driverentry函數內完成兩個基本注冊任務:
            調用ndisminitializewapper函數向ndis接口報告驅動程序將以miniport類網卡驅動程序注冊。ndis建立它需要記錄的驅動程序狀態(tài)信息,同時返回ndiswrapperhandle,驅動程序保存這個句柄,以利后來調用ndisxxxconfiguration和initialization等函數。  
            填寫ndisxx_miniport_characteristics屬性結構,主要記錄ndis版本號和驅動程序支持的miniportxxx函數的入口點,然后調用ndismregisterminiport函數實現驅動程序的整體注冊。  
            以yhfddi為例所要注冊的屬性結構的內容大致如下:
            ndis_miniport_characteristics  yhfddichar;
            (ndis_miniport_characteristics這個結構將在第三章介紹)
            yhfddichar.majorndisversion=yhfddi_ndis_major_version;
            yhfddichar.minorndisversion=yhfddi_ndis_minor_version;
            這兩個屬性決定驅動程序是ndis的哪個版本所支持,我們所用的是ndis3.0  
            yhfddichar.disableinterrupthandler=yhfddidisableinterrupt;
            yhfddichar.enableinterrupthandler=yhfddienableinterrupt;
            yhfddichar.isrhandle=yhfddiinterruptservice;
            yhfddichar.handleinterrupthandler=yhfddihandleinterrupt;
            以上四項屬性是中斷處理所需的上邊緣服務函數的入口點(句柄)。fddi網卡驅動程序需要有smt站管理功能,而smt是以中斷處理方式進行的,故這四項屬性在fddi網卡驅動程序中是很重要的。
            yhfddichar.initializehandler=yhfddiinitialize;
            此項注冊的是驅動程序的初始化函數句柄。
            yhfddichar.queryinformationhandler=  yhfddiqueryinformation;
            yhfddichar.setinformationhandler=yhfddisetinformation;
            這兩項注冊的是參數查詢和設置函數的句柄。
            yhfddichar.sendhanler=  yhfddisend;
            yhfddichar.transferdatahandler=  yhfdditransferdata;
            主要提供數據發(fā)送和接收函數句柄。
            yhfddichar.resethandler=yhfddireset;
            此項注冊網卡軟硬件重置函數句柄。  
            yhfddichar.halthandler=  yhfddihalt;
            此項注冊網卡驅動程序掛起函數句柄。
            yhfddichar.checkforhandler=null;
            yhfddichar.reconfigurehandler=null;
            這兩個上邊緣服務函數是fddi網卡驅動程序所不提供的,故置為null。
            填好這些結構以后,調用以下函數實現驅動程序的注冊:
            ndismregisterminiport(
            yhfddiwrapperhandle,
            &yhfddichar,

            sizeof(yhfddichar));
            其中yhfddiwrapperhandle是在此之前初始化wrapper調用ndisminitializewrapper所得的句柄。
            如果調用ndismregisterminiport不能返回ndis_status_success,必須在退出driverentry之前釋放已經分配的資源(如yhfddiwrapperhandle等),故調用
            ndisterminatewrapper(yhfddiwrapperhandle,null)。
            這樣驅動程序沒能正確注冊,亦不能正常運行。
            第四節(jié)  網卡驅動程序對象查詢與設置
            如果ndis的管理實體要查詢或設置一個特定的網絡對象,它必須提供一個32位的oid。oid的結構如下:  圖2.3.0  oid結構圖
            由上可以看到,oid可分為三大類:
            所有ndis驅動程序都有的一般對象;  
            特定介質的對象;  
            特殊的與具體實現相關的對象(如多目地址表的長度)。  
            一般的和特定介質的oid被記錄在windows  nt  ddk中,對于這些oid  ddk

            文本指明了相關的對象能否通過miniportqueryinformation查詢參數和通過miniportsetinformation設置參數。
            oid也可被分為操作特性(如多目地址表長度參數)和統(tǒng)計參數(如廣播包接收)。最后oid可分為必須的和可選的兩種。
            oid的前三個字節(jié)表明oid的不同類別,而最后一個字節(jié)確定這一類別內特定的信息管理對象。
            針對于fddi網卡,被查詢的oid的第一個字節(jié)為0x03。而ndis所查詢的介質相關參數為:
            0x03010104  oid_fddi_long_max_list_size
            0x03010108  oid_fddi_short_max_list_size
            0x03010102  oid_fddi_long_current_addr  
            0x03010106  oid_fddi_short_current_addr
            tcp/ip傳輸驅動程序所要查詢的fddi  oid為:
            0x03010102  oid_fddi_long_current_addr  
            0x03010103  oid_fddi_long_multicast_list
            0x03010107  oid_fddi_short_multicast_list
            通過以上兩階段的查詢,ndis和tcp/ip驅動程序就分別了解了網卡驅動程序對其的支持,從而進行相應的捆綁,以便數據傳輸時正確選擇網卡驅動程序。

            第五節(jié)  開發(fā)環(huán)境與調試方法
            開發(fā)環(huán)境:
            fddi網卡驅動程序的開發(fā)環(huán)境為nt  server  3.51,sdk,ddk  for  workstation  3.51,  vc++4.1,硬件平臺為586。
            調試平臺:
            主機為nt  server  3.51,windbg32
            目標機為nt  workstation3.51  (check  944)
            調試方法:
            ※利用dbgprint把目標機上關鍵信息通過串口傳到主機進行分析,以得出ndis驅動程序的調度機制和運轉狀況;
            ※利用assert產生異常斷點,由主機對異常進行控制
            ※自定義宏,進行分級控制,以根據不同情況產生不同調試信息  
            第四章  與smt移植相關的問題討論
            在本yhfddi網卡驅動程序中,smt的移植是極其關鍵的一部分,主要承擔了驅動程序中硬件初始化和中斷延遲處理。但由于smt是相對獨立的軟件,這樣就有一個ndis  wrapper與smt間參數傳遞的問題。所以本章主要討論miniport驅動程序與smt的關系和移植smt過程中初始化的要求、中斷處理的要求,ndis  wrapper與smt如何傳遞參數。
            (一)miniport  fddi網卡驅動程序與smt的關系。
            在第一章已經談及網卡驅動程序主要實現osi參考模型中的物理層和mac層。而對于fddi網絡的物理層又可分為介質相關子層和介質無關子層。
            對于我們的fddi/pci是基于x.3.19、x3.148、x3.166和x3.229而實現的。

            smt在整個iso七層模型中屬低兩層范疇。下圖是iso模型與fddi層次的對應關系,從而可知fddi  miniport驅動程序在nt網絡結構中的位置。
            即在windows  nt  fddi網卡驅動程序應包含smt,實現fddi拓撲環(huán)上的站管理。
            而在驅動程序內部smt主要是在miniport驅動程序中的中斷延遲處理上邊緣服務中實現的,也可以說是將smt嵌入中斷延遲處理程序中,實現ndis接口對smt的正確調度。
            yh-fddi驅動程序的實現可分為硬件無關部分和硬件相關部分。  
            移植smt過程中初始化的要求.  
            這里的初始化主要是指硬件初始化,包括寄存器的初始化和數據結構的初始化,由smt共用的硬件相關例程庫中硬件初始化部分來完成.  我們在開發(fā)過程序是調用fddi_main(bdd_t*bdd)這個函數來調用smt共用的硬件相關例程庫的.可見使用fddi_main(bdd_t*bdd)時,需要傳遞bdd這個參量,而bdd_t這個數據結構的定義如下:
            它包含了各類硬件寄存器的基址,所以要對其進行正確賦值就必須首先在nt的內存中映射一塊虛存與網卡內存相對應,也就實現了bdd_t結構的賦值,對fddi_main(bdd_t  *bdd)的正確調用.  
            因此,我們在調用fddi_main前首先將網卡上寄存器內存空間映射到nt的虛存空間上,并將bdd結構正確賦值.以映射bsi_phy_base為例,具體過程如下:
            pchar  destination;
            bdd_t  *bdd;
            ndis_physical_address  physicaladdress;
            ulong  baseaddress;
            ndis_status  status;
            baseadress  =0x0d0000+bsi_phy_base;
            ndissetphysicaladdresshigh(physicaladdress,0);
            ndissetphysicaladdresslow(physicaladdress,baseaddress);
            status=ndismmapiospace(
            (pvoid  *)&destination,
            miniportadapterhandle,
            physicaladdress,
            bsi_phy_len
            );
            bdd->bsi_vir_base=(pchar)  destination;
            adapter->  bdd->bsi_vir_base=  bsi_vir_base;  
            /*對adapter結構中的bdd結構賦值,以便在其它上邊緣函數中使用這些虛存基地址

            */
            中斷處理要求.  
            對于中斷處理,在smt中主要調用cspintrhandandler()來實現.我們的fddi網卡驅動程序是miniport方式的,若在isr中做此處理將占用大量系統(tǒng)資源,使系統(tǒng)崩潰,所以我們采用只在isr中進行中斷的排隊,而在dpc中調用cspintrhandler()來完成中斷處理.
            在中斷處理方面還有一個中斷屏蔽和中斷使能的問題,這兩方面smt并不提供,故我們要正確處理.
            具體處理方法見第三章.
            ndis  wrapper與smt間參數如何傳遞.  
            miniport方式的網卡驅動程序中,網卡上有中斷時,系統(tǒng)反映給ndiswrapper,再由wrapper調度中斷處理上邊緣服務實現中斷處理,在我們的yhfddi網卡驅動程序的中斷具體處理是smt完成的所以在調用cspintrhandler時應將adapter結構傳進smt以便在以后應用.
            如在處理接收中斷時,處理的最后應調用ndisindicatefddireceive,向ndiswrapper指示以接收到一個數據包,而ndisindicaterfddireceive的調用需要adapterminiporthandle作為參數,這就必須一級級從中斷延遲處理函數(yhfddi  handleinterrupt)中將adapter結構傳遞下來.  當然,其它方面如發(fā)送,也會有類似的問題需要考慮.
            總之,對于smt的移植,需要詳盡的在程序中做好接口,才能實現與
            smt的數據交換.
            結束語

            ndis規(guī)范在網絡兩層間提供了一個統(tǒng)一界面,ndis對網絡本身而言,是一個帶有協(xié)議功能的標準接口,對實現者而言,它應該是一個環(huán)境,這種環(huán)境不僅帶有協(xié)議功能,更重要的是帶有和軟、硬平臺無關的核心功能支持,它不會受軟、硬平臺的變化嚴重影響,無疑,它是軟件的移植和兼容的可靠保證,ndis把網絡的一部分共性抽象出來,并根據具體的操作系統(tǒng)實現系統(tǒng)和平臺相關的基礎庫以保證ndis的標準性和對開發(fā)者提供最大的功能支持,這也將加速和規(guī)范開發(fā)過程,但是,在操作系統(tǒng)之上提供ndis基礎庫獲得標準同時也失去直接作用于操作系統(tǒng)帶來的靈活性以及更強的功能支持,同時,ndis處于網絡中層和低層之間,低層網絡的快速發(fā)展和ndis對網絡部分共性的抽象必然導致ndis對實現者的滯后,例如ddk3.51提供的ndis開發(fā)環(huán)境只支持10m以太網、fddi、令牌網(802.5)、localtalk、arcnet等,而對新出現的快速以太網及atm不提供支持,這對我們如何在ndis環(huán)境下實現諸如atm的lan  emulation,ip  over  atm、快速以太網帶來很大問題。
            smt是實現fddi網卡驅動程序的關鍵,然而由于應用ddk開發(fā)miniport驅動程序時要遵循其結構框架,所以要想完整地按其結構移植smt,就必須分解smt適應之,即要求對smt有一個很好的理解。但smt是龐大的給開發(fā)帶來了一定的困難。
            參考文獻
            【1】《device  driver  kit用戶手冊》
            【2】《device  driver  kit核心驅動程序設計》  
            【3】《device  driver  kit網絡驅動程序設計》
            【4】《windows  nt核心內幕》
            【5】《windows  nt資源》之三《性能評測》 


            【windows nt環(huán)境下fddi網卡驅動程序設計 2】相關文章:

            windows nt環(huán)境下fddi網卡驅動程序設計08-06

            WindowsCE.Net下CAN卡的驅動程序設計08-06

            VxWorks下PC/104-CAN驅動程序設計08-06

            Windows NT中的登記項及其完整性08-06

            Windows CE中實現藍牙串口驅動程序08-06

            在Linux下驅動STN彩色LCD08-06

            PCI傳輸卡的WDM驅動程序設計08-06

            Windows下多串口的配置與使用08-06

            Windows CE下串行通信的實現08-06