張小磊,孟李林,崔晨琪
(西安郵電大學 電子工程學院,陜西 西安 710061)
設備驅動是計算機系統里軟硬件交互的接口,是計算機操縱硬件的基礎,它的性能在很大程度上影響著整個系統的性能。KMDF是微軟推出的下一代驅動模型WDF中的內核模式驅動程序框架,意在取代從WINDOWS2000就開始使用的WDM模型。其旨在為開發者提供一個面向對象的事件驅動開發框架,并封裝了驅動與操作系統的接口使開發者可以更關注驅動需要操控的硬件,以改變長久以來驅動程序作為硬件和操作系統的連接,既要處理硬件行為,又要與操作系統內核交互而導致的開發難度大,開發門檻高等問題。KMDF是WINDOWS 7/8首先的驅動模型。
PCI Express是一種應用于各種計算與通信平臺的高性能、通用、串行 I/O 互連協議。它采用包交換技術、Ack/Nak協議以及流量控制技術,實現報文的高速高可靠傳輸。此外,PCI Express協議保持與現有 PCI 設備的軟件兼容性,而且可以用較低的開銷提升現有 PCI 系統的性能,在 PC 機及嵌入式系統中得到了廣泛的應用。因此研究基于KMDF驅動框架的PCI Express驅動設計具有現實意義。
本文介紹KMDF的對象模型和I/O模型,并介紹一種基于KMDF的PCI Express設備驅動程序的設計。
KMDF是內核模式驅動開發的框架,它定義了基于對象的編程模型,可以通過一系列層次化組織的對象以及與對象相關聯的方法和屬性來表示設備、驅動、隊列等信息。KMDF對象模型中定義的主要的對象以及其層次如圖1所示:

圖1 KMDF中的主要對象及其層次
圖1中KMDF框架定義的主要對象有:
(1)WDFDRIVER:WDF驅動對象,所有對象的根對象,描述一個驅動程序在內存的實例,維護驅動程序的相關信息,如驅動的入口點,加載位置,可以管理的設備等。每一個驅動程序在內存中有且僅有一個WDFDRIVER對象。
(2)WDFDEVICE:WDF設備對象,系統中具體硬件的抽象,代表驅動程序可以控制的硬件設備,用戶程序可以通過定義的設備接口訪問設備。WDFDEVICE也可以是虛擬設備。
(3)WDFQUEUE:WDF隊列對象,一個特殊的I/O請求隊列,它定義了一系列回調函數,當I/O請求進入隊列時,框架將自動調用對應的回調函數處理。
(4)WDFINTERRUPT:WDF中斷對象,定義了設備中斷使能,禁止回調函數和設備中斷的服務程序和DPC例程。
KMDF建立了自己的I/O模型,可以截獲發送給本設備驅動程序的所有IRP。當IRP到達時,分發器根據IRP的主功能碼把IRP分發到I/O請求隊列或者電源管理隊列,框架會在適當的時間自動的調用已經注冊的回調函數。I/O流程如圖2所示:

圖2 I/O通過KMDF庫和驅動程序流程
KMDF的I/O隊列管理那些針對驅動程序的請求。驅動程序通常創建一個或多個隊列,每個隊列可以接受一種或多種類型的請求。調度方法決定給定時間內驅動程序可服務的請求數量。
PCI Express作為高速串行I/O技術已經在現行的計算機系統得到了廣泛應用,本文涉及的PCI Express板卡是自行研發的基于Altera公司PCI Express硬核設計的高速數據處理系統。該系統的框架圖如圖3所示:
系統采用Altera 公司的Cyclone IV GX 系列FPGA芯片作為核心,使用FPGA中的硬件電路完成對下發數據的處理。FPGA主要模塊功能介紹:

圖3 系統框架圖
PCI-E IP硬核:實現PCI Express 1.1版本協議,完成PC機地址域與設備內部地址域轉換,DMA通過IP硬核接口與PC機通信。IP硬核是完成計算機系統和數據處理卡系統通信的橋梁。
CPU:采用Altera公司NIOS II軟核實現,作為PCI Expess設備的主控模塊,根據RAM緩沖區的數據包頭,啟動相應的算法模塊;或者根據算法模塊的結束信號啟動一次DMA傳輸。
DMA以及RAM:DMA實現數據的高速傳輸,提高系統的效率;RAM數據的緩沖區,在每次運算過程緩存帶運算數據以及運算結果。
數據處理:系統的功能模塊,實現具體的數據處理算法,由CPU調度。
PCI Express是與PCI軟件兼容的系統總線,PCI Express具有與PCI總線相同的軟件訪問接口,因此可以使用與PCI相同的軟件流程。
本文介紹的PCI Express高速處理卡的驅動流程如圖4所示。
KMDF設備驅動程序初始化與WDM初始化入口相同,均為NTSTATSU DriverEntry(INPDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)函數[7],但是函數主要完成的功能并不相同,在WDM中主要完成驅動的回調函數設置,而在KMDF中則主要完成驅動對象的創建,即WDFDRIVER對象的創建,WDFDRIVER對象是對WDM中DRIVER_OBJECT對象的封裝,創建WDFDRIVER對象時需要提供創建WDFDEVICE對象的回調函數和驅動的卸載例程的回調函數,以及屬于驅動對象的屬性。在KMDF中并不允許直接對框架創建的對象賦值,需要由專門的對象配置來實現。

圖4 驅動流程圖
對于KMDF中涉及的所有內核對象都可以在創建時指定一個屬于對象的環境變量結構,和獲得環境變量的方法名字,該環境變量的信息存儲在對象屬性結構里,由框架在對象創建時使用。主要代碼如下:
WDF_DRIVER_CONFIG_INIT
(&config,UsbDataTransAdd);
//配置參數初始化,主要用來設置添加設備函數UsbDataTransAdd,此函數由框架在每次枚舉屬于驅動程序的設備時調用。
status = WdfDriverCreate(DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE);
//創建驅動對象,其中DriverObject由框架傳遞來的WDM驅動對象,RegistryPath是注冊表中的服務鍵路徑,config為已經初始化的對象配置。
在驅動初始化以后,或者設備被首次枚舉,系統都會調用驅動對象中設置的添加設備程序,設備添加例程主要的職責是:創建設備對象、一個或多個I/O隊列和設備GUID接口,設置各種事件回調函數,以及創建中斷對象。主要函數如下:
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//初始化即插即用和電源管理例程配置結構,該結構只有在初始化后才在可以使用,并且該結構的初始化必須在設備對象創建之前完成。
WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
//創建設備對象。
WDF_INTERRUPT_CONFIG_INIT(
&interruptConfig,
PCISample_EvtInterruptIsr,
PCISample_EvtInterruptDpc);
//設置中斷例程和延時過程函數
WdfInterruptCreate(
device,
&interruptConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&pDeviceContext->Interrupt);
//創建中斷對象。
WdfDeviceCreateDeviceInterface(
device, (LPGUID)&PCI_DEVINTERFACE_GUID, NULL);
//設置內核驅動與應用態的接口其中PCI_DEVINTERFACE_GUID是應用程序尋找驅動的標識碼,可使用Visual Studio中自帶的GUID生成器生成。
KMDF設備驅動模型為分層模型,最底層為PCI Express總線驅動由操作系統提供,總線驅動上層才是我們提供的特定設備的設備驅動。在PCI Express設備驅動初始化時,由總線驅動通過IO端口CONFIG_ADDRESS(地址0CF8~0CFB),CONFIG_DATA(地址0CFC~0CFF)獲取配置空間設備資源信息[8],將資源信息記錄到設備對象的設備環境中,并且映射PCI Express配置空間BAR寄存器里描述的PCI Express內存到PC機內存空間,以使得驅動程序可以使用簡單的內存訪問函數直接訪問設備空間。
在創建設備對象時注冊的例程PcieDevicePrepareHardware會在設備進入工作狀態之前由框架調用完成對硬件資源的獲取,并且會在即將進入D0時對硬件進行一些配置,相關的主要代碼:
case CmResourceTypeMemory:
{
momeryflag = TRUE;
pDevicecontext->MemBaseAdd=
MmMapIoSpace(
escriptor->u.Memory.Start,
descriptor->u.Memory.Length,
MmNonCached);
pDevicecontext->MemLength =
descriptor->u.Memory.Length;
pDevicecontext->PhysicalAdd=
descriptor->u.Memory.Start;
break;
}
//獲取PCI Express設備在PC內存空間的地址并使用MmMapIoSpace函數將其轉換成可被直接訪問的內核態虛擬地址。
case CmResourceTypeInterrupt:
{ASSERT(descriptor->Flags!=
CM_RESOURCE_INTERRUPT_MESSAGE)break;}
在本設計中主要獲取兩種資源:
(1)CmResourceTypeMemory內存映射地址空間:PCI Express協議通過BAR映射FPGA電路控制寄存器到計算機系統的硬件地址空間,使得我們可以使用內存訪問的方式直接訪問FPGA硬件。
(2)中斷資源:在WDM模型中,我們在必須獲得分配給此設備的中斷號以及此設備支持的中斷方式等中斷資源,以此為信息注冊本設備的中斷。但是在KMDF中這些已經被框架所實現,所以中斷資源變得可有可無。
訪問內存映射地址空間時可以用KMDF提供的專用函數WRITE_RESISTER_xx、READ_RESISTER_xx系列函數讀寫該空間對應的虛擬地址或者使用一般的內存訪問函數直接訪問該空間對應的虛擬地址。
本系統對數據的傳輸主要采用DMA實現,通過兩個DMA實現數據的上行和下行,在本系統主要要求傳輸速度的前提下,本設計采用了把DMA控制和緩沖區映射到應用層,由應用程序直接控制DMA傳輸過程,以減少程序在狀態切換上的開銷。涉及的主要代碼如下:
pDevicecontext->mdlcard=IoAllocateMdl(
pDevicecontext->UserMemBase1, pDevicecontext->UserMemLength1,
FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(dx->mdlcard);//分配MDL結構,其中dx->UserMemBase1為在PcieDevicePrepareHardware例程得到的硬件資源。
pDevicecontext->usercard= MmMapLockedPagesSpecifyCache
(pDevicecontext->MemBaseAdd,
UserMode,
MmNonCached,
NULL, FALSE,
NormalPagePriority);
//映射硬件資源到應用態空間,pDevicecontext->MemBaseAdd存儲DMA控制寄存器空間基地址;pDevicecontext->usercard為得到的用戶空間地址,在合適的時機傳回應用態。
pDevicecontext->mdldma=
IoAllocateMdl(pDevicecontext->vaCom
monBuffer,
SJY0601_MAXTRANSFER,
FALSE,FALSE, NULL);
MmProbeAndLockPages
(pDevicecontext->mdldma,
KernelMode,
IoModifyAccess);
pDevicecontext->userdma= MmMapLockedPagesSpecifyCache
(pDevicecontext->mdldma,
UserMode,
MmNonCached,
NULL,FALSE,
NormalPagePriority);
//其中pDevicecontext->mdldma為DMA緩沖區基地址,由應用程序直接讀寫。
經測試,本文所述的基于KMDF模型的PCI Express 數據處理系統驅動在DMA 傳輸模式下處理數據速度可達 3024 Mbits/s(包括下發數據,數據簡單處理,數據上發),且在壓力測試的100小時里程序能穩定、可靠地工作。
本文所述的PCI Express設備驅動程序,使用了KMDF模型,該模型提供了面向對象、事件驅動的驅動程序開發框架,由框架負責管理與操作系統內核相關的功能,不但使得驅動程序的編寫簡單方便而且可靠性和穩定性提高。同時本文所述的驅動使用了內核態到應用態地址映射的技術,所有數據均由應用程序直接寫入設備,大幅度減少CPU狀態轉換帶來的開銷,提高系統的整體速度。綜上所述這樣的設計具有較傳統設計更優的性能。
[1] 李正平,徐超,陳軍寧,等.WDF驅動程序的設計與實現[J].計算機技術與發展,2007(5):227-230.
[2] 馬晨,陳彥萍.基于PCI Express總線 1394b 網絡傳輸系統WDM驅動設計[J].測控技術,2012,32(3):93-97.
[3] 武安河.Windows設備驅動程序WDF開發[M].北京:電子工業出版社,2009:3-11.
[4] 王祥.基于FPGA的PCI-E數據采集系統的設計與實現[D].成都:電子科技大學,2012:1-5.
[5] 季喬龍.基于WDF的加密卡驅動程序開發及密鑰管理[D].成都:電子科技大學,2012:10-11.
[6] Ronald D Reeves.Windows 7設備驅動程序開發[M].張猛,紀小玲,周姝嫣,譯.北京:人民郵電出版社,2012:95-95.
[7] 黎紹秀,衛紅,蘭春嘉. PCI- E 圖像采集系統的 WDF 驅動程序設計[J].科學技術與工程, 2011,11(16):3824-3827.
[8] 王齊.PCI Express體系結構導讀[M].北京:機械工業出版社,2011:123-123.