PCI設備Windows通用驅動(dòng)軌范設計
我們開(kāi)發(fā)了一套通用的PCI設備驅動(dòng)軌范,它可以完成一般PCI設備驅動(dòng)所需的功能,可以作為其它PCI設備驅動(dòng)開(kāi)發(fā)的框架。
本文引用地址:http://dyxdggzs.com/article/150571.htm1 驅動(dòng)軌范的模式和開(kāi)發(fā)工具的選擇
設備驅動(dòng)軌范是指打點(diǎn)某個(gè)外圍設備的一段代碼。驅動(dòng)軌范不會(huì )獨登時(shí)存在,而是操作系統的一部門(mén)。經(jīng)由過(guò)程設備驅動(dòng)軌范,多個(gè)歷程可以同時(shí)使用這些資本,從而可以實(shí)現多歷程并走運行。不才文中,將挪用設備驅動(dòng)軌范的PC機軌范稱(chēng)為用戶(hù)軌范。
Windows 95和Windows NT采用的驅動(dòng)軌范系統分歧,所以年夜年夜都情形下驅動(dòng)軌范也不能通用。若是設備需要在Windows 9x/NT下使用,一般至少要設計Windows 9x和Windows NT兩個(gè)驅動(dòng)軌范版本。Windows 98 可以兼容Windows 95的驅動(dòng)軌范,同時(shí)它又推出一個(gè)新的Win32 Drivers Mode(WDM)驅動(dòng)類(lèi)型。Windows 98中有些設備(如USB設備)的驅動(dòng)軌范必需為WDM模式。這個(gè)新的類(lèi)型現實(shí)是在Windows NT的驅動(dòng)模子的基本上增添了即插即用等內容。WDM驅動(dòng)也可以用在Windows 2000(先前叫Windows NT 5.0)中。從久遠的角度看。此后開(kāi)發(fā)人員只要開(kāi)發(fā)WDM驅動(dòng)就可以了,但從今朝的市場(chǎng)情形來(lái)看,Windows 95是無(wú)法拋卻的,所以WDM在近一兩年還無(wú)法替代其它類(lèi)型的設備驅動(dòng)。
Intel 80386以上的微措置器有4個(gè)優(yōu)先級別:0級、1級、2級和3級,一般操作系統運行于優(yōu)先級0級上,而用戶(hù)軌范運行在3級上,在對硬件操作上有一些限制(具體的限制在分歧的操作系統中是分歧的)。Windows 95撐持的驅動(dòng)類(lèi)型良多,但針對一般硬件設備而言,主若是VxD和打印機驅動(dòng)兩類(lèi)。VxD指的是Virtual Device Drivers。VxD運行在Intel系統的0級上,可以執行特權級指令,對任何I/O設備有全數訪(fǎng)謁權,所以年夜年夜都硬件驅動(dòng)軌范都是VxD。VxD驅動(dòng)凡是以.vxd為擴展名,放在WindowsSystem目錄下,可以在Windows 95啟動(dòng)時(shí)裝入,也可以在軌范運行時(shí)按照需要動(dòng)態(tài)地載入。動(dòng)態(tài)加載有助于節約系統內存和資本。但打印機驅動(dòng)軌范不是VxD,它運行在3級上。同Windows 95近似,Windows NT的驅動(dòng)也有可以運行在0級的內核模式(Kernel Mode)和運行在3極的用戶(hù)模式(User Mode)之分。因為Windows NT禁止用戶(hù)模式的軌范訪(fǎng)謁I/O端口(Windows 95/98則許可用戶(hù)軌范直接訪(fǎng)謁I/O端口),直接節制物理設備的驅動(dòng)軌范都是內核模式的。而我們設計的PCI通用驅動(dòng)軌范要求對各類(lèi)硬件資本訪(fǎng)謁,所以應該選擇工作在0級的驅動(dòng)軌范模式。
開(kāi)發(fā)設備驅動(dòng)采用的首要開(kāi)發(fā)工具是微軟為設備開(kāi)發(fā)者供給的軟件包Device Driver Kit(DDK)。這個(gè)軟件包搜羅有關(guān)設備開(kāi)發(fā)的文檔、編譯需要的頭文件和庫文件、調試工具和軌范典型。在DDK中還界說(shuō)了一些設備驅動(dòng)可以挪用的系統底層處事,象DMA處事、間斷處事、內存打點(diǎn)處事、可安裝文件系統處事等等。這些都是編寫(xiě)設備驅動(dòng)所必需的。但Windows 95的DDK因為首要使用匯編說(shuō)話(huà)描述。開(kāi)倡議來(lái)斗勁堅苦。是以,我們在Windows 95操作系統中同時(shí)采用了Numega公司的產(chǎn)物VtoolsD。VtoolsD是基于C/C++的,撐持Borland C++和Visual C++,使用和維護都較Windows 95 DDK輕易。
2 PCI驅動(dòng)軌范的特點(diǎn)
在設計驅動(dòng)軌范之前,首先要對欲節制的硬件設備進(jìn)行詳盡地剖析,更需要具體體味硬件設備的特征。硬件設備的特征會(huì )對驅動(dòng)軌范設計發(fā)生重年夜的影響。需要體味的最首要的硬件特征搜羅:
(1)設備的總線(xiàn)結構
設備采用什么總線(xiàn)結構很是關(guān)頭,因為分歧的總線(xiàn)類(lèi)型(如ISA和PCI)在良多硬件工作機制上是分歧的,所以驅動(dòng)軌范設計也分歧。
(2)寄放器
要體味設置的節制寄放器、數據寄放器和狀況寄放器,以及這些寄放器工作的特征。
(3)設備錯誤和狀況
要體味若何判定設備的狀況和錯誤旌旗燈號,這些旌旗燈號要經(jīng)由過(guò)程驅動(dòng)軌范返回給用戶(hù)。
(4)間斷行為
要體味設備發(fā)生間斷的前提和使用間斷的數目。
(5)數據傳輸機制
最常見(jiàn)的數據傳輸機制是經(jīng)由過(guò)程I/O端口(port),也就是經(jīng)由過(guò)程CPU的IN/OUT指令進(jìn)行數據讀寫(xiě)。PC的另一種主要的傳輸機制是DMA,但PCI規范不搜羅隸屬DMA的聲名。
(6)設備內存
良多設備自身帶有內存,PCI設備年夜多是采用映射的體例映射到PC系統的物理內存。有的設備還要經(jīng)由過(guò)程驅動(dòng)軌范設置設備的接口寄放器。
有關(guān)驅動(dòng)軌范的加載和響應用戶(hù)請求的內容,在DDK文檔中有劃定,所以設計設備驅動(dòng)軌范首要的面臨問(wèn)題是若何進(jìn)行硬件操作,這是按照設備的分歧而分歧的。而硬件驅動(dòng)軌范的功能雖然千差萬(wàn)別,但根基功能就是完成設備的初始化、對端口的讀寫(xiě)操作、間斷的設置、響應和挪用以及對內存的直接讀寫(xiě)。如前面所說(shuō),Windows 9x和Windows NT的操作系統模子分歧,但驅動(dòng)軌范所要完成的工作卻是不異的,所以下面以Windows 9x為主進(jìn)行介紹,僅在需要的處所指出兩個(gè)操作系統的分歧。下面從這幾方面談判解決這些問(wèn)題的路子#e#下面從這幾方面談判解決這些問(wèn)題的路子:
(1)設備初始化
PCI設備驅動(dòng)軌范要實(shí)現識別PCI器件、尋址PCI器件的資本和對PCI器件間斷的處事。PCI系統BIOS功能供給了BIOS的訪(fǎng)謁與節制的具體特征,所有軟件(設備驅動(dòng)軌范、擴展ROM碼)將經(jīng)由過(guò)程尺度間斷號1AH挪用BIOS功能訪(fǎng)謁非凡部件。PCI BIOS規范有完整的有關(guān)PCI BIOS功能的描述[3]。
在PCI設備驅動(dòng)軌范的初始化過(guò)程中,操作指定器件識別號(device_id)、廠(chǎng)商識別號(vendor_id)、檢索號(index)搜索PCI器件,經(jīng)由過(guò)程挪用PCI BIOS確認其存在,并確定其物理位置:總線(xiàn)號、器件號和功能號,這是該器件/功能在系統中的獨一尋址標識表記標幟。操作總線(xiàn)號、器件號和功能號可以尋址該器件/功能的PCI設置裝備擺設空間(configuration space)。
接下來(lái),設備驅動(dòng)就需要從設置裝備擺設空間獲得硬件的參數。PCI設備的良多參數,搜羅所用的間斷號,端口地址的規模(I/O)體例、存儲器的地址(存儲器映射體例)等,都可以從PCI設置裝備擺設空間的各基址所對應的尋址空間中獲得。讀寫(xiě)設置裝備擺設空間可以挪用BIOS間斷1AH,
也可以先向設置裝備擺設空間地址寄放器(0CF8H)寫(xiě)入總線(xiàn)和設備號(在前面搜索PCI器件時(shí)獲得的)和寄放器號,再對設置裝備擺設空間數據寄放器(0CFCH)進(jìn)行讀寫(xiě)。對設備驅動(dòng)來(lái)說(shuō),最主要的是獲得基址寄放器(BADR),不能認為PCI器件資本老是設計設備時(shí)設置的初值,系統可能會(huì )按照硬件情形為PCI設備分配新的資本。我們所設計的PCI設備使用的基址1-3都是按I/O空間映射的,而基址4是按內存體例映射的。確定一個(gè)端口是按什么體例映射的,可以讀對應端口的設置裝備擺設寄放器(Configuration Register)。讀出后,判定其0位,若是0位為數值0,暗示其是按內存體例設置的,否則為I/O體例設置的。內存體例和I/O體例的設置裝備擺設寄放器的寄義參見(jiàn)文獻[3]。若是要獲得基址的巨細,可以向基址寄放器寫(xiě)入FFFFH,然后讀基址寄放器,若是是內存體例,從第4位起頭的0的數目暗示基址的巨細,若是是I/O體例,則從第2位起頭的0的數目暗示基址的巨細。
在Windows NT下,查找PCI設備的工作是由HalGetBusData完成的,也可以使用前述的法子讀取設置裝備擺設寄放器,但DDK舉薦使用HaiGetBusDataOffset函數。
(2)端口操作
在PC機上,I/O端口尋址空間和內存尋址空間是分歧的,所以措置體例也分歧。I/O空間是一個(gè)64K字節的尋址空間,它不象內存有實(shí)模式和呵護模式之分,在各類(lèi)模式下尋址體例不異。在Windows 9x下,用戶(hù)軌范可以直接使用I/O指令,而不必然非經(jīng)由過(guò)程專(zhuān)門(mén)的驅動(dòng)軌范來(lái)完成,所以若是軟件對硬件的操作美全是經(jīng)由過(guò)程I/O端口操作來(lái)完成的,甚至可以不用專(zhuān)門(mén)設計驅動(dòng)軌范,直接由應用軌范來(lái)完成對硬件的節制。因為PCI總線(xiàn)是32位的總線(xiàn)尺度,在進(jìn)行I/O操作時(shí)凡是要進(jìn)行雙字(DWORD)操作,而且以前年夜年夜都C/C++編譯軟件都沒(méi)有供給雙字的函數,所以需要機關(guān)雙字操作讀寫(xiě)函數inpd/outpd。
在Windows NT下,系統不許可處于優(yōu)先級3級的用戶(hù)軌范和用戶(hù)模式驅動(dòng)軌范直接使用I/O指令,若是使用了I/O指令將會(huì )導致特權指令意外(privileged instruction exception)。所以任何對I/O的操作都需要借助內核模式驅動(dòng)來(lái)完成。具體的做法有兩種:一是在驅動(dòng)軌范中使用IoReportResourceUsage陳述資本占用,然后使用READ_PORT_XXX、WRITE_PORT_XXX函數讀寫(xiě),最后使用IoReportResourceUsage打消資本占用;另一種是驅動(dòng)軌范改削NT的I/OPermissions Map (IOPM),以使系統許可用戶(hù)軌范對指定的I/O端口進(jìn)行操作,這時(shí)用戶(hù)軌范采用凡是的I/O指令進(jìn)行操作。后者的利益是速度快、用戶(hù)軌范設計簡(jiǎn)單,但犧牲了移植性,軌范不能移植到非Intel的系統中,而且若是多個(gè)軌范同時(shí)讀寫(xiě)統一端口輕易導致沖突。
(3)內存的讀寫(xiě)
Windows工作在32位呵護模式下,呵護模式與實(shí)模式的根柢區別在于CPU尋址體例上的分歧,這也是Windows驅動(dòng)軌范設計中需要著(zhù)重解決的問(wèn)題。Windows采用了分段、分頁(yè)機制(圖1),這樣使應用軌范發(fā)生一種錯覺(jué),好象軌范中可以使用很是年夜的物理存儲空間。這樣做最年夜的益處就是一個(gè)軌范可以很輕易地在物理內存容量紛歧樣的、設置裝備擺設規模分歧很年夜的計較機上運行,編程人員使用虛擬存儲器可以寫(xiě)出比任何現實(shí)設置裝備擺設的物理存儲器都年夜得多的軌范。
評論