驅動程式開發(一) 概述

2021-04-13 02:18:42 字數 2813 閱讀 8418

很久沒有網了,出了一段時間的差,近來,莫名的就有點鬱悶!。也畢業好幾年了,技術還需要提高,開始覺得可以考慮換個方向。以前我是做視音訊開發的。換哪個方向呢?人越多的方向,好像越是沒有前途。想想當初上大學,那可是越多人考的學校,學費越貴啊!可現在的職業呢?越多人幹的事,越是沒有前途了。考慮來考慮去,決定學習一下驅動程式的開發吧!於是從網上查詢了一些資料,看的懂的覺得蠻不錯適合我這種小學生的就貼了出來,算是學習筆記吧!

使用者模式與核心模式

從intel80386開始,出於安全性和穩定性的考慮,該系列的cpu可以執行於ring0~ring3從高到低四個不同的許可權級,對資料也提供相應的四個保護級別。執行於較低階別的**不能隨意呼叫高階別的**和訪問較高階別的資料,而且也只有執行在ring0層的**可以直接對物理硬體進行訪問。由於windowsnt是乙個支援多平台的作業系統,為了與其他平台相容,它只利用了cpu的兩個執行級別。乙個被稱為核心模式,對應80x86的ring0層,是作業系統的核心部分,裝置驅動程式就是執行在該模式下;另乙個被稱為使用者模式,對應80x86的ring3層,作業系統的使用者介面部分(就是我們通常所說的win32 api)以及所有的使用者應用程式都執行在該級別。作業系統對執行在核心模式下的**是不設防的,所以不管是建設還是破壞核心模式下的程式設計都是值得去研究的。

圖1-win2000系統的分層結構

在物理硬體與系統核心之間有乙個硬體抽象層(hardwareabstractionlayer),它遮蔽了不同平台硬體的差異,向作業系統的上層提供了一套統一的介面。從圖中我們還可以看到,裝置驅動程式(devicedriver)是被i/o管理器(i/omanager)包圍起來的,即驅動程式與作業系統上層的通訊全部都要通過i/o管理器。這給驅動程式的編寫帶來了很大的便利,因為很多諸如接收使用者的請求、與使用者程式交換資料、記憶體對映、掛接中斷、同步等等麻煩的工作都由i/o管理器代勞了。

驅動程式的分類

驅動程式並不像所有人想的那樣一定要和硬體打交道,我粗略的把他分為兩類:硬驅動和軟驅動。硬驅動就是對硬體直接程式設計進行控制,這類驅動通常必須遵守硬體的通訊協議,直接對硬體進行埠訪問、中斷響應、dma傳輸。它包括:串、並行口,鍵盤,檔案系統,scsi,網路等驅動程式;另外一種軟驅動呢?不需要直接對硬體就行操作。我認為他可以理解為它是在硬驅動之上的一層更為高階的驅動。我想學習的主要是軟驅動。

一般來說,裝置驅動程式的任務主要有兩個:第一,接受來自使用者程式的讀寫請求,把使用者的資料傳送給裝置,或把從裝置接收到的資料傳送給使用者;第二,輪詢裝置或處理來自裝置的中斷請求,完成資料傳輸。

驅動程式的結構

在這裡,我主要介紹wdm的結構。wdm(windows driver module)是什麼東西呢?在windows98/95下面,也許你聽得最多的是vxd,我只知道vxd是一種驅動程式,和wdm差不多的東西。只是因為windows2000是windowsnt那條線過來的東西,要加上兩個主要的新功能:即插即用(plug and play)和電源管理(power menage),又不能用windows98/95那一套,所以就搞出乙個叫wdm這麼個東西,來支援pnp和pm.。其實想想,現在的技術名詞還不是一般的多啊!總之wdm大家都叫它windows驅動程式模型

windows2000裡有叫即插即用管理器和i/o(此i/o非彼i/o埠)管理器的兩個東西。比如說我在機器上插了一張符合pci規範的pci卡。即插即用管理器會發現這張卡插在第n個插槽上,然後即插即用管理器會說它找到了這樣一張卡,它就去找有沒有現成的驅動程式,如果沒有找到,它會告訴我們,我找到了這樣一張卡,請你插入這張卡的驅動程式盤。好,我們就把驅動程式盤給它,即插即用管理器會去找驅動程式盤上的inf檔案,找到後它會比較pci卡上的標誌和inf檔案裡的標誌是否相同,如果相同,它就會依照inf檔案裡提供的路徑去找驅動程式,找到之後就可以交給i/o管理器,i/o管理器會裝載這個驅動程式。i/o管理器在做了一些介面的工作後,即插即用管理器會先分配好相關的資源給pci卡,比如說i/o埠空間、記憶體空間和中斷向量,然後告訴這張卡的驅動程式,我給你分配了這些資源,你看怎麼的。如果你沒有怎麼的或不敢怎麼的,那就趕快記下這些資源,以備後用。

下面說i/o管理器這個東西。上面我們講到i/o管理器裝載這個驅動程式,驅動程式有乙個大門,還有n多的小門。i/o管理器先從大門進去(因為i/o管理器只找得到大門,i/o管理器是不是很傻,no,當然有它的道理,你別問我:i/o管理器怎麼找到大門的?驅動程式無非就是一些檔案,i/o管理器把這麼些檔案載入到系統中去),去找一樣東西:進小門的地圖。我們要在大門進去的房間裡放這張地圖(驅動程式都是我們造的,我們當然有驅動程式的地圖啦)。i/o管理器找到了地圖,就可以自由進出大小門了。———這些大小門說白了就是函式(不要問我函式是什麼東東),小門的地圖就是函式的位址。i/o管理器知道了這些函式的位址,當然就可以呼叫這些函式啦。還有乙個叫irp的東西,中文名叫i/o請求包。我們這樣來理解它:在使用者的應用程式這一端,要和驅動程式對話,它們之間不是簡單的呼叫函式(至於為什麼,我現在也不知道),應用程式和驅動程式之間有i/o管理器隔著,應用程式對驅動程式的操作,首先由i/o管理器處理成乙個包,這個包裡面有應用程式請求的操作內容、傳送的資料等等一些東西,然後i/o管理器把這個包扔給驅動程式,驅動程式依照包裡的請求,完成操作,把該回傳的資料放進包裡,再把包扔還給i/o管理器,i/o管理器再把資料返回給應用程式。——這裡所說的包,就是irp。

這裡說的只是wdm結構的一部分,但是有了這一部分知識,其它部分就不難懂了。通過上面的介紹你看見了什麼。你可以想象得出驅動程式是什麼樣子的嗎?我是這樣想的。驅動程式好像就是乙個函式庫,只不過在大門的地方放了一張地圖。而這個大門與地圖我們見到過嗎?好像有點像dll檔案呢。在早些時候我學dll的時候,我就只會用dll來存放函式。

網路驅動程式概述

一 網路驅動程式 使用net device描述裝置,使用套接字描述符sk buff封裝資料。二 裝置的註冊 alloc ethdev分配net device結構和私有的資料區 並初始化乙太網裝置結構 標誌 硬體位址 初始化緩衝區描述符 申請中斷號並註冊中斷處理函式,最後向全域性網路裝置鍊錶新增初始化...

Linux LCD 驅動程式概述

入局 應用程式是如何操控lcd顯示器的?我們知道應用程式的呼叫介面,無非open read write 然後通過驅動程式最終作用到硬體裝置上。以字元裝置為例,對於驅動的開發者,實現了應用程式呼叫的驅動層中與之相匹配的drv open drv read drv write函式,為應用層序提供了操作實際...

ios 開發(一)概述

由於ios本質就是乙個嵌入式的平台,所以相對與一般的pc他就有很多限制 1.只允許有乙個active的程式,當然ios5以後也允許在特定的情況下在後台執行一些東西,但是和一般的應用還是有很大的差距。2.只有乙個視窗而且是佔滿了整個螢幕的視窗。3.不可以無條件的訪問所有的系統裡的內容,為了安全只能訪問...