淺談Windows驅動開發

1。 前言

最近一段時間,我一直在研究 windows 驅動開發,下面跟大家簡單聊聊:

對比 linux,windows 驅動無論是市面上的書籍,影片還是社群,博文以及號主,寫的人很少,導致學習曲線直線上升;

windows 驅動 從業 人員就更少了;

開發環境部署麻煩;

驅動安裝釋出麻煩,需要數字簽名。如果是釋出到windows update 庫裡面,還需要做微標認證。

為什麼還要寫?因為在學習的過程中,發現很多東西還是很相同的,如果你是從事linux 開發,可能會有些啟發,如果是對windows 驅動開發有需求,可能提供一些不成熟的建議。

接下來進入正文,給大家簡單介紹一下windows 驅動。

2。 windows 體系架構

2。1 作業系統與應用程式

在許多現代作業系統中,應用程式和作業系統是相互隔離的。作業系統的核心程式碼執行在特權模式下,即核心模式。而應用程式執行在非特權模式下,即使用者模式。

作業系統和應用程式的關心類似於伺服器和客戶端的關係,這點在windows 平臺下顯得更加突出:

淺談Windows驅動開發

幾個概念:

system 程序:windows 作業系統本身會起一個 system 程序(載入kernel32。dll),有點類似於 linux 下的 init程序,具體細節不展開。

FDO (Function Driver Object):裝置功能驅動

FiDO (Filter Driver Object):過濾驅動

PDO (Physical Driver Object):物理裝置驅動,真正訪問硬體的地方。

IRP (I/O Request Packet),應用程式 想要訪問核心資料,必須透過IRP 傳遞。又叫IRP請求,當應用程式和驅動互動時,傳送一個IRP 請求,IRP 會在各層裝置驅動之間來回傳動與轉發。

2。2 作業系統分層

淺談Windows驅動開發

windows 的設計思想是將核心設計的儘可能的小,並且採用“客戶端-伺服器”的結構。作業系統各個元件或者模組是透過訊息進行通訊的。

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!

無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、專案都比較新也比較全!某魚上買估計至少要好幾十。

點選這裡找小助理0元領取:

加微信領取資料

淺談Windows驅動開發

淺談Windows驅動開發

win32 子系統:是最純正的windows 系統,其他子系統都是透過win32 子系統的介面來實現的,一般很少用到。

Natvie API :在win32 api 基礎上加上Nt 字首,基於版本相容考慮

系統服務:Native API 從使用者模式進入核心模式,呼叫系統服務。(軟中斷方式實現,

陷入核心

執行元件:核心模式下的一組服務函式。

物件管理程式:windows 作業系統提供的服務幾乎都是以物件的形式存在的,這裡的物件類似於面嚮物件語言中物件的概論。如驅動物件,裝置物件等管理。

程序管理程式:負責建立和終止程序,執行緒排程是由核心負責的。程序管理程式依賴於其他執行元件。

虛擬記憶體管理程式:在CPU的記憶體管理單元(MMU)的協助下,透過某種對映將物理記憶體和虛擬記憶體關聯起來。

I/O 管理器:負責發起I/O 請求,並管理請求。它由一系列核心模式下的例程所組成,這些例程為使用者模式下的程序提供了統一介面。I/O 管理器的目標是使來自使用者模式的I/O請求獨立於裝置。

配置管理程式:配置管理程式,記錄所有計算機軟,硬體的配置資訊。它使用一個被稱為登錄檔的資料庫儲存這些資料。裝置驅動程式根據登錄檔中的資訊進行載入

驅動程式:I/O 管理器接收應用程式後,建立相應的 IRP,並傳送至驅動程式進行處理:

根據IRP的請求,直接操作硬體,然後完成此IRP,並返回

根據IRP的請求,轉發到更底層的驅動中去,並等待底層驅動的返回。

接受到IRP驅動後,不著急於完成。而是分配新的IRP法定其他驅動程式,並等待返回。

核心:核心被認為是 Windows 作業系統的心臟。Windows 的核心從執行元件分割出來。和執行元件相比,核心是非常小的:

對核心物件的支援。

對執行緒的排程

對多處理器同步支援。

中斷處理函式的支援。

對異常陷阱的支援。

對其他硬體特殊功能的支援。

硬體抽象層:不同的硬體平臺,提供不同的硬體抽象層,並對上層提供統一的操作硬體的介面。

2。3 應用程式和驅動

淺談Windows驅動開發

淺談Windows驅動開發

3。 windows 驅動框架

淺談Windows驅動開發

3。1 驅動模型:

windows 驅動大致分為這幾類:

function driver:裝置功能驅動

filter driver:裝置輔助驅動

software driver:軟體模組驅動

bus driver:匯流排裝置驅動

3。2 驅動演變

淺談Windows驅動開發

NT 模型 :2000以前,不支援 PNP (即插即用裝置)

WDM 模型:NT 基礎上,支援 PNP

WDF:WDM的重封裝

KMDF:核心模式(sys)

UMDF:使用者模式(dll)

win7 x64 劃時代作業系統,開始數字簽名了

win10 :雙認證簽名,也就是說對驅動的安全性要求更高了。

3。3 驅動垂直層次結構

淺談Windows驅動開發

裝置的建立順序,先建立底層PDO,在建立高層的FDO,即從底層裝置到高層裝置。

在PDO 和 FDO之間可能有各種過濾驅動。每層裝置物件由不同的驅動程式建立,或者說每層的裝置對應著不同的驅動程式。

底層裝置物件尋找上一層的裝置物件,是依靠底層裝置物件的AttachedDevice 來尋找的。

3。4 驅動水平層次結構

淺談Windows驅動開發

同一驅動程式創建出來的裝置物件的關係稱之為水平層次關係。

每一個裝置透過NextDevice可以尋找水平層次的下一個裝置物件。

3。5 一個複雜的驅動結構

淺談Windows驅動開發

4。 windows 開發環境搭建

4。1 開發環境部署

以 win10 為例,列出需要安裝的東西,詳細過程限於篇幅以後更新

安裝VS2019

安裝 Windows SDK:VS 2019 順帶安裝

安裝 WDK

安裝 VMware + Win10 虛擬系統

4。2 常用除錯工具

windbg:除錯核心。WDK 自帶,配合串列埠或者網路除錯windows 核心

DebugViewer:檢視核心列印

driverMonitor:驅動安裝

PCHunter_free:驅動強制解除安裝,不支援2004版本

devicetree:裝置列舉

winobj:檢視符號連結

5。 windows 驅動學習建議

有關Windows 驅動開發書籍,博文,教程甚少。如果有這方面需求的可以給以下幾個建議:

環境搭建:win7 32 + vs2013 即可。不建議 win10 + vs2019,比較新,遇到問題不好解決。其次早期的一些除錯工具,win10 最新版本不一定支援。

繞開數字簽名:先使用測試模式,安裝驅動。否則光安裝部署就夠折騰的。

入門採用 WDM 驅動模型。市面上將WDM 的書籍和資料相對多些,相對來說,WDF 開發資料來不少。

多看書,windows 驅動不想linux 資料一大把,遇到不懂得,加技術群,啃書本。

推薦書籍:

《Windows 驅動開發技術詳解》:已絕版

《竹林蹊徑:深入理解windows 驅動開發》:已絕版

《windows 7:裝置驅動程式開發 》:wdf 講的比較多得書

原文連結:https://mp。weixin。qq。com/s/qGydT22PNfbvhxUT4pNmJw

轉載自:嵌入式微處理器

原文連結:淺談Windows驅動開發

本文來源網路,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯絡我進行刪除。