基於Windriver的驅動開發——驅動基礎
在一般的操作系統(linux,Windows),不能夠從用戶空間直接訪問硬件,只能從系統內核訪問硬件。系統內核中訪問硬件的部分叫設備驅動。
設備驅動提供操作系統和硬件設備的接口,負責設備命令和程序命令的轉換,設備數據的IO,以及設備錯誤處理。
設備驅動分類
設備驅動按功能性主要分爲:
- Monolithic驅動:
1、包含支持硬件設備所有功能的單一驅動。
2、驅動通過IOCTLs(IO control commands)和用戶程序交互,通過調用相應的WDK,ETK,DDI/DKI和硬件交互。
- Layered驅動:
1、作爲一堆驅動中的一部分和其它驅動一起處理IO請求的驅動。
2、Layered驅動有時也叫過濾驅動。 - Miniport驅動:
1、Miniport驅動是對應於class驅動而言的,相當於class驅動的插件。
2、class驅動爲Miniport驅動提供基本通用功能。Minport實現具體設備的特殊功能。
3、Miniport 僅在Windows NT中支持。
設備驅動按應用的操作系統主要分爲
- WDM驅動:
1、Windows的驅動模型。WDM使一部分代碼與操作系統集成,這些代碼負責處理底層的緩衝管理,包括DMA和Pnp。 - Unix設備驅動:
1、在Unix驅動模式下,驅動根據設備分屬於三個類別:chracter(char)驅動,block驅動和network驅動。
2、從用戶空間的程序訪問驅動需要通過文件系統;驅動是一個可以被打開的特殊文件。 - Linux設備驅動:
1、Linux設備驅動是基於Unix設備驅動模式的。
2、在Linux下,驅動做爲內核的module被內核動態鏈接的。
驅動應用
每個設備驅動都有一個入口點。在Windows下是DriverEntry();在Linux下是init_module()。當操作系統加載設備驅動時,驅動入口會被調用。 在調用驅動入口中,包含全局的初始化操作,和驅動的回調的註冊。
和硬件連接
- 在Windows下,硬件和驅動的連接通過INF文件。在調用DriverEntry()之前,操作系統識別設備並在設備附帶的INF文件中查找相關驅動,然後調用相應驅動的DirverEntry()。 在Linux中,硬件和驅動的連接在init_module()中定義。
用戶程序調用
- 用戶空間程序通過硬件驅動的實例句柄和驅動交互。
- 驅動和用戶程序程序之間傳遞的數據I/O管理封裝爲IRP(IO Request Packet)。