在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

老式ISA設備的WDM驅動程序的開發與實現

牽手一起夢 ? 來源:電子技術應用 ? 作者:張龍 ? 2020-10-04 17:03 ? 次閱讀

ISA設計在WINOWS新的驅動程序模型WDM(WINDOWS DRIVER MODEL)中沒有獲得很好的支持,使用WDM實現需要一些特殊處理。主要討論老式ISA設備的WDM驅動程序的設計與實現。

WDM作為微軟為WINDOWS 2000及以后版本準備的新驅動模型,它可以在WINDOWS 98及以后的操作系統上共享。這種具有跨平臺性的設備驅動模型可以大大簡化驅動程序的開發工作。WDM支持PNP(即插即用),為用戶的PNP設備驅動完成了大量的底層工作。這也使得WDM對各種老設備,特別是那些不具有即插即用特性硬件的支持明顯的不足。在科研和工控中,最常用的數據采集卡通常都是基于PC總線的不能為PNP提供硬件支持的ISA設備。為這類硬件編寫非WDM驅動程序只能局部支持PNP特性,而且需要做大量額外的工作如:必須檢測硬件,為硬件創建設備對象(用于代表硬件),配置并初始化硬件使其正常工作,這些工作非常復雜。利用WDM可以避免這些麻煩。

1 WDM的結構

WDM實際上是一個編寫驅動程序的規范。其驅動程序結構的特點和WINDOWS程序設計的消息驅動機制很相像,采用IRP驅動機制。WINDOWS 98和WINDOWS 2000處理IRP的方式一樣,本質卻完全不同。

WINDOWS 2000主要由I/O管理器來管理驅動程序的行為,管理的方法就是給驅動程序發送各種IRP,同時I/O管理器還負責傳遞這個設備的用戶請求給驅動程序。驅動程序不能直接操作硬件設備,而是通過一個叫做HAL(硬件設備抽象層)的層來訪問底層設備。HAL完成對各種硬件差異的屏蔽。Windows 98內核與Windows 2000內核有很大的差別。Windows 98操作系統的內核稱為虛擬機管理器(VMM)。虛擬設備驅動程序(VxD)則使設備虛擬化,從而與虛擬機管理器形成虛擬機。Windows 9x的內核不支持IRP,它通過模擬的方法支持WDM和IRP。Windows 98包含了NTKERN.VXD(VMM32.VXD)系統模塊,該模塊含有大量Windows NT內核支持函數的Windows實現。NTKERN.VXD使用與Windows 2000相同的方式創建IRP并發送IRP到WDM驅動程序。也就是說,Windows 98是使用VxD技術實現WDM的。盡管Windows 98和Windows 2000的內核完全不同,但是WDM的結構在Windows 98和2000下可以認為是完全相同的。

WDM驅動程序面對的主要內容是一系列內核驅動對象。這些對象包括驅動對象、設備對象,還有一系列的資源抽象對象如中斷對象、適配器對象(處理DMA操作)、內核模式派發器對象、控制器對象、推遲過程對象、定時器對象、設備隊列對象、回調對象等。其中驅動對象由I/O管理器負責創建和管理。設備對象代表用戶需要操作的物理或者是邏輯設備。設備對象負責管理自己設備所需要的各種資源對象。這些資源對象有的代表真正的物理設備如中斷對象、適配器對象、定時器對象;有的對象則是邏輯對象,它們是操作系統實現自己的特性所必需的,如推遲過程調用就是與操作系統的搶占式多任務的實現有關。WDM驅動程序利用IRP和這些對象完成硬件設備的抽象化,并對應用程序提供統一操作接口。這就是所謂的WDM規范。

WDM驅動程序的結構很簡單。它的主體是一個入口函數DriverEntry。DriverEntry的第一個參數是指針,指向一個剛被初始化的驅動程序對象,該對象代表驅動程序。WDM驅動程序的DriverEntry例程完成這個對象的初始化并返回。WDM驅動程序的DriverEntry例程的主要工作是把各種函數指針填入驅動程序對象。這些指針對操作系統指明了驅動程序容器中各種子例程的位置。它包括下面這些指針成員:

·DriverUnload指向驅動程序的清除例程。I/O管理器會在卸載驅動程序前調用該例程。通常WDM驅動程序的DriverEntry例程一般不分配任何資源,所以DriverUnload例程也沒有什么清除工作要做。

·DriverExtension->AddDevice指向驅動程序的AddDevice函數。AddDevice函數是WDM驅動程序的一個特殊函數,PNP管理器為每個設備實例調用該函數。它創建一個設備對象并把它連接到該驅動程序的設備堆棧中。在這個函數里,設備對象被創建,設備需要的中斷、DMA等資源被掛接到這個設備對象上,相應地處理函數,如中斷服務例程等也被指定。

·DriverStartIo,如果驅動程序使用標準的串行IRP,則必須使用這個函數,使它指向驅動程序的StarIo例程。

·MajorFunction是一個指針數組,它主要處理各種用戶的I/O請求IRP。默認情總況下,用戶的所有I/O請求都會由I/O管理器返回失敗。驅動程序為要處理的IRP指定相應的派遣函數。

此外,還有一些重要的例程如用于處理中斷操作中斷服務例程,為了提高系統中斷處理效率的中斷服務推遲調用例程等。

驅動程序的其余部分就是前面所指定的那些例程的實現。

2 為ISA設備分配資源

雖然WDM驅動程序可以簡化很多工作,但是給ISA設備編寫WDM驅動程序也有困難。這個困難是ISA設備所需資源的分配問題。根據PNP的規范,支持PNP的設備如PCI總線設備有相應的寄存器標識自己和自己可以接受的資源,如中斷、端口范圍、內存范圍等,并且有相應的邏輯支持配置資源。這使得操作系統啟動過程中可以動態地規劃調整各個設備的資源而不需要用戶的干預。為了使ISA設備具有這種PNP的特性,

可以通過PNP管理器和INF文件完成ISA設備的自動資源分配。PNP管理器(PNP AMNAGER)依賴INF文件完成PNP管理。INF文件為設備、設備驅動程序、操作系統的安裝過程提供信息(包括PNP MANAGER)。為了兼容非PNP設備,INF文件支持幾個命令為設備分配資源。這些信息初提供給NPN管理器,并且被PNP管理器用來與系統其它部分協商以完成非PNP設備的自動資源分配。LOGCONFIG為設備制定一個可選的資源設定。還有相應的IRQCONFIG、IOCONFIG、DMACONFIG、MEMCONFIG子命令,它們為設備指定具體的可選資源。語法如下:

[<log-config-section-name>]

ConfigPririty=<priority-value>

[DMAConfig=<dma-list>]

[IOConfig=<io-range-list]

[IRQConfig=<irq-list>]

[MemConfig=<mem-range-list>]

其中CONFIGPRIOITY命令指定這個LOGCONFIG項的優先級。其余子命令表示設備選用的硬件資源。下面是一個例子:

在INF文件中加入LOGCONFIG命令可以解決ISA總線設備資源的自動分配問題,就可以為ISA總線設備編寫WDM驅動程序。

3 一個ISA設備WDM驅動程序的實現

使用Numega公司的開發工具DriverStudio 2.01可以大大地簡化驅動程序的開發過程。DriverStudio開發通用內核模式的開發包是DriverWorks。DriverWorks是一個面向對象的工具包。它封裝了比較底層的繁復操作,提供給開發者一個簡潔的界面。同時,DriverWorks和Visual C++有很多的接口:DriverWorks專門為Visual C++提供了一個專門開發WDM驅動程序的WIZARD。在WIZARD指導下,開發者可以很容易地生成一個驅動程序的框架。開發者要作的工作就是根據特定硬件編寫相應的代碼。

WIZARD生成的框架不僅包括設定設備的資源如中斷、IO端口范圍、內存范圍;還包括自動生成驅動程序與應用程序的接口命令及處理這些命令的處理函數,生成標準驅動程序的標準驅動程序例程;包括DriverEntry驅動程序入口例程、UnLoad卸載例程、Dispach標準派發器例程、StartIO標準I/O傳輸例程、中斷處理例程等。對于WDM驅動程序,包括生成驅動程序接口(WDM專有),設備的符號連接,I/O傳輸方式以及WDM電源管理和處理PNP請求的IRP處理子程序。WIZARD完成后的代碼主要包括兩類,一類是驅動對象,它構成一個驅動程序的框架;另一類是驅動程序的設備對象。驅動程序對象負責創建并管理驅動程序設備對象。設備對象負責管理硬件的各種資源如I/O、IRQ、DMA。它還負責處理各種IRP的例程。設備對象是系統所有I/O操作的基石,一個驅動程序必須有一個或一個以上的設備對象才真正有意義。驅動對象和設備對象的關系很象WINDOWS系統中進程和線程的關系:進程是可執行代碼(就是線程)的框架。如果說驅動對象是WINDOWS中的進程,那么設備對象就像進程中的線程,它們完成實現的I/O操作。設備對象使用保護成員變量來管理設備的資源,使用成員函數來處理各種IRP請求,并由這些函數完成實現的I/O操作。

開發的高速旋轉機械監控與故障診斷系統采用的是北京大恒公司的具有FIFO(隊列形式實現的緩存)的8路數據采集卡AC 1810。它的特點是由硬件自動完成采用操作:當FIFO半滿的時候,系統產生中斷通知用戶取走數據;同時,硬件繼續自動采樣FIFO的另一關。驅動程序的主要工作包括設備I/O讀操作和中斷服務操作。下面是WIZARD生成的驅動對換和設備對象的定義(只取主要部分):

// 驅動對象

class AC_1810 : public Kdriver

{

SAFE_DESTRUCTORS

public:

virtual NTSTATUS

DriverEntry(PUNICOE-STRING

RegistryPath);

//驅動程序的入口函數

virtual NTSTATUS

AddDevice(PDEVICE_OBJECT Pdo);

//完成設備對象和驅動對象的連接

……

};

//設備對象

class AC_1810Device : public KpnpDevice

{

// Constructors

public;

AC-1810Device(PDEVICE_OBJECT Pdo,

ULONG Unit);//構造函數完成資源配置

……

public:

AC_1810Device(PDEVICE_OBJECT Pdo,

ULONG Unit);//構造函數完成資源配置

……

public:

BOOLEAN Isr_Irq(void);// IRQ中斷服務例程

Virtual NTSTATUS Create(KIrp I);

//標準IRP處理函數

virtual NTSTATUS Close(KIrp I);

// COMMENT_ONLY

virtual NTSTATUS Read(KIrp I);

// COMMENT_ONLY

virtual VOID StarIo(KIrp I);

// 開始I/O傳輸

VOID CancelQueuedIrp(KIrp I);

// 判斷傳輸IPR是否被取消

VOID Invalidate(void);

// 釋放資源例程

virtual NTSTATUS DefaultPnp(KIrp I);

// 處理默認的PNP操作

virtual NTSTATUS DefaultPower(KIrp I);

// 管理電源

void SerialRead(KIrp I);

//完成實際的I/O操作

NTSTATUS IOCTL_SETUP_Handler(KIrp I);

//采樣參數設定

NTSTATUS IOCTL_REW_Handler(KIrp I);

// 開始/停止采樣

……

protected:

KioRange m_IoPotrRange0

// 管理I/O資源

Kinterrupt m_Irq;

// 管理中斷資源

……

};

在實際操作過程中,采用中斷讀數的方法。在驅動程序中設置了兩個緩沖區,一個前臺緩沖區,一個后臺緩沖區(用作后備緩沖區),系統總是先使用前臺緩沖區。當前臺緩沖區已滿而仍然未被讀出,系統觸發中斷時,此時使用后臺緩沖區。讀數的方法很簡單,系統先讀前臺緩沖區的數據,只有當前臺緩沖區未滿而后臺緩沖區滿的時候才讀后臺緩沖區。這樣可以保證采樣數據序列的時間順序。

具體實現如下:

// ISR例程,完成數據從FIFO中讀出

BOOLEAN AC_1810Device::Isr_Irq(void)

{

//是否觸發不斷?未觸發則返回,判斷兩個緩沖區情況,都滿則返回

……

//

前臺緩沖區未滿,使用前臺緩沖區

if(m_pBuffer->numused < MAX_READ_BUF){

for(int i=0;i<BLOCK_SIZE;i++){

m_pBuffer_>buff[m_pBuffer->numused+i]=READ_FIFO;

}

m_pBuffer->numused +=BLOCK_SIZE;

}

else

//完成其它情況的判斷

……

return TRUE;// 中斷成功返回

}

當應用程序使用標準Win32 API對設備進行讀操作的時候,I/O管理器通知驅動程序并觸發對Read函數的調用。對于通常的串行設備,在Read函數的最后排隊IRP請求,此時系統就可以觸發StartIO例程,并且保證這個過程是串行處理的。

// 讀例程,處理IRP_MJ_READ

NTSTATUS AC_1810 Device::Read(KIrp I)

{

// 檢查輸入的合法性

if (I.ReadSize ()<BLOCK_SIZE){

// 不合法返回錯誤代碼

I.Information()=0;

Return

I.PnpComplete(this,STATUS_INVALID_PARAMETER);

}

// 讀0字節,永遠成功

if (I.ReadSize() = =0){

I.Information () = 0;

return

I.PnpComplete(this,STATUS_SUCCESS);

}

// 排隊這個IRP觸發StarIO,完成數據傳輸

return QueueIrp(I,LinkTo(CancelQueuedIrp));

}

// StartIo例程,完成I/O操作

VOID AC_1810 Device::StartIo(KIrp I)

{

// 檢測這個IRP是否被取消

if(!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp),NULL,CurrentIrp())

{

return;//取消則返回

}

switch (I.MajorFunction()) {

case IRP_MJ_READ:

//這個函數按邏輯完成讀操作

SerialRead(I);

Breadk

……

// 開始處理下一個IRP

PnpNextIrp(I);

break;

}

}

ISA卡的WDM驅動程序的主體部分就完成了。它具有PNP功能,可以方便地安裝卸載。在中斷到來的時候,系統使用兩個緩沖區完成數據的傳輸,可以避免數據丟失。

以上驅動程序是使用Numega公司的DriverSutdio 2.01版,結合Visual C++ 6.0,Microsoft Windows 2000 sp1 DDk開發調試通過,并且成功地應用到實驗室開發的高速旋轉機械實時狀態監控與故障診斷系統中,該系統界面友好高度可靠。同時由于加入了PNP的支持,使得該系統的硬件安裝卸載非常簡便。這種技術可取代傳統的以DOS為核心的工業用監控與故障診斷系統,具有廣闊的應用前景。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據采集
    +關注

    關注

    39

    文章

    6100

    瀏覽量

    113652
  • WINDOWS
    +關注

    關注

    3

    文章

    3545

    瀏覽量

    88689
  • 虛擬機
    +關注

    關注

    1

    文章

    917

    瀏覽量

    28193
收藏 人收藏

    評論

    相關推薦

    如何為ISA設備編寫WDM驅動程序

    /XP/2003操作系統。這種具有跨平臺性的設備驅動模型可以大大簡化驅動程序開發工作,為用戶的PNP設備
    的頭像 發表于 10-17 08:30 ?4891次閱讀

    分享:基于PCI總線的雙DSP系統及WDM驅動程序設計

    摘要:介紹了PCI總線控制芯片PCI2040的功能及內部結構,分析了基于PCI總線的雙DSP通信的硬件結構及實現方法,并描述了利用Windows2000 DDK開發WDM設備
    發表于 09-24 22:18

    基于WDM的并口驅動程序該如何去實現

    什么是并口EPP模式?基于WDM的并口驅動程序該如何去實現?并口EPP模式外圍電路硬件設計實例是什么?
    發表于 06-02 07:20

    WDM設備驅動程序開發,Windows 2000/XP WD

    Windows 2000/XP WDM設備驅動程序開發主要介紹DriverStudio開發工具開發
    發表于 09-13 22:58 ?0次下載
    <b class='flag-5'>WDM</b><b class='flag-5'>設備</b><b class='flag-5'>驅動程序</b><b class='flag-5'>開發</b>,Windows 2000/XP WD

    Windows 2000/XP下I/O設備驅動程序的設計

    本文介紹了Windows 2000/XP 下WDM 驅動程序的基本設計方法;闡述了I/O 設備驅動程序的基本構成,硬件資源的配置和訪問的方法;提出了
    發表于 06-12 13:46 ?18次下載

    IEEE 1394設備WDM驅動程序設計

    文 中結合IEEE1 394總線規范及具體應用實例,開發了IEEE1394設備WDM驅動程序,詳細介紹了在Windows2 000/xp環境下利用DDK
    發表于 07-10 15:50 ?40次下載

    WDM設備驅動程序開發中的若干問題

             為實現儀器系統中全自動化的需要及解決數據采集卡中AD 和DA 的同步問題,采用WDM 設備
    發表于 09-09 08:53 ?21次下載

    基于Windows NT平臺的USB設備驅動程序開發

    介紹了 National Semiconductor 公司的USBN9603 /USBN9604 模塊在Microsoft Windows NT 平臺上PC 端USB設備驅動程序開發過程以及該
    發表于 09-10 16:29 ?43次下載

    USB設備WDM驅動程序設計

    本文介紹了WDM驅動模型,并且針對USB總線給出了USB設備WDM驅動程序的設計方法
    發表于 10-13 15:48 ?0次下載

    PCI設備WINDOWS驅動程序開發

    PCI設備WINDOWS驅動程序開發 本文主要介紹了在Windows9x操作系統下開發PCI設備驅動
    發表于 05-03 11:54 ?3328次閱讀

    PCI設備WDM驅動程序開發

    本文簡要介紹了WDM驅動程序的結構體系,之后結合PCI設備的結構特點,通過實例說明如何利用驅動程序開發工具DriverWorks
    發表于 05-19 18:11 ?0次下載

    Windows WDM設備驅動程序開發指南

    書主要介紹Windows 98和Windows 2000新的驅動程序模型(WDM)。描述了WDM設備驅動程序的結構、功能和
    發表于 12-12 15:31 ?0次下載
    Windows <b class='flag-5'>WDM</b><b class='flag-5'>設備</b><b class='flag-5'>驅動程序</b><b class='flag-5'>開發</b>指南

    Windows 2000下WDM驅動程序的研究與開發

    本文分析研究了 Windows 2000 下 WDM 驅動程序的基本原理。以 Microsoft 的 DDK 為開發工具,開發了基于 PCI 總線的通信接口板的
    發表于 04-18 10:02 ?0次下載

    Linux設備驅動程序的平臺驅動程序和字符驅動程序介紹

    了解Linux設備驅動程序的基礎知識,重點介紹平臺驅動程序和字符驅動程序。 提出了簡單的平臺驅動程序
    的頭像 發表于 11-27 06:32 ?4308次閱讀

    基于WDM驅動程序模型實現過濾器驅動程序開發設計

    的升級,WDM已經成為Windows 2000系統下驅動程序開發的主流。作為WDM模型之中一類特殊的驅動程序,過濾器
    的頭像 發表于 09-19 15:54 ?3189次閱讀
    基于<b class='flag-5'>WDM</b><b class='flag-5'>驅動程序</b>模型<b class='flag-5'>實現</b>過濾器<b class='flag-5'>驅動程序</b>的<b class='flag-5'>開發</b>設計
    主站蜘蛛池模板: 免费视频性| 天天怕夜夜怕狠狠怕| 久久亚洲国产午夜精品理论片| www.夜夜操| 中文字幕第十页| 美女拍拍拍黄色| 天堂网在线资源| 亚洲一区二区免费在线观看| 四虎精品影院永久在线播放| 国产精品毛片在线大全| 加勒比黑人喝羽月希奶水 | 国产精品污视频| 欧美成人福利| 美女网战色| 樱桃磁力bt天堂| 黄 色 录像成 人播放免费| 精品久久久久久久免费加勒比| 狠狠色噜噜狠狠狠狠97影音先锋| 免费人成黄页在线观看日本 | 天天视频黄| 日本免费一区二区三区视频| 欧美三级在线观看黄| 色日韩在线| 在线黄色免费观看| 国产成人精品亚洲日本在线| 欧美特黄三级在线观看| 日本在线观看成人小视频| 天天视频官网天天视频在线| 国产成人精品亚洲日本在线观看| 国产一区二区三区欧美精品| 1024手机最新手机在线| 色多多在线观看| 美女网战色| 天堂网bt| 天堂网www中文天堂在线| 月夜免费观看完整视频| 岛国三级在线看| 亚洲精品第三页| 狠狠色成色综合网| 国产大片黄在线看免费| 女人张腿让男桶免费视频网站|