<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Windows 2000內核模式驅動(dòng)程序設計

Windows 2000內核模式驅動(dòng)程序設計

作者: 時(shí)間:2012-05-15 來(lái)源:網(wǎng)絡(luò ) 收藏

2000和98中,通過(guò)使用總線(xiàn)程序,PnP管理器能夠自動(dòng)檢測硬件和分配I/O資源。在WDM程序中PnP管理器使用主功能代碼為IRP-MJ-PNP的I/O請求包與設備程序交換信息和請求,完成對硬件設備的檢測和配置工作。PnP請求包完成2種功能:指示驅動(dòng)程序何時(shí)又如何配置和取消硬件及驅動(dòng)程序本身的設置;指導驅動(dòng)程序完成一系列的狀態(tài)轉換。PnP請求可以包含二十多個(gè)次功能代碼,部分功能代碼(如IRP-READ-CONFIG,IRP-MN-QUERY-RE-SOURCE-REQUIREMENTS等)只能由總線(xiàn)驅動(dòng)程序處理,功能驅動(dòng)程序和過(guò)濾驅動(dòng)程序只是將該IRP請求下傳到總線(xiàn)驅動(dòng)程序。對功能驅動(dòng)程序和過(guò)濾驅動(dòng)程序中比較重要的IRP-MN-START-DEVICE用來(lái)通知功能驅動(dòng)程序其硬件被賦予了什么的I/O資源,以及指導功能驅動(dòng)程序做任何必要的硬件或軟件設置,以便設備能正常工作。IRP-MN-REMOVE-DEVICE告訴功能驅動(dòng)程序關(guān)閉設備并釋放與之關(guān)聯(lián)的設備對象。

驅動(dòng)程序的ISR和DpcForIsr在設備產(chǎn)生中斷時(shí)共同向設備提供服務(wù)。當設備產(chǎn)生中斷時(shí),驅動(dòng)程序的ISR將被調用,ISR通過(guò)詢(xún)問(wèn)設備硬件收集有關(guān)的硬件設備信息,并盡可能地處理,如果不可能完全處理該中斷請求,就將中斷信息傳遞給Dpc-ForIsr進(jìn)行處理。ISR是運行在DIRQL中斷請求級的,在運行時(shí),會(huì )阻止在同一處理器上的所有設備發(fā)出的具有更低的DIRQL的中斷,因此在驅動(dòng)程序的編寫(xiě)時(shí),ISR應盡可能快地返回控制。另外,ISR可以與驅動(dòng)程序的其它部分共享數據和硬件資源,因此需要注意同步問(wèn)題的處理。

3WDM驅動(dòng)程序開(kāi)發(fā)環(huán)境及編譯

2000下編寫(xiě)驅動(dòng)程序的環(huán)境被稱(chēng)為DDKForMicrosoftWindows2000或Windows2000DDK,DDK是一個(gè)命令行下的工作環(huán)境。在安裝DDK前需要先安裝Micro-softVisualC++和Win32SDK(可選)。對驅動(dòng)程序的編譯可以通過(guò)設置VC++的項目設置,在VC++中直接編譯驅動(dòng)程序,但改變設置的工作較繁且易出錯,因此DDKbuild.exe編譯聯(lián)接器是構造驅動(dòng)程序的主要工具。它從配置文件Sources中讀出待編譯的程序的配置,包括源文件、目標文件等,從環(huán)境變量Include中得到引用文件的地址,然后調用VisualC++的編譯聯(lián)接器Nmake.exe進(jìn)行實(shí)際的編譯聯(lián)接工作。

另外,build編譯聯(lián)接器還可以通過(guò)查看DIRS文件中的偽指令,確定要編譯的驅動(dòng)程序目錄列表。日志文件build.log、build.wrn,build.err中分別記錄了編譯聯(lián)接中執行的命令行、遇到的錯誤和警告。編譯完成后的文件后綴為.sys。

驅動(dòng)程序的調試是在原代碼級進(jìn)行的,可以用微軟公司提供的WinDbg調試工具,但需要在兩臺以串口聯(lián)接的計算機上進(jìn)行。而NUMEGA公司的SOFTICE比較方便地在一臺計算機上進(jìn)行核心代碼的調試。

4ATM信令接口卡的驅動(dòng)例程分析

我們開(kāi)發(fā)的ATM信令接口卡硬件符合PCI2.1標準,其與應用程序的數據傳輸為DMA方式。主要部分代碼如下。

在該驅動(dòng)程序入口部分中我們完成了各個(gè)分發(fā)例程入口的設置工作。

AtmPnp例程中完成對硬件資源的的檢測和配置工作,并且初始化請求隊列,獲得完成DMA傳輸的DMA適配器對象,掛接中斷處理對象等功能。

在A(yíng)ddDevice函數調用IoCreateDevice函數中創(chuàng )建一個(gè)設備對象,并通過(guò)調用IoAttachDe-viceToDeviceStack把它聯(lián)接到以PDO為底的設備堆棧中。

在PnP例程中對IRP-MN-START-DEVICE的處理代碼如下。

在處理中斷資源時(shí)給出的IoConnectInterrupt函數掛接了中斷處理函數AtmHandlerInter-rupt。

其他函數實(shí)現不再一一介紹。在具體實(shí)現的數據的傳輸、工作的設置等功能與所使用的硬件的寄存器的工作有關(guān)。在設計的過(guò)程中,應該注意每個(gè)例程的運行中斷級。在處理I/O請求時(shí),應根據硬件的特性和API的要求決定IRP隊列的方式及取消IRP的例程的編寫(xiě)。

在編寫(xiě)驅動(dòng)程序前,應該盡量了解硬件本身。這包括硬件的總線(xiàn)結構、控制寄存器的訪(fǎng)問(wèn)方式、中斷行為、數據傳輸機制和設備內存等。

5小結

驅動(dòng)程序的編寫(xiě)是較復雜的過(guò)程,因驅動(dòng)程序是操作系統信任的組件,任何細小的錯誤可能引起操作系統的崩潰,在驅動(dòng)程序編寫(xiě)過(guò)程中,應該反復測試所寫(xiě)的代碼,并遵循驅動(dòng)程序的規則??傊?,開(kāi)發(fā)驅動(dòng)程序的工作與開(kāi)發(fā)Windows應用程序開(kāi)發(fā)是完全不同的,且與驅動(dòng)程序緊密相連的硬件都有自己的硬件和軟件規范,本文從一般驅動(dòng)程序概念出發(fā),給出了驅動(dòng)程序的總體描述和組成部分,并以部分例程代碼為例給出了驅動(dòng)程序的基本組成結構和注意問(wèn)題。要想能夠很好掌握驅動(dòng)程序開(kāi)發(fā),最根本是閱讀DDK文檔并實(shí)踐編寫(xiě)驅動(dòng)程序。

c++相關(guān)文章:c++教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>