前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇驅動程序設計范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。
關鍵詞:WDF PCI 中斷 驅動程序 同步時鐘卡
中圖分類號:TP336 文獻標識碼:A 文章編號:1007-9416(2015)05-0000-00
Abstract:This paper introduces the design of Device Drivers of PCI synchronous clock card based on WDF model. Briefly introduces the system architecture and works on our own PCI synchronous clock card, and Analysis the framework of the WDF model and the design process. Focused on the research and development of the WDF Device Drivers based on the PCI synchronous clock card, including hardware access, Interrupt notification. The driver has passed the test for stability and reliability.
Key words: WDF; PCI; interrupt; driver; synchronous clock card.
時間是科學實驗、科學研究和工程技術等領域中的一個基本物理參量。為了保證系統各部分時間的一致性和正確性,系統內各設備的同步時鐘從卡從時鐘源獲取高精度的標準時間,提供給相應設備。這樣系統內各設備的時間與時間源相同而保持一致。同步時鐘卡一般采用PCI總線方式。PCI總線能夠實現設備間的快速訪問,它以突出的性能受到計算機和通信界工程師們的青睞。
因此如何開發出穩定、可靠、高效的PCI設備驅動程序成為驅動工程師們面臨的一個棘手的問題[5]。過去對于PCI設備驅動程序的開發大多采用WDM(Windows Driver Model)框架,但是它編程比較復雜,快速掌握其開發要領對于初學者來說比較困難[5]。本文所述的PCI同步時鐘卡的驅動程序的開發采用微軟最新推出的WDF(Windows Driver Foundation)驅動模型。WDF驅動模型提供事件驅動和面向對象的驅動程序開發框架,大大降低了設備驅動程序的開發難度[5]。
1 同步時鐘卡系統架構
本文所述的驅動程序是基于自行研發的PCI同步時鐘卡,其原理框圖如圖1所示。本同步時鐘卡選擇PCI9052芯片做為PCI總線的接口芯片。該電路除了用到PCI9052外,還用到了單片機、EEPROM、雙口RAM、CPLD。單片機是系統的控制單元;串行EEPROM存儲了PCI9052芯片所需要的配置信息;雙口RAM用于PC機與時鐘卡之間交換數據;CPLD用于200us時標的產生和中斷的控制。
同步時鐘卡的工作流程如下:同步時鐘從卡接收時鐘源輸出的時間信號,單片機將其解析成高精度的同步時間信息,控制邏輯(CPLD)通過1PPS脈沖信號產生200us的高精度時間刻度,于是產生高精度的同步絕對時標,連續存儲于雙口RAM中,最后計算機通過PCI總線接口獲取高精度的絕對時間。本系統中計算機獲取雙口RAM中的時間數據的方式有兩種:(1)PC機主動讀取雙口RAM中的數據。(2)外部事件通過中斷通知PC機事件發生,PC機收到通知后讀取雙口RAM中的時間信息,可獲得外部事件發生的精確時刻。兩種方式分別涉及驅動程序的硬件訪問和中斷通知。于是涉及到本文介紹的重點:基于WDF模型的PCI總線驅動程序的開發。
2 WDF驅動程序設計
微軟對過去的WDM(Windows Driver Model)驅動程序的架構做了改進,形成了全新的WDF(Windows Driver Foundation)框架結構。它將原來普通軟件開發中面向對象的技術應用到了驅動程序的開發中。WDF改變了驅動程序與操作系統內核之間的關系,在傳統的WDM驅動程序中,不僅要處理硬件,還要處理驅動程序與操作系統內核之間的交互[4]?,F在WDF則使驅動程序與操作系統內核獨立開來,驅動程序與操作系統交互工作將由框架內封裝的方法(函數)去完成,這樣驅動開發工程師只需專注處理目標硬件的行為即可,避免了兩面不周顧此失彼的弊端。不僅大大降低了驅動程序的代碼量,還使整個系統更加穩定、可靠。
WDF驅動程序包括兩個類型,一個是內核級的,稱為KMDF(Kernel-Mode Driver Framework);另一個是用戶級的,稱為UMDF(User-Mode Driver Framework)。本文所述的驅動程序采用KMDF模式。
2.1 WDF驅動程序開發流程
本文所用開發環境為Microsoft Windows Driver Kit(WDK) 8.1和Microsoft Visual Studio 2013,操作系統為Windows7。先安裝VS2013,再安裝WDK8.1,便可在VS2013中直接創建KMDF工程。根據同步時鐘卡所需功能編寫好驅動程序即可進行編譯。
WDF驅動程序框圖如圖2所示。
2.2 基于WDF模型的PCI設備驅動程序的實現
WDF模型的設備驅動程序從功能上可分為三個部分:初始化設備、控制設置與交換數據[3]。初始化設備主要實現設備的識別、驅動對象與設備對象的建立與硬件資源的分配;控制設置負責應用程序與驅動程序的連接和設備的打開;交換數據處理的是設備功能的具體應用,即PCI總線與同步時鐘卡之間的數據傳輸。
從本質上來說,WDF模型的設備驅動程序是由入口函數DriverEntry和事件例程及其子函數組成的[3]。操作系統在第一次加載驅動程序時會通過調用DriverEntry例程來完成設備驅動程序和框架的初始化[3]。所有的驅動程序都必須包含一個DriverEntry例程。對于不同類型的驅動程序其入口函數DriverEntry也不同,可分為:設備驅動、純軟件驅動與過濾驅動。本文所述的PCI總線驅動程序屬于設備驅動,在入口函數DriverEntry中,主要完成兩件事:注冊EvtDriverDeviceAdd回調例程、創建和初始化WDFDRIVER對象。
WDF_DRIVER_CONFIG_INIT(&config,PCIdriverEvtDeviceAdd);
//注冊EvtDriverDeviceAdd回調例程
status = WdfDriverCreate(DriverObject, RegistryPath,...);
//創建驅動對象
2.2.1初始化設備
在驅動程序被成功初始化完成之后,操作系統會順序調用EvtDriverDeviceAdd、EvtDevicePrepareHardware等回調例程以實現所控制的設備的初始化。
當首次枚舉設備時,EvtDriverDeviceAdd例程在系統初始化時被PnP管理器調用。在系統運行過程中,任何時候一個新的相同設備被枚舉,系統都將調用此例程。EvtDriverDeviceAdd例程是設備初始化過程中最新被調用的回調例程,它需要完成:設備對象的創建,創建符號鏈接或設備對象GUID接口,創建一個或多個I/O隊列,各種事件的回調函數的注冊,如即插即用、電源管理、I/O處理例程等[1]。
EvtDriverDeviceAdd例程的主要代碼如下所示:
注冊即插即用基本例程:
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
pnpPowerCallbacks.EvtDevicePrepareHardware = PCIDriverEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PCIDriverEvtDeviceReleaseHardware;
..........
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
創建設備對象:
WDF_FILEOBJECT_CONFIG_INIT(&f_config,...);
WdfDeviceInitSetFileObjectConfig(DeviceInit, &f_config,WDF_NO_OBJECT_ATTRIBUTES);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, ..);
status = WdfDeviceCreate(&DeviceInit, &attributes, &control_device);
創建隊列對象并注冊回調例程:
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,....);
ioQueueConfig.EvtIoDeviceControl = PCIdriverEvtIoDeviceControl;
ioQueueConfig.EvtIoStop = PCIdriverEvtIoStop;
status = WdfIoQueueCreate(control_device,&ioQueueConfig,...);
創建符號鏈接:
status = WdfDeviceCreateSymbolicLink(control_device, &ustring);
創建中斷對象:
deviceContext = GetDeviceContext(control_device);
WDF_INTERRUPT_CONFIG_INIT(&interruptConfig,PCIDriverEvtInterruptIsr,
PCIDriverEvtInterruptDpc);//設置中斷服務例程和延遲過程調用WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&interruptAttributes,..);
status = WdfInterruptCreate(control_device,&interruptConfig,
&interruptAttributes,&deviceContext->Interrupt);
EvtDriverDeviceAdd例程調用完成之后,系統將調用EvtDevicePrepareHardware例程初始化地址指針,將設備所占用的I/O地址和內存地址映射為虛擬地址,驅動程序將通過這些虛擬地址完成與設備的數據傳輸。由于串行EEPROM存儲了PCI9052芯片所需要的配置信息,系統將自動為本文所述的PCI同步時鐘卡分配資源,它們包括雙口RAM的內存地址、PCI9052的I/O地址空間,所以EvtDevicePrepareHardware例程必須將這些資源映射為虛擬地址。對于I/O端口,只需將首地址與地址數目值保存在設備上下文;對于存儲器芯片,調用MmMapIoSpace函數將物理地址映射為系統內核虛擬地址,然后保存于設備上下文。相對應的,當設備被卸載時,系統會自動調用EvtDeviceReleaseHardware回調例程釋放之前申請的硬件資源。
for (i = 0; i < WdfCmResourceListGetCount(ResourceListTranslated); i++) {//WdfCmResourceListGetDescriptor函數獲取該資源的描述符
descri = WdfCmResourceListGetDescriptor(ResourceListTranslated, i);
switch (descri->Type)
{case CmResourceTypeMemory:
Mem_Count++;
if (Mem_Count == 2)//將雙口RAM地址映射為虛擬地址
{pDevice_context->MemBaseAddress = MmMapIoSpace(
descri->u.Memory.Start,
descri->u.Memory.Length,
MmNonCached);
pDevice_context->MemLength = descri->u.Memory.Length;}
break;
case CmResourceTypePort://將PCI9052的I/O地址映射為虛擬地址
pDevice_context->Io_baseAddress = descri->u.Port.Start.LowPart;
pDevice_context->Io_length = descri->u.Port.Length;
default:
break;}}
2.2.2控制設置與數據交換
應用程序實現和驅動程序通信的過程是:應用程序首先調用CreateFile函數打開設備,然后可以使用DeviceIoControl和驅動程序通信,包括寫數據給驅動程序和從驅動程序讀數據兩種情況,也可以用WriteFile寫數據給驅動程序或用ReadFile從驅動程序讀數據,當應用程序退出時,調用用CloseHandle關閉設備。本文所述的系統是用DeviceIoControl和驅動程序通信。CreateFile打開設備的方式有兩種:符號鏈接名與GUID接口,本文所述驅動程序采用的是符號鏈接名的方式。
m_hDevice=CreateFile(sLinkName,...);//以符號鏈接名的方式打開設備
上述代碼中sLinkName為符號鏈接名,它與驅動程序中設置的符號鏈接名相同。m_hDevice為返回的設備的有效句柄,應用程序就可以應用它調用DeviceIoControl函數與驅動程序交換數據。應用程序的請求會被放入請求隊列中,并在EvtIoDeviceControl函數之中被處理。
本文中應用程序獲取時鐘卡上的時間信息的方式有兩種:(1)直接讀取。(2)中斷方式。
對于第一種方式,應用程序直接調用DeviceIoControl函數與驅動程序交換數據。由于系統的雙口RAM被映射到虛擬內存,驅動程序可以使用下面兩條指令對雙口RAM進行讀寫: READ_REGISTER_XXX;//讀雙口RAM,WRITE_REGISTER_XXX;//寫雙口RAM。
對于中斷方式,當被捕獲的外部事件發生時,驅動程序會進入中斷服務例程EvtInterruptIsr,然后進入延時過程調用EvtInterruptDpc,首先清中斷源,然后將雙口RAM中的時間數據讀取到設備上下文中緩存,該數據即為外部事件發生的時間,最后通知應用程序讀取該數據。應用程序將調用DeviceIoControl函數獲取設備上下文中的時間信息。驅動程序與應用程序通信的方法有兩種:DeviceIoControl異步完成和WIN32事件通知。本文所述系統采用WIN32事件通知的方法。對于此種方法,應用程序初始化時首先生成一個通知事件,并通過DeviceIoControl函數的輸入緩沖區發送給驅動程序,驅動程序創建相應的內核事件,同時使能PCI9052的LINT1中斷,當該事件發生時,驅動程序會通知應用程序,應用程序的一個子線程不停的循環等待驅動程序發來的事件發生通知。當設備被卸載時需要撤銷該內核事件。具體主要代碼如下:
應用程序生成通知事件:
mhEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
應用程序子線程中等待事件發生:
while (WaitForSingleObject(mhEvent, 0) != WAIT_OBJECT_0)
{...}
驅動程序創建相應的內核事件:
ObReferenceObjectByHandle(....);
允許PCI中斷,使能PCI9052的本地LINT1中斷,pREG為PCI9052映射的I/O空間的基 地址:
inter = READ_PORT_USHORT(pREG + 0x4c);
inter |=0x43;
WRITE_PORT_USHORT(pREG + 0x4c, inter);
清中斷源,設置PCI9052的CS3引腳有效,通知CPLD清掉LINT1信號:
inter = READ_PORT_USHORT(pREG + 0x50);
inter |= 0x800;
WRITE_PORT_USHORT(pREG + 0x50, inter);
驅動程序給應用程序發送事件,通知應用程序讀取數據:
KeSetEvent(pDevice_context->Event, 0, FALSE);
驅動程序內撤銷內核事件:
ObDereferenceObject(...);
3 結語
驅動程序是硬件與應用程序通信的橋梁,它對系統性能提升的作用舉足輕重。高效、穩定、可靠的驅動程序可以使系統性能得到很好的提升。
本文簡要介紹了PCI同步時鐘從卡的工作原理,并重點討論了基于WDF模型的PCI設備驅動程序設計方法。本文所述的PCI同步時鐘卡驅動程序,在WDK8.1中成功編譯,自動生成SYS文件(驅動程序代碼)和INF文件(設備安裝信息),成功安裝并且能夠穩定可靠地運行。經測試,捕獲的時間精度達到誤差小于200us,滿足系統設計要求。涉及本驅動程序的系統已應用于三峽大壩左岸發電廠發變機組的故障錄波系統中,運行穩定可靠??偠灾?,WDF驅動模型優化并簡化了設備驅動程序的開發,比傳統的WDM驅動模型更加穩定。
參考文獻
[1]武安河.Windows設備驅動程序WDF開發[M].北京:電子工業出版社,2009.
[2][美]Ronald D. Reeves 著,張猛等 譯.Windows設備驅動程序開發[M].北京:人民郵電出版社,2012.
[3]黎順杰,張艷榮.基于WDF的PCI-CAN設備驅動程序設計[J].電子測試,2013;5:20-21.
【關鍵詞】USB 設備驅動 Linux
1 USB總線原理
USB 協議是1994年底由康柏、IBM、英特爾等幾家公司聯合提出來的外部總線接口協議。USB就是英文中Universal Serial Bus(通用串行總線)的縮寫。USB總線具有其他總線所不具備的如:熱插拔、數據傳輸可靠、擴展方便、成本低等一系列特點,因此在嵌入式系統中被廣泛使用。
一個USB系統一般是由一個USB主機控制器、一個或多個USB集線器和一個或多個USB設備節點組成。USB系統的物理連接具有層次性。USB總線連接USB設備和USB主機,是一種星型拓撲結構。USB的拓撲結構如圖1所示。
在一個USB系統傳輸數據的過程中有兩個非常重要的概念,就是USB傳輸模式和USB描述符。USB傳輸模式是指USB設備傳輸數據的形式。USB設備支持四種傳輸模式:控制傳輸模式、同步傳輸模式、中斷傳輸模式和批量傳輸模式。控制傳輸模式是用來處理USB主端口到USB從端口的數據傳輸,主要是設備控制指令、設備查詢狀態指令和確認指令。同步傳輸模式是指傳輸和時間關系密切的信息所使用的一種傳輸方式,是一種周期的、連續的單向傳輸方式。中斷傳輸模式這類傳輸模式主要用于傳輸非周期性的、自然發生的、數據量很小的信息,這類數據傳輸的方向是從設備到主機,適用于鍵盤、鼠標、操縱桿等設備上。最后一種是批量傳輸模式,該模式適用于大量的、對時間沒有要求的數據傳輸,如U盤或者移動硬盤等設備。
USB設備在邏輯上分為幾個層次,分別是設備層(Device)、配置層(Config)、接口層(Interface)、端點層(Endpoint)。各個層次都有與之相對的描述符,分別是設備描述符、配置描述符、接口描述符和端點描述符。
2 Linux下的USB驅動框架
USB設備的設備描述符在Linux系統中用usb_device_descriptor結構體表示,它描述了USB設備的一般信息。配置描述符用usb_config_descriptor結構體表示,它給出了USB設備的配置信息。接口驅動程序是在一個配置內給出一個接口信息,它在Linux中由usb_interface_descriptor結構體表示。端口描述符被主機用來決定每個端口的帶寬需求,它在Linux系統中由usb_endpoint_descriptor結構體表示。
編寫一個USB驅動程序,是從usb_driver結構體開始的。Linux中模塊加載函數調用usb_register()和usb_unregister()從而對usb_driver結構體進行加載與卸載。如果某個設備信息與該驅動中usb_device_id usb_mouse_id_table 結構體的信息相一致,則會調用usb_driver中探測成員函數probe(),將初始化USB斷點信息,并對設備做一些初始化工作,分配urb結構體,準備數據傳輸。其urb處理大致框架結構如圖2所示。
當鼠標設備在用戶空間打開時,將提交 probe 函數構建的 urb 請求塊,urb 將開始為傳送數據而忙碌了。urb 請求塊就像一個裝東西的“袋子”,USB 驅動程序把“空袋子”提交給 USB core,然后再交給主控制器,主控制器把數據放入這個“袋子”后再將裝滿數據的“袋子”通過 USB core 交還給 USB 驅動程序,這樣一次數據傳輸就完成了。
3 結束語
由于USB簡單方便快捷等優點,許多外接設備會越來越青睞USB接口,這是一種發展的趨勢。Linux系統具有開源、安全等特性,用戶也在急劇增加。屆時,會有越來越多的USB驅動加入Linux內核之中。
參考文獻
[1]Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman等.LINUX設備驅動程序[M].北京:中國電力出版社,2006.
[2]Universal Serial Bus Specification Compaq,Intel,Mi―crosoft,NEC Revision 1.1.September 23,1998.
[3]溫卡特斯瓦蘭.精通Linux驅動程序開發[M].北京:人民郵電出版,2009.
[4]胡曉軍,張愛成.USB接口卡發技術[M].西安:西安電子科技大學出社,2005:15-17.
作者簡介
徐海林(1989-),男,江蘇省南通市人?,F為安徽理工大學計算機科學與工程學院學生。
第一節windows nt網絡結構
§1.1.1 windows nt網絡體系結構
windows nt的網絡體系結構是基于國際標準化(iso)制定的標準模型──開放式系統互連(open system interconnection:osi)參考模型分層建立的,這種方式有利于隨時擴展其它功能和服務。
windows nt網絡模型開始于mac子層,網卡驅動程序就駐留在其中。它通過相關的網卡把windows nt與網絡連接起來,圖中的多個網卡表明在一臺運行windows nt的計算機上能使用多種網卡。
這一網絡體系結構包括兩個重要接口──ndis接口與傳輸驅動
程序接口(tdi)。這兩個接口把兩個層隔離開來,辦法是相鄰的部件只允許按單一的標準來寫,不允許多重標準。例如一個網卡驅動程序(在ndis接口的下面)就不需要特地按每個傳輸協議來寫它的代碼塊,恰恰相反,該驅動程序是寫給ndis接口的,它通過符合ndis的相應傳輸協議來請求服務。這些接口包含在windows nt的網絡體系結構中,以容納可移植、可互換的模塊。
在兩個接口之間,是傳輸協議。它在網絡中起著組織者的作用。一個傳輸協議規定了數據以何種方式呈遞給下一個接收層,以及如何對數據相應地進行打包。它通過ndis把數據傳給網卡驅動程序,并通過tdi把數據傳給轉發程序(redirector)
tdi之上是轉發程序,它把本地的網絡資源申請轉送給網絡。
為了能和其他廠商的網絡互連,windows nt允許有多個轉發程序。對于每一個轉發程序windows nt計算機必須也有一個相應的供應者(provider)(由網絡廠商提供)。多供應者路由選擇程序決定適當的供應者,然后借助于供應者,對應用請求到相應的轉發程序做出選擇。windows nt支持兩種類型的網絡驅動程序
傳輸驅動程序
實現數據鏈路層中的邏輯鏈路控制子層協議和傳輸層協議。向 下與ndis接口,向上與tdi接口。
網卡驅動程序
實現對物理層的管理和數據鏈路層中介質訪問控制子層協議,通過ndis向下管理物理網卡,向上與傳輸驅動程序通信。
§1.1.3 windows nt網卡驅動程序
windows nt環境下的網卡驅動程序也分為兩種:
miniport網卡驅動程序:miniport驅動程序只須實現與網絡硬件相關的操作(包括發送和接收)。而所有底層網卡驅動程序的通用操作(如同步),一般由ndis接口程序來實現。
full網卡驅動程序:full網卡驅動程序必須實現所有硬件相關和同步、排隊等操作。例如full網卡驅動程序為了響應數據接收,需要保持本身的捆綁信息,而miniport就可以由ndis接口庫來實現。
在windows nt的早期版本中,full網卡驅動程序要求開發者實現許多底層操作,來處理多處理器的核心問題以及處理器、線程的同步,這樣不同的開發者在大量重復著許多相同的工作。
而miniport網卡驅動程序允許開發者僅僅寫一些與網絡硬件相關的代碼即可,而那些通用的函數由ndis接口庫來實現,這樣開發出來的驅動程序減少了不必要的工作。
第二節miniport驅動程序的結構
ndis接口規范了網卡驅動程序的實現,同時也對tdi驅動程序的實現提出了一定的要求,在nt中,ndis約束下的網卡驅動程序、tdi驅動程序和系統的關系如下圖所示:
圖2.0 ndis約束下的網卡驅動程序、tdi驅動程序和系統的關系
miniport驅動程序包括驅動程序對象、驅動程序源代碼和ndis接口庫代碼。windows nt ddk提供ndis.h作為miniport驅動程序的主要頭文件,定義了miniport驅動程序的入口點、ndis接口庫函數和通用數據結構。
上邊緣函數的作用是網卡驅動與ndis接口庫進行通信,而下邊緣函數是tdi協議驅動程序與ndis通信的手段。ndis用一個叫做邏輯網卡的軟件對象來描述系統中的每塊網卡,而邏輯網卡與windows nt設備對象的通信由i/o子系統來管理,描述網卡的設備對象包括相關的網絡信息如名字、網絡地址和網卡內存基地址等,它還包含與硬件相關的驅動程序狀態數據(捆綁數目,捆綁句柄,包過濾數據庫等)。ndis分配一個句柄到miniportinitialize這個上邊緣函數的一個結構中,然后miniport網卡驅動程序將在以后提供這個句柄來給ndis調用,這個結構一直被ndis保持,并且對miniport驅動程序不透明。 當miniport網卡驅動程序初始化一塊網卡時,它創立自己的內部數據結構來描述網卡,記錄需要它管理的與設備相關的狀態信息。當miniport網卡驅動程序調用ndismsetatttibutes或ndismsetattributesex兩ndis庫函數時,它傳遞一個句柄給這數據結構。這樣,當調用miniport驅動程序入口點時,它就傳遞這個句柄來驗證驅動程序所對應的網卡的正確性。這個數據結構為miniport網卡驅動程序所擁有并維護。miniport nic驅動程序還需要維護一組對象,這些對象是系統定義的對象標識符(object idetifier:oid)來標識,以描述驅動程序的性能和當前狀態信息。為查詢這些信息,上層驅動程序調用ndisrequest向ndis接口庫指示oid。oid表示了調用所需的信息類型,如miniport驅動程序所支持的lookahead緩沖區大小等。ndis接到上層驅動程序的查詢請求,將oid傳遞給上邊緣函數miniportqueryinformation實現對oid的查詢,如果上層驅動程序請求改變狀態信息則調用miniportsetinformation實現對oid的設置。典型的miniport nic驅動程序必須有一些函數來通過ndis接口實現上層驅動程序與硬件的通信。這些函數稱為上邊緣服務函數。
這些上邊緣服務函數由驅動程序的開發者根據驅動程序面向的特定低層網絡類型和硬件以及相應環境,可以有選擇地實現,但必須保證驅動程序最基本的功能,這些基本功能包括初始化、發送、中斷處理、重置、參數查詢與設置和報文接收。
miniportinitialize:操作系統根據系統配置信息,檢測出網卡已安裝時,由ndis接口在初始化時調用,主要完成低層網絡類型確定,對應于物理網卡的邏輯網卡初始化,中斷信息注冊,網卡與主機通訊方式的確認。i/o端口的申請與注冊,內存映像,mib的初始化,物理網卡的驗證與初始化等。
miniportreconfigure:支持網卡參數動態變化,和miniportinitilize一樣由ndis接口以初始化級別調度執行(不能屏蔽中斷,必須由驅動程序承認并清除在此期間產生的中斷),支持即插即用和軟配置的網卡在動態改變參數時,必須提供此函數。
miniportqueryinformation:查詢網卡的狀態以及網卡驅動程序的操作或統計參數,如是否支持組通訊、網卡的物理速率是否支持回環、是否支持直接拷貝等,這些參數以oid方式統一管理。
miniportsetinformation:ndis接口或協議驅動程序通過調用此接口改變驅動程序維護的oid庫,一些操作參數的改變也將同時改變驅動程序狀態,例如組地址的設置。
miniportreset:包括網卡硬件重置和驅動程序軟件重置,軟件重置包括驅動程序狀態重置,以及一些相關的參數重置,還需考慮有些參數的恢復,重置時不必完成所有正在活躍的外部請求,但必須釋放已占用的外部資源。
miniporthalt:掛起網卡并釋放該網卡驅動程序占用的所有資源,在此期間不屏蔽中斷。
miniportisr:高優先級的中斷處理程序,進行的工作包括初始中斷處理類型,決定是否進行中斷轉交,對卡上中斷進行處理 等,該服務類型只在以下情況被調用:
ndis接口調用miniportinitialize和miniporthalt兩函數時。
.中斷處理類型設為每此中斷處理過程都調用時。
為使系統能及時響應所有硬件中斷,高優先級的硬件中斷處理程序應盡可能的減少運行時間,防止長時間的屏蔽低優先級中斷,避免造程中斷丟失。
miniporthandleinterrupt:由中斷延時處理程序在中斷延時處理時進行調用。ndis排隊所有的延時處理,該服務主要處理發送完成、報文接收、描述符用盡、溢出、網卡異常等中斷。
miniportsend:ndis收到上層發送請求時經過若干協議處理再向下調用此服務過程,發送的packet已含有llc和mac頭,該服務過程進行邊界對齊、packet約束重整、描述符映射和報文發送、以及發送資源和packet緩沖隊列管理。
miniporttransferdata:多個已和網卡捆綁的協議驅動程序在接收到報文到達指示后,向網卡驅動程序發出傳送請求以拷貝各自所需的報文數據部分,網卡驅動程序根據各協議驅動程序對單個packet是否進行多次拷貝,以決定是否暫存只允許單次拷貝的packet等。
miniportcheckhandle:ndis每秒調用此服務函數一次,驅動程序發現網卡異常時報告給ndis由ndis調用miniportreset進行硬件重恢復。
miniportenableintrrupt:中斷使能。
miniportdisableinterrupt:中斷屏蔽。
另外,每個網卡驅動程序必須有一個初始化入口點,由driver entry函數實現,它和系統相關,由操作系統在裝入驅動程序時調用,主要完成初始化ndis wrapper,再由wrapper初始生成驅動程序管理塊并完成相應各種初始化工作,登錄網卡驅動程序所有上邊緣服務入口點,同時寫入ndis版本信息。ndis接口庫包括在ndis.sys中,它是一個核態函數庫,有一套抽象的函數,無論協議驅動程序還是nic驅動程序都連接到這個庫中,以實現上下層之間的操作。
第二章fddi網卡驅動程序的加載和運行
第一節 網卡驅動程序的安裝
windows nt網卡驅動程序安裝的目的是實現網卡相應硬件信息和驅動程序在windows nt注冊庫中的注冊,使windows nt能夠正確識別網卡,了解所必需的軟硬件信息并能在windows nt啟動時加載相應驅動程序。
網卡驅動程序安裝時,首先在主群組的控制面板中選擇“網絡”,然后添加網卡,指定相應信息文件──oemsetup.inf的路徑,以完成以下兩個必要的操作:
復制驅動程序到相應的系統目錄(windows nt根目錄system32drivers)中;
在windows nt注冊庫中存入相應軟硬件信息。
下面主要以fddi網卡為例介紹安裝驅動程序所必需的工作:
§2.1.1網卡一般硬件參數
對于fddi網卡,必須在編寫其oemsetup.inf文件時確定以下硬件參數:
總線類型:pci(5)……括號中的數字5表示pci總線在ndis中的總線類型代碼;
廠商代號:0x5588……系統加載時確定網卡的標記,也是編程時確定pci槽號的標識;
cfid: 0x01;
介質類型:光纖(3) ……括號中的數字表示光纖在ndis中的介質類型代碼;
是否支持全雙工:支持。
對于其它的硬件信息在此inf配置信息文件中可有可無,如若配置,則可在驅動程序的編寫時利用這些信息,方便編程,同時有利于其它應用對其參數的確定和使用。網卡驅動程序的安裝通常將創建登錄表中的四個不同子鍵:
software registrion鍵,對應于驅動程序,存在于hkey_local_machinesoftwarecompany productnameversion中。我們的fddi網卡驅動程序所對應的是hkey_local_machinesoftwarenet612yhfddiyhfddi1.0;
網卡的軟件登錄鍵,存在于hkey_local_machinesoftwaremicrosoft windows ntnt3.51networkcardsyhfddi1;
驅動程序的服務登錄鍵,存在于hkey_local_machinesystemcurrentcontrolsetservices
網卡的服務登錄鍵,存在于hkey_local_machinesystemcurrentcontrolsetservices
對于每一個網絡部件,一個名為netrules的特殊子鍵在鄰近的驅動程序或網卡登錄子鍵里創建,netrules標識網絡部件為網絡整體的一部分。
fddi網卡驅動程序對應的標準軟件登錄表項將出現在以下路徑:
hkey_local_machinesoftwarenet612yhfddiyhfddi1.0;
驅動程序對應的標準項的值為:
description =yhfddi/pci adapter controller
install date =……
……
refcount =0x01
servicename =yhfddi
softwaretype =driver
title =yhfddi/pci adapter controller
而且在yhfddi驅動程序相關的netrules子鍵下,這些值項為:
bindable =yhfddi driver yhfddi adapter non exclusiver
bindform =“yhfddisys”yes no container
class = reg_multi_sz “yhfddi driver basic”
infname =oemnad1.inf
type =yhfddisys ndisdriver yhfddidriver
use =driver
yhfddi網卡在如下路徑的networkcards子鍵里介紹:
hkey_local_machinesoftwaremicrosoft
windows ntnt3.51networkcardsyhfddi1;
網卡的標準項包括以下這些值:
description =yhfddi/pci adapter controller
install date =……
manufacturer =net612
productname =yhfddi
servicename =yhfddi01
title =[01]yhfddi/pci adapter controller
§2.1.3編寫inf信息配置文件
gui inf描述語言被windows nt用以書寫系統所有部件的配置文件,當然也可以用以書寫網絡系統各部件的配置文件,該配置文件描述了網絡部件安裝、配置、刪除的執行過程。當網絡部件進行初始安裝或二次安裝(通常通過ncpa進行)時,安裝程序讀取部件對應的配置文件,進行解釋執行。gui inf描述語言由節、命令、邏輯操作、變量規范、流程控制以及一套調用dll或外部程序的機制組成,其中,節是配置文件的主體,節可分為install節(類似于函數),shell節(也類似于函數,但可調用insall和shell節),detect節(不包含命令),一個配置文件一般由若干不同類型的節組成。驅動程序的開發者根據需要可以在配置文件中編寫相應代碼,使得用戶和系統之間能進行交互,并且由用戶決定一些配置參數。
nt網卡配置文件有其一套規范,驅動程序開發者必須按規范編寫配置文件,一般來說,一個配置文件至少應該提供下面三個節:
安裝入口點:[identify]shell節。該節主要功能是給出安裝部件的類型名,系統通過它識別該部件屬于哪一大類(display,mouse,scsi,network等)中的哪一類(網絡adapter,driver,transport,service,network和netprovidor),同時,還需要給出映像文件和配置文件所在的源介質及標識。
[returnoption]shell節。系統執行安裝identify節后,執行該節。它主要功能是檢查所需安裝的部件是否支持的硬件平臺和語言,并給出網卡名(有些配置文件支持多類網卡,此時必須讓用戶進行選擇,并獲得選擇結果)。
[installoption]shell節。該節是配置文件得主體,也是上次安裝完后再次進行配置、刪除、更新的入口點。主要功能是拷貝映像文件和配置文件,生成配置的各種選項,創建該部件在注冊庫中對應的各種登錄子樹并更新重寫。
第二節 驅動程序的加載過程
§2.2.1 windows nt的啟動過程
關鍵詞:ACM競賽;程序設計;課程;教學改革
中圖分類號:TP3-4 文獻標識碼:A 文章編號:1007-9599?。?012) 19-0000-02
1 引言
計算機軟件技術的發展日新月異,給高等院校相關專業的教學帶來了很大的挑戰,為了更好地適應不斷變化的社會就業需求,就必須在傳統的計算機專業教學模式的基礎上開辟出一條新路。
在這樣的背景下,樂山師范學院計算機科學學院早在2005年就開始開展校企合作辦學,與企業聯合培養校企合作方向的學生,至今已是第八屆。相比普通班,校企合作教改班所開設的專業課程更符合于當前計算機人才市場的需求,典型的特點就是注重對學生的專業技能尤其是程序設計和軟件開發能力的系統性培養,嚴格按照軟件工程師的培養模式來開展相關的理論和實踐教學環節,這在很大程度上改變了以往只注重專業理論教學的局限性。
在對近幾年教改學生的就業情況進行分析以后,明確肯定了校企合作教學模式為我院本科人才培養體系的改革起到了決定性的促進作用,學生的專業技能有了明顯的增強,也大大提高了畢業生的就業率。
但與此同時也認識到存在的一些問題:首先,傳統的以程序設計語言語法描述為主線的教學方式,以及模式化的實驗內容,使教師在教學過程中容易將重點偏向理論,降低了對學生實踐能力的鍛煉和考核;其次,我們的軟件工程師主要是在教室和機房這樣的環境下培養出來的,缺乏真刀真槍的實踐鍛煉機會;最后,雖然校企合作人才培養方案的整體實施效果不錯,但也很難培養出高層次的計算機專業人才。
如果以上幾點不能有效地解決,那么校企合作辦學的成效和前景將受到限制,因此迫切地需要一種途徑去驅動程序設計類專業課程的教學模式改革,經過長期、反復的思考和摸索,我們認為通過開展學科專業競賽活動來推動課程教學改革是比較可行的。而在種類繁多的計算機學科專業競賽中,最權威、級別最高的就是《ACM/ICPC國際大學生程序設計競賽》。
本教改項目結合ACM競賽來促進計算機專業教學體系特別是程序設計類課程的教學改革,教改實施對象主要為計算機科學學院軟件工程專業方向的學生。首先針對程序設計類課程教學存在的問題以及問題產生的原因進行分析,然后在ACM競賽模式和特點的基礎上,嘗試通過結合ACM競賽來改革課程開設體系和課程教學模式,最后提出了解決問題的具體措施,并在實際教學應用中取得了一定的成效。
2 當前程序設計類課程教學存在的問題
2.1 人才培養模式陳舊,實踐教學比例不足
在傳統的被動教學模式中,學生缺乏學習主動性、創新性和行業競爭力。而計算機專業課程大多屬于實踐型課程,強調動手能力。為了加深對理論知識的理解,必須提高實踐教學質量,理論和實踐教學的學時分配要作適當調整。
2.2 實踐內容模板化,缺乏創新能力的培養
首先,設計性、綜合性實驗偏少,很難培養學生的創造性思維;其次,實驗內容嚴重脫離了現代軟件工程過程,更談不上對綜合型應用問題的解決;最后,在實踐教學過程中,教師干預太多,學生處于被動完成實驗任務的角色。
2.3 缺乏互助學習能力,團隊協作意識較差
當前軟件項目的開發都是以團隊形式實施的,團隊成員之間需要合理分工和無障礙溝通。但在傳統教學模式中,以項目組為單位來開展教學活動的機會非常少,更談不上互助學習和團隊協作了。
2.4 課程考核模式單一,缺乏激勵機制
課程考核主要采用傳統考核模式,考核內容受限于教材知識點,缺乏對學生知識結構與實踐技能的綜合考察,不利于學生綜合實踐能力和創新能力的培養,最終形成“高分低能”的現象。
3 改革措施
本教改項目主要通過以下幾個方面來實施以ACM競賽促進程序設計類課程教學改革的方案。
3.1 改革課程開設計劃
全面分析了目前程序設計類專業課程教學中存在的一些問題(比如教法和學法等方面),結合ACM的競賽大綱和競賽模式來調整開課計劃,把原計劃一學期的《程序設計基礎》課程的教學時間調整為一學年,第一學期是程序設計的入門教學,主要介紹高級程序設計語言編程基礎;第二學期是程序設計的進階教學,主要介紹算法設計與分析。
3.2 改革課程實踐教學模式[1]
(1)實驗內容分級化:
將實驗內容分成知識型(單一算法)、應用型(算法和實際問題結合)和綜合型(若干小算法的綜合,用于解決一個較大規模的問題)。不同級別題型的權值不同,每一級別中又包含若干個相同權值的題目,學生可以根據自身情況選擇不同級別的題型和題目數量,這樣既考慮到了不同層次學生的學習需求,又達到了統一的實驗目的。
(2)實驗題目趣味化:
傳統的程序設計類實驗題目普遍比較枯燥,難以調動學生的學習興趣和設計思路。參考ACM的海量題集,由任課教師將實驗題目生活化和趣味化,使學生自主選擇合理的數據結構和算法來解題,這樣可以充分激發學生的學習主動性和積極性,將被動學習轉化為主動學習,更好地達到了實踐教學的目的。
(3)實驗時間分散化:
考慮到實驗課時非常有限,可參照ACM競賽平臺來構建“程序設計在線評測系統”,功能包括用戶管理、題庫管理、在線提交、在線排名、在線討論等。學生注冊后可在任何時間登陸該系統進行選題、提交、評測和討論等自主學習環節,將有限的課內練習時間延續到課外。
3.3 開發資源網站
在全面搜集ACM競賽相關資源的前提下,以程序員協會的學生會員為主力設計并開發了“ACM資源網站”,并掛靠在學院的Web服務器上,以該資源網為平臺來開展競賽的宣傳、組織、培訓等活動,同時也為相關課程的理論實踐教學和學生自主學習提供了一個優質的信息化平臺。
3.4 建設學生梯隊
依托于樂山師范學院第二課堂課程《ACM程序設計》的開設,以樂山師范學院三星級社團“程序員協會”為活動主體,在全校范圍內吸納對計算機編程和競賽感興趣的學生,成立“ACM競賽興趣小組”,通過舉辦專業講座、學生科研、協會內部競賽、協會沙龍等活動,為本專業學生提供一個進一步增強職業技能的交流和學習平臺,同時也要在興趣小組中發現適合參加ACM競賽的后備人才,面向各年級構建ACM競賽梯隊。
3.5 建立激勵機制
增設創新學分,設置創新環節,搭建創新實踐的平臺,讓學生有更多的機會展示自己的專業特長。將參加ACM等學科競賽納入學生的綜合測評,通過設立競賽獎學金制度來引導學生積極參加課外科技活動、不斷提高自身的創新素質。
3.6 組織參賽
在本教改項目的實施過程中,還要積極組織學生參加各個級別的ACM賽事。對于每一次競賽,首先成立競賽領導小組,分析官方公布的競賽大綱,及時、準確地改革專業教學體系目標和課程開設計劃;其次根據往屆參賽經驗,結合本次競賽的具體情況制定出競賽活動方案,將競賽的宣傳、組織、選拔、培訓、參賽、獎勵等環節制度化;然后選拔ACM參賽隊伍,指派經驗豐富且取得過優異成績的教練對參賽隊員進行長期、深入、全方位的強化培訓和指導;最后通過對競賽成績的分析再次調整專業課程開設計劃和教學模式。[2]
3.7 改革考核手段
ACM模式的重要特色之一是完善而嚴謹的考核機制,所以我們大膽嘗試將ACM的考核方式借鑒到程序設計類課程的考核環節中,采用ACM模式的黑箱測試,將學生在“程序設計在線評測系統”中獲得的成績以50%的權重加入到課程考核指標當中。這一方面減少了教師的工作量,降低了考核錯誤率,另一方面做到了客觀、公正,更好地發掘了學生的創新能力,提高其對知識點的掌握程度。
4 要解決的關鍵問題
4.1 課程教學形式的改革,特別是如何處理實踐教學和理論教學的比重關系,以及如何讓學生能夠真正地解決問題,而不是按照設定好的思路去模仿著解決問題。
4.2 課程評價體系的改革,尤其是目前的實踐環節評價機制弊端明顯,嚴重束縛了學生的創新能力,錯誤地引導學生把自己改造為一個受制于理論教材的傀儡。
4.3 差異化教學,考慮到ACM競賽的難度較大,所以必須考慮到在將ACM融入到專業課程教學過程之后,如何確保整體教學質量并解決好部分學生學習能力較差的問題。
4.4 在ACM競賽中取得更好的成績,必須建立有效的組織、選拔、培訓、參賽、總結等相關機制。
5 結語
ACM競賽對程序設計類專業課程的教學改革起到了積極的推動作用,從教學隊伍建設的角度來看,它在提高教師的教學水平、科研能力、促進專業的對外交流等方面都起到了重要的作用;從學生培養的角度來看,它在提高學生的學習興趣、自學能力、創新能力、求真務實的科學態度上有很大的幫助。
總之,通過合理的應用ACM競賽這個平臺,可以使我們的計算機專業教學更趨科學化、規范化,可以讓我們的學生開拓視野,促進實踐型、創新型人才的培養,提高學生的就業競爭力。
參考文獻:
[1]常子楠.基于ACM模式的程序設計類課程實踐教學探索[J].計算機教育,2010(16):144-146.
[2]項煒.以學科競賽促進計算機專業教學改革的探索[J].改革與開放,2009(12):207.
[作者簡介]
為了保證操作系統的平安性和穩定性以及應用程序的可移植性,Windows操作系統不答應應用程序直接訪問系統的硬件資源,而是必須借助于相應的設備驅動程序。設備驅動程序可以直接操作硬件,假如應用程序和設備驅動程序之間實現了雙向通信,也就達到了應用程序控制底層硬件設備的目的。它們之間的通信包括兩個方面摘要:一方面是應用程序傳送給設備驅動程序的數據;另一方面是設備驅動程序發送給應用程序的消息。前者的實現較輕易,通過CreateFile()函數獲取設備驅動程序的句柄后,就可以使用Win32函數,如DeviceIoControl()、ReadFile()或WriteFile()等實現應用程序和設備驅動程序之間的通信。后者的實現遠比前者復雜,同時介紹這方面情況的文章較少。這不等于說它不重要,相反,它在有些應用場合發揮著重要的功能。設備驅動程序完成數據的采集工作后,需要馬上通知應用程序,以便應用程序能夠及時將數據取走并進行處理。諸如此類情況,不一而足。
鑒于設備驅動程序通知應用程序的重要性,本人結合一些經驗,對它進行了總結,歸納出5種方法摘要:異步過程調用(APC)、事件方式(VxD)、消息方式、異步I/O方式和事件方式(WDM)。下面分別說明這幾種方式的原理,并給出實現的部分源代碼。
1 異步過程調用(APC)
Win32應用程序使用CreateFile()函數動態加載設備驅動程序,然后定義一個回調函數backFunc(),并且將回調函數的地址%26amp;backFunc()作為參數,通過DeviceIoControl()傳送給設備驅動程序。設備驅動程序獲得回調函數的地址后,將它保存在一個全局變量(如callback)中,同時調用Get_Cur_Thread_Handle()函數獲取它的應用程序線程的句柄,并且將該句柄保存在一個全局變量(如appthread)中。當條件成熟時,設備驅動程序調用_VWIN32_QueueUserApc()函數,向Win32應用程序發送消息。這個函數帶有三個參數摘要:第一個參數為回調函數的地址(已經注冊);第二個參數為傳遞給回調函數的消息;第三個參數為調用者的線程句柄(已經注冊)。Win32應用程序收到消息后,自動調用回調函數(實際是由設備驅動程序調用)?;卣{函數的輸入參數是由設備驅動程序填入的,回調函數在這里主要是對消息進行處理。
2 事件方式(VxD)
首先,Win32應用程序創建一個事件的句柄,稱其為Ring3句柄。由于虛擬設備驅動程序使用事件的Ring0句柄,因此,需要創建Ring0句柄。用LoadLibrary()函數加載未公開的動態鏈接庫Kernel32.dll,獲得動態鏈接庫的句柄。然后,調用GetProcAddress(), 找到函數OpenVxDHandle()在動態鏈接庫中的位置。接著,用OpenVxDHandle()函數將Ring3事件句柄轉化為Ring0事件句柄。Win32應用程序用CreateFile()函數加載設備驅動程序。假如加載成功,則調用DeviceIoControl()函數將Ring0事件句柄傳給VxD;同時,創建一個輔助線程等待信號變成有信號狀態,本身則可去干其它的事情。當條件成熟時,VxD置Ring0事件為有信號狀態(調用_VWIN32_SetWin32Event()函數),這馬上觸發對應的Ring3事件為有信號狀態。一旦Ring3事件句柄為有信號狀態,Win32應用程序的輔助線程就對這個消息進行相應的處理。
3 消息方式
Win32應用程序調用CreateFile()函數動態加載虛擬設備驅動程序。加載成功后,通過調用DeviceIoControl()函數將窗體句柄傳送給VxD,VxD利用這個句柄向窗體發消息。當條件滿足時,VxD調用SHELL_PostMessage()函數向Win32應用程序發送消息。要讓該函數使用成功,必須用#define來自定義一個消息,并且也要照樣在應用程序中定義它;還要在消息循環中使用ON_MESSAGE()來定義消息對應的消息處理函數,以便消息產生時,能夠調用消息處理函數。SHELL_PostMessage()函數的第一個參數為Win32窗體句柄,第二個參數為消息ID號,第三、四個參數為發送給消息處理函數的參數,第五、六個參數為回調函數和傳給它的參數。Win32應用程序收到消息后,對消息進行處理。
4 異步I/O方式
Win32應用程序首先調用CreateFile()函數加載設備驅動程序。在調用該函數時,將倒數第2個參數設置為FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,表示以后可以對文件進行重疊I/O操作。當設備驅動程序文件創建成功后,創建一個初始態為無信號、需要手動復位的事件,并且將這個事件傳給類型為OVERLAPPED的數據結構(如Overlapped)。然后,將Overlapped作為一個參數,傳給DeviceIoControl()函數。設備驅動程序把這個I/O請求包(IRP)設置為掛起狀態,并且設置一個取消例程。假如當前IRP隊列為空,則將這個IRP傳送給StartIo()例程;否則,將它放到IRP隊列中。設備驅動程序做完這些工作后,結束這個DeviceIoControl()的處理,于是Win32應用程序可能不等待IRP處理完,就從DeviceIoControl()的調用中返回。通過判定返回值,得到IRP的處理情況。假如當前IRP處于掛起狀態,則主程序先做一些其它的工作,然后調用WaitForSingleObject()或WaitForMultipleObject()函數等待Overlapped中的事件成為有信號狀態。設備驅動程序在適當的時候處理排隊的IRP,處理完成后,調用IoCompleteRequest()函數。該函數將Overlapped中的事件設置為有信號狀態。Win32應用程序對這個事件馬上進行響應,退出等待狀態,并且將事件復位為無信號狀態,然后調用GetOverlappedResult()
函數獲取IRP的處理結果。
5 事件方式(WDM)
Win32應用程序首先創建一個事件,然后將該事件句柄傳給設備驅動程序,接著創建一個輔助線程,等待事件的有信號狀態,自己則接著干其它事情。設備驅動程序獲得該事件的句柄后,將它轉換成能夠使用的事件指針,并且把它寄存起來,以便后面使用。當條件具備后,設備驅動程序將事件設置為有信號狀態,這樣應用程序的輔助線程馬上知道這個消息,于是進行相應的處理。當設備驅動程序不再使用這個事件時,應該解除該事件的指針。
6 結語
在目前流行的Windows操作系統中,設備驅動程序是操縱硬件的最底層軟件接口。它向上提供和硬件無關的用戶接口,向下直接進行I/O、硬件中斷、DMA和內存訪問等操作。它將應用程序和硬件細節屏蔽開來,使軟件不依靠于硬件并且可在多個不同的平臺之間移植。本文介紹了5種設備驅動程序通知應用程序的方法,其中前3種方法主要用于VxD中,后2種方法主要用于WDM。這5種方法都經過實際測試。測試結果表明,它們都能夠達到設備驅動程序通知應用程序的目的。
參考文獻摘要:
[1歐青立,徐建波,李方敏,等. 虛擬設備驅動程序VxD的探究和開發. 計算機工程,2003