亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        自動測試儀器硬件板卡識別技術(shù)研究

        2011-04-26 02:31:12錢光弟
        中國測試 2011年3期
        關(guān)鍵詞:句柄板卡驅(qū)動程序

        田 娜,錢光弟,李 力

        (電子科技大學(xué)自動化工程學(xué)院,四川 成都 611731)

        0 引 言

        自動測試系統(tǒng)中,因同一個(gè)系統(tǒng)的不同板卡有不同的PID和VID,所以設(shè)備驅(qū)動通常使用PID和VID來識別設(shè)備。但這種方法會導(dǎo)致硬件使用過程復(fù)雜化,同時(shí)也不利于硬件升級。該文提出了一種通過對板卡的位置信息來識別同類硬件設(shè)備的識別技術(shù)。同類設(shè)備具有相同的PID和VID,可以在設(shè)備管理器中查詢硬件的位置信息(如總線號、功能號和設(shè)備號等)。通過這3個(gè)位置信息可以區(qū)分同類板卡,這種方法利于硬件的升級和簡化了板卡使用的過程。以PCI板卡為例說明硬件在PC機(jī)的加載識別過程,介紹軟件識別的概念及驅(qū)動和應(yīng)用程序的編寫。

        1 PCI板卡加載過程

        以PCI板卡設(shè)備為例,對硬件在PC機(jī)的加載識別過程加以說明。PCI板卡設(shè)備插入機(jī)箱后,CPU在系統(tǒng)初始化階段(POST)為各個(gè)PCI設(shè)備進(jìn)行資源分配。資源分配完畢后,PCI設(shè)備的驅(qū)動程序根據(jù)PCI Vendor Id和 Device Id以及 Revison Id進(jìn)行PCI總線搜索,查看是否存在符合本驅(qū)動的設(shè)備。找到設(shè)備后,驅(qū)動程序根據(jù)板卡的硬件設(shè)計(jì)情況,進(jìn)行相應(yīng)的寄存器初始化和中斷掛載工作。

        因?yàn)镻CI總線的資源分配是在POST過程中動態(tài)分配的,所以根據(jù)系統(tǒng)配置不同,各板卡所分配的資源也不相同(即所謂PnP-即插即用)。

        PCI總線搜索通常是按深度優(yōu)先的順序進(jìn)行搜索。如果有同種型號的PCI設(shè)備存在于PCI總線上,設(shè)備驅(qū)動應(yīng)依次對板卡設(shè)備進(jìn)行初始化。而當(dāng)多個(gè)板卡實(shí)例采用同一驅(qū)動時(shí),驅(qū)動程序?qū)Ω鱾€(gè)板卡的區(qū)分僅僅是對其總線位置信息的區(qū)分。通過驅(qū)動程序可以獲取以下信息:(1)驅(qū)動程序可以驅(qū)動的PCI設(shè)備數(shù)量(在總線上找Id符合的PCI設(shè)備數(shù)量);(2)PCI設(shè)備占用的系統(tǒng)資源(包括IO,MEM地址,IRQ及這些設(shè)備所在的總線位置信息-PCI總線x,Device y,F(xiàn)unction z)。由此可見,雖然系統(tǒng)資源分配不固定,但是PCI設(shè)備位置固定。該文所述驅(qū)動通過PCI板卡的位置信息來訪問同類板卡設(shè)備。

        2 識別

        識別就是獲得硬件的設(shè)備句柄。設(shè)備句柄是用于標(biāo)識設(shè)備的一個(gè)標(biāo)識符,是在Windows操作系統(tǒng)中用來標(biāo)識被應(yīng)用程序所建立或使用的硬件對象的唯一整數(shù)。

        應(yīng)用程序通過調(diào)用一個(gè)API函數(shù)CreateFile來獲得一個(gè)設(shè)備句柄,之后其他的函數(shù)就可以使用該設(shè)備句柄來訪問設(shè)備。

        由于同一個(gè)PC機(jī)每個(gè)硬件的句柄不同,在Windows操作系統(tǒng)中,用戶需要獲得硬件設(shè)備的句柄,才能調(diào)用驅(qū)動程序。驅(qū)動程序是一個(gè)獨(dú)立的黑盒,在操作系統(tǒng)中扮演著特殊的角色,它是應(yīng)用程序和硬件之間通信的橋梁。

        3 WDM驅(qū)動模型

        該驅(qū)動基于微軟提出全新的WDM驅(qū)動模型開發(fā),支持即插即用、電源管理和WMI驅(qū)動。WDM驅(qū)動主要例程如圖1所示。

        圖1 WDM主要例程

        WDM驅(qū)動程序就是一些例程的集合體,它們被動地存在,等待主機(jī)系統(tǒng)軟件來調(diào)用或激活。不同的驅(qū)動程序完成的功能不同,其所包含的例程也不同,下面介紹WDM驅(qū)動程序中常用的6個(gè)例程[1]:

        (1)入口例程。內(nèi)核模式驅(qū)動程序入口點(diǎn),I/O管理程序在驅(qū)動程序首次裝入時(shí)調(diào)用該例程。入口例程執(zhí)行所有的第1次初始化任務(wù)。

        (2)即插即用例程。處理PnP設(shè)備的添加、刪除和停止,它將自動在系統(tǒng)中找到一個(gè)未被占用或沒有沖突的中斷地址分配給新添加的硬件設(shè)備,而不需要人工干預(yù)。

        (3)AddDevice例程。對于參與即插即用的WDM驅(qū)動程序來講,完成硬件分配。

        (4)分發(fā)例程。處理用戶應(yīng)用程序發(fā)出的各種I/O請求,分發(fā)例程處理IRP,或者通過判斷IRP來調(diào)用相應(yīng)的例程。

        (5)電源管理例程。處理電源管理請求。

        (6)Unload卸載例程。處理驅(qū)動程序的卸載。

        4 多卡識別驅(qū)動編寫

        4.1 AddDevice例程

        在WDM的驅(qū)動中,每個(gè)硬件板卡對應(yīng)一個(gè)設(shè)備實(shí)例,PnP管理器為每個(gè)設(shè)備實(shí)例調(diào)用AddDevice例程,并創(chuàng)建一個(gè)設(shè)備對象把它連接到以Pdo為(物理設(shè)備)底的設(shè)備堆棧中[2]。

        AddDevice例程有一個(gè)輸入?yún)?shù)Pdo,是由底層驅(qū)動創(chuàng)建的的物理設(shè)備對象。在這個(gè)例程中調(diào)用DDK函數(shù)IoGetDeviceProperty,通過改變此函數(shù)的第2個(gè)參數(shù),即可返回設(shè)備的總線號、設(shè)備號和功能號。典型代碼如下:

        將得到的板卡設(shè)備、功能號,保存在m_ulUINumber變量中,其中高16位是設(shè)備號,低16位是功能號。將 IoGetDeviceProperty(Pdo,

        得到板卡的總線號,保存在m_ulUINumber變量中。把讀回來的設(shè)備號、功能號和總線號放在全局變量中,以便以后識別使用。

        4.2 分發(fā)例程

        分發(fā)例程主要指“打開”、“創(chuàng)建”、“讀”、“寫”、“IOCTL”、“關(guān)閉”等處理程序,它可以執(zhí)行對IRP的初始化,并檢查參數(shù)的合法性。模塊中內(nèi)核模式驅(qū)動程序需要處理的IRP主要有寫例程向硬件發(fā)送命令、讀例程讀取硬件寄存器、IOCTL例程用作多卡識別。

        在驅(qū)動層創(chuàng)建一個(gè)控制碼為READ_SLOT的IOCTL例程,專門用于傳遞板卡的位置信息。驅(qū)動層通過應(yīng)用層發(fā)下來的控制碼來識別上層需要進(jìn)行的操作。在控制碼為READ_SLOT的IOCTL例程中,把AddDevice讀取的放在全局變量中的板卡總線號、設(shè)備號和功能號,通過METHOD_BUFFERED的方式傳給應(yīng)用層。

        5 多卡識別應(yīng)用層編寫

        5.1 驅(qū)動層與應(yīng)用層的接口

        用戶模式驅(qū)動程序通過Win32應(yīng)用程序與內(nèi)核進(jìn)行通信,為保護(hù)知識產(chǎn)權(quán)和方便程序的升級與維護(hù),用戶模式驅(qū)動程序通常用“DLL”的方式實(shí)現(xiàn)。由于運(yùn)行在用戶態(tài),它和內(nèi)核模式驅(qū)動程序的通信過程實(shí)質(zhì)上是應(yīng)用程序和WDM驅(qū)動程序的通信過程[3]。

        在Windows系統(tǒng)中,應(yīng)用程序?qū)崿F(xiàn)與WDM驅(qū)動程序的通信過程如下:首先應(yīng)用程序用CreateFile函數(shù)打開設(shè)備,然后調(diào)用ReadFile從驅(qū)動程序中讀數(shù)據(jù)或用WriteFile寫數(shù)據(jù)給驅(qū)動程序,也可以用DeviceIoControl和驅(qū)動程序進(jìn)行通信。當(dāng)應(yīng)用程序退出時(shí),調(diào)用CloseHandle關(guān)閉設(shè)備[4]。這將產(chǎn)生對應(yīng)于此設(shè)備對象相應(yīng)的IRP,見表1所示。

        表1 Win32函數(shù)與IRP的對應(yīng)關(guān)系

        5.2 多卡設(shè)備句柄的獲得

        Win32API對設(shè)備進(jìn)行“打開”和“關(guān)閉”操作,在其打開設(shè)備時(shí),必須先獲得設(shè)備句柄。

        在Windows系統(tǒng)中,使用對象管理器集中管理系統(tǒng)中大量的內(nèi)部數(shù)據(jù)結(jié)構(gòu),包括驅(qū)動程序?qū)ο蠛驮O(shè)備對象。因?qū)ο蟮拿Q不同,為了便于區(qū)別對象,對象管理器通過一個(gè)層次化的命名空間來管理這些對象名稱。通常設(shè)備對象都把自己的名字放到Device目錄中。在DriverWorks工程創(chuàng)建時(shí)可以指定應(yīng)用程序打開設(shè)備的方式為GUID接口或符號鏈接名,獲得設(shè)備句柄。

        5.2.1 GUID接口

        這是微軟在設(shè)計(jì)WDM框架時(shí)引入的一個(gè)新的命名方案,該方案與任何自然語言無關(guān),且易于擴(kuò)展和歸檔。一個(gè)設(shè)備接口由唯一的128位的GUID標(biāo)識。由于采用了獨(dú)特的生成算法,永遠(yuǎn)也不用擔(dān)心重復(fù)出現(xiàn)GUID的情況,這樣一個(gè)GUID就唯一標(biāo)識了一種設(shè)備接口。但這種操作方式增加了代碼量,同時(shí)操作比較復(fù)雜,不易采用這種方式[5]。

        5.2.2 符號鏈接

        應(yīng)用程序要訪問該設(shè)備必須事先知道它的名字,否則不能訪問。這在測試用的設(shè)備或私有設(shè)備上是可以的。這種方式操作簡單,只適合特定的平臺[6]。

        用連接名在應(yīng)用層用CreateFile打開設(shè)備時(shí),每個(gè)連接名的后綴從零開始表示打開某類設(shè)備的第幾個(gè)實(shí)例,一個(gè)實(shí)例代表一個(gè)板卡。例如,板卡的符號連接為xxxDevice,第1個(gè)實(shí)例叫xxxDevice0,第2個(gè)實(shí)例叫xxxDevice1,以此類推,典型代碼如下:

        第0個(gè)例程后綴為0:

        hDevice是返回的硬件設(shè)備句柄。柄之后通過句參數(shù)hDevice調(diào)用控制碼為READ_SLOT的IOCTL例程,獲得硬件位置信息,主要代碼如下:

        圖2 獲取句柄流程圖

        把驅(qū)動加載過程中得到總線號、設(shè)備號和功能號來傳給應(yīng)用層,返回的值放在BufOutput中。在應(yīng)用層與用戶所指定的板卡參數(shù)相比較,確定板卡的位置,如果符合就返回句柄,不符合關(guān)閉句柄繼續(xù)往下找,直到找到指定的板卡為止,流程如圖2所示。得到每個(gè)板卡的句柄以后,就可以分別對板卡進(jìn)行操作,之間不會相互影響。

        6 調(diào) 試

        編寫驅(qū)動,調(diào)試是一個(gè)棘手的問題。因?yàn)轵?qū)動程序運(yùn)行在內(nèi)核模式下,很難像一般有集成的開發(fā)環(huán)境的Win32程序一樣進(jìn)行單步調(diào)試。一般來說,驅(qū)動的調(diào)試主要有2個(gè)途徑:(1)在關(guān)鍵的地方打印出調(diào)試信息,用DriverMoniter來查看;(2)內(nèi)核調(diào)試工具。在該文中采用第(1)種方法調(diào)試[7]。

        7 結(jié)束語

        該文介紹的板卡識別方法,在原有PID和VID識別的基礎(chǔ)上,改進(jìn)了硬件識別方法,通過位置信息尋找硬件,簡化了硬件的操作過程,在驅(qū)動和應(yīng)用程序方面做了改進(jìn),開發(fā)出適合多板卡公用的驅(qū)動程序,為硬件和驅(qū)動的設(shè)計(jì)帶來了很大的方便。

        [1] 楊軍.DriverStudio開發(fā)WDM設(shè)備驅(qū)動程序入門[M].北京:電子工業(yè)出版社,2004:34-40.

        [2]武安河.Windows2000/XP WDM設(shè)備驅(qū)動程序開發(fā)[M].北京:電子工業(yè)出版社,2005:1-65.

        [3]Foltz F.Microsft Windows驅(qū)動程序模型設(shè)計(jì)[M].馬少華,譯.北京:清華大學(xué)出版社,2004:45-120.

        [4] 吳宏鋼,尹愛軍,秦樹人.基于WDM模型的PCI數(shù)據(jù)采集卡驅(qū)動程序設(shè)計(jì)[J].中國測試技術(shù),2008,34(4):52-55.

        [5] 武安河.Windows設(shè)備驅(qū)動程序[M].北京:電子工業(yè)出版社,2001:42-148.

        [6]孫毅.Windows WDM設(shè)備驅(qū)動程序開發(fā)指南[M].北京:電子工業(yè)出版社,2001:1-100.

        [7]張帆,史彩成.Windows驅(qū)動開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2009:411-424.

        猜你喜歡
        句柄板卡驅(qū)動程序
        基于PCI9054的多總線通信板卡的研制
        基于FPGA的多通道模擬量采集/輸出PCI板卡的研制
        高校圖書館持久標(biāo)識符應(yīng)用研究
        編譯程序語法分析句柄問題分析與探討
        一種基于光纖數(shù)據(jù)傳輸?shù)亩喟蹇ㄜ浖绦驘龑懠夹g(shù)
        MFC應(yīng)用程序多線程混合顯示界面方法研究
        一種通用模擬量及開關(guān)量信號采集板卡的設(shè)計(jì)
        基于SPY++的軟件功能擴(kuò)展的研究
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        91视频88av| 国产精品毛片无遮挡高清| 国产99视频精品免视看7 | 亚洲在战AV极品无码| 久久国产精品免费一区二区三区| 日韩中文字幕久久久老色批| av免费在线播放视频| 国产精品理论片在线观看| 夫妇交换性三中文字幕| 性一交一乱一伧国产女士spa| 亚洲av永久无码精品秋霞电影影院 | 亚洲av永久无码精品网站在线观看| 公粗挺进了我的密道在线播放贝壳 | 精品久久久久香蕉网| 成人激情五月天| 日韩一区二区超清视频| 日本熟妇免费一区二区三区| 国产的自拍av免费的在线观看| 亚洲av无码成人精品区狼人影院| 久久水蜜桃亚洲av无码精品麻豆| 国产成人综合一区二区三区| 国产av专区一区二区三区| 在线观看视频国产一区二区三区| 国产亚洲精品色婷婷97久久久 | 精品欧洲av无码一区二区三区 | 亚洲 暴爽 AV人人爽日日碰 | 亚洲av无码乱码国产精品fc2| 四虎国产精品成人影院| 中文字幕人妻在线少妇完整版| 亚洲精品无码不卡| 久久精品人人做人人爽| 国产久视频| 亚洲女同人妻在线播放| 天堂8在线新版官网| 吃奶摸下的激烈视频| AV熟妇导航网| 日韩男女av中文字幕| 18禁免费无码无遮挡不卡网站| 国产乱子伦在线观看| 无码精品国产午夜| 人妻制服丝袜中文字幕|