基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建
原文出處:http://www.cnblogs.com/jacklu/p/4619110.html
本科畢業(yè)設(shè)計是這方面的工作,所以想開幾篇博客來介紹使用WDF開發(fā)PCI/PCIe接口卡的驅(qū)動程序方法。
這個系列的博客將首先用一個篇幅為不懂Windows下PCI/PCIe驅(qū)動開發(fā)的介紹WDF和開發(fā)環(huán)境搭建,接下來幾篇將直接講述程序編寫,
看完這幾篇后,希望能夠幫助讀者了解如何通過500行左右的代碼實現(xiàn)一個標準的PCIe接口卡驅(qū)動程序。
畢設(shè)題目的PCIe板卡是BAR0下映射兩個5K的內(nèi)存,偏移地址為0x20000和0x22000,源代碼在文章結(jié)束后會考慮公布
如果你覺得這篇博客對你的項目有用,請引用以下論文:
Meng Shengwei, Lu Jianjie. Design of a PCIe Interface Card Control Software Based on WDF. Fifth International Conference on Instrumentation and Measurement, Computer,Communicationand Control. IEEE, 2016:767-770.
1.1WDM與WDF
Windows平臺下的設(shè)備驅(qū)動程序從Windows 2000開始都是以WDM ( Windows Driver Model) 框架為平臺進行開發(fā)。以此模型開發(fā),開發(fā)者需要一方面實現(xiàn)驅(qū)動程序與硬件的交互,另一方面要對操作系統(tǒng)內(nèi)核進行操作,難度大。驅(qū)動程序容易出現(xiàn)問題,這也是Windows2000以來操作系統(tǒng)容易藍屏的原因。
為了改善這種局面,降低驅(qū)動程序開發(fā)者的開發(fā)難度,提高系統(tǒng)穩(wěn)定性,微軟推出了新的驅(qū)動程序開發(fā)模型WDF。WDF對WDM進行了封裝,將驅(qū)動程序中與操作系統(tǒng)交互的細節(jié)由框架實現(xiàn)。這樣驅(qū)動程序就從內(nèi)核中分離出來,開發(fā)者只需要專注處理與硬件的交互,簡化了驅(qū)動程序的設(shè)計,提高了整個系統(tǒng)的可靠性和穩(wěn)定性。WDM與WDF樣例驅(qū)動程序?qū)Ρ热缦卤硭尽Mㄟ^該表可以看到基于WDF框架的驅(qū)動程序,代碼量顯著減少,開發(fā)起來更加容易。
WDF是UMDF(User Mode Driver Framework,用戶模式驅(qū)動程序框架)和KMDF(Kernel Mode Driver Framework,內(nèi)核模式驅(qū)動程序框架)的總和。由于本課題基于PCIe硬件設(shè)備進行驅(qū)動開發(fā),涉及到內(nèi)存讀寫等內(nèi)核操作,所以使用KMDF框架來編寫驅(qū)動程序。
1.2 Windows驅(qū)動程序
我們知道Windows是一個分層的操作系統(tǒng),它的運行依賴于上層組件向下層組件的調(diào)用。一個簡化的I/O流模型如下圖:
1.3WDF框架
通過參考《竹林蹊徑 深入淺出Windows驅(qū)動開發(fā)》和《Developing_drivers_with_the_Microsoft_Windows_Driver_Foundation》,WDF抽象的框架如下圖所示:
WDF已經(jīng)把驅(qū)動程序開發(fā)做了很好的封裝,開發(fā)者只需要定義框架對象和編寫事件回調(diào)函數(shù)。WDF中也采用對象,但是它和C++這種編程語言中的對象不相同,畢竟WDF是C寫的。如何解釋WDF的對象我也做不到,我的一直把WDF中的對象看做一種數(shù)據(jù)結(jié)構(gòu),比如WDFDRIVER對象,其實就是一個與驅(qū)動程序相關(guān)的結(jié)構(gòu)體。另外,WDF中也有例程這樣的稱呼,是對routine的翻譯,可以理解為函數(shù)體。所以簡單來說,對PCIe驅(qū)動程序來說,開發(fā)者需要定義一些結(jié)構(gòu)體,編寫幾個函數(shù)就ok了,具體如何被調(diào)用,那就是WDF框架內(nèi)部的事情了,我們只需要知道,當我們注冊好編寫好的回調(diào)例程之后,當事件發(fā)生(設(shè)備插入、設(shè)備打開、I/O操作等)時,WDF會自動幫我們調(diào)用相關(guān)的例程。
1.4開發(fā)環(huán)境搭建
Windows 驅(qū)動程序開發(fā)工具包 (WDK) 與 Microsoft Visual Studio 和用于 Windows 驅(qū)動程序的調(diào)試工具相集成。該集成環(huán)境給開發(fā)者提供了開發(fā)、構(gòu)建、打包、部署、測試和調(diào)試驅(qū)動程序時所需的工具。
本課題確定時,微軟的最新驅(qū)動程序工具包為WDK8.1。WDK8.1 更新與 Microsoft Visual Studio2013 集成。開發(fā)者需要首先在微軟的官方網(wǎng)站上下載并安裝 Visual Studio 2013,然后安裝WDK 8.1 更新。微軟聲明不再對WDK8.0提供支持,也不再對WDK 8.0做任何更新,WDK8.0也不支持Windows8.1的驅(qū)動程序開發(fā)。所以本課題選用WDK8.1作為開發(fā)工具包。然而新技術(shù)發(fā)展速度飛快,在本課題完成之際,微軟打算極力推廣的Windows 10操作系統(tǒng)還未正式公布,針對Windows 10的驅(qū)動程序開發(fā)工具包WDK 10已經(jīng)推出。未來一定會推廣使用WDK10來開發(fā)。
下載鏈接:https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365,下載兩個安裝包,依次安裝,非常簡單。
1.5PCIe簡介
最后簡要介紹一下PCIe。
PCIe協(xié)議采用分層結(jié)構(gòu),如下圖所示,PCIe的結(jié)構(gòu)主要由以下三個層次組成,它們分別是:傳輸層(Transaction Layer),數(shù)據(jù)鏈路層(Data Link Layer)以及物理層(Physical Layer)。其中物理層又可以分為兩個子層:邏輯子層(Logical Sub-block)和電氣子層(Electrical Sub-Block)。
TLP(Transaction Layer Packet)由傳輸層產(chǎn)生,通過使用存儲器事務(wù),I/O事務(wù),配置事務(wù)和消息事務(wù)來進行信息數(shù)據(jù)的通信;DLLP(Data Link Layer Packet)由數(shù)據(jù)鏈路層產(chǎn)生,用來在該鏈路上兩個直連設(shè)備之間傳遞信息,其內(nèi)容主要包括功耗管理信息,流控制信息以及 TLP 的應(yīng)答信息等。DLLP只開始在數(shù)據(jù)鏈路層,并止于數(shù)據(jù)鏈路層,不會上傳到傳輸層。
以上是希望讀者能夠?qū)CIe有個初步的了解,但是對驅(qū)動程序的開發(fā)并沒什么卵用。
對PCIe設(shè)備來說,它可以有三個相互獨立的物理地址空間:設(shè)備存儲器地址空間、I/O地址空間和配置空間。因為PCIe設(shè)備支持即插即用,所以并不占用固定的內(nèi)存地址和I/O地址,而是在設(shè)備插入時由操作系統(tǒng)決定其映射的基址。配置空間對設(shè)備控制程序設(shè)計來說非常關(guān)鍵。PCIe設(shè)備支持基本的256字節(jié)PCI兼容配置空間。對PCI/PCIe設(shè)備來說,其基本的配置空間為前64字節(jié),如下圖所示。
由于PCIe是基于PCI提出的,地址空間模型沒有變化,所以PCI控制軟件可以完全兼容PCIe設(shè)備。
下一篇博客將講述PCIe的WDF驅(qū)動程序中幾個非常重要的概念,對初學者了解WDF非常有用。
廣告時間~本人博士賺外快,如需要完整的驅(qū)動程序源代碼請聯(lián)系合作email: 346457821@qq.com
總結(jié)
以上是生活随笔為你收集整理的基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WEB前端 实现图片懒加载 echo.j
- 下一篇: Windows Telnet服务端口配置