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