• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      田 娜,錢光弟,李 力

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

      0 引 言

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

      1 PCI板卡加載過程

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

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

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

      2 識別

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

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

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

      3 WDM驅(qū)動模型

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

      圖1 WDM主要例程

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

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

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

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

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

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

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

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

      4.1 AddDevice例程

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

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

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

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

      4.2 分發(fā)例程

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

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

      5 多卡識別應用層編寫

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

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

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

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

      5.2 多卡設備句柄的獲得

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

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

      5.2.1 GUID接口

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

      5.2.2 符號鏈接

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

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

      第0個例程后綴為0:

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

      圖2 獲取句柄流程圖

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

      6 調(diào) 試

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

      7 結(jié)束語

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

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

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

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

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

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

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

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

      猜你喜歡
      句柄板卡驅(qū)動程序
      基于PCI9054的多總線通信板卡的研制
      基于FPGA的多通道模擬量采集/輸出PCI板卡的研制
      高校圖書館持久標識符應用研究
      編譯程序語法分析句柄問題分析與探討
      一種基于光纖數(shù)據(jù)傳輸?shù)亩喟蹇ㄜ浖绦驘龑懠夹g(shù)
      MFC應用程序多線程混合顯示界面方法研究
      一種通用模擬量及開關(guān)量信號采集板卡的設計
      基于SPY++的軟件功能擴展的研究
      驅(qū)動程序更新與推薦
      驅(qū)動程序更新與推薦
      观塘区| 镇赉县| 特克斯县| 孟州市| 千阳县| 社旗县| 昂仁县| 房山区| 桐庐县| 剑阁县| 贵港市| 富源县| 额尔古纳市| 应城市| 惠东县| 涟源市| 宜城市| 砀山县| 镇江市| 巴彦淖尔市| 昆山市| 青冈县| 延寿县| 奈曼旗| 平陆县| 前郭尔| 永寿县| 东宁县| 达尔| 揭东县| 诸城市| 屏南县| 麻栗坡县| 定陶县| 手游| 香格里拉县| 灵台县| 深州市| 乐陵市| 措美县| 图们市|