nt
中的驅動採用分層結構,乙個應用層的
io命令需要通過
io子系統,
io系統服務層,若干層的驅動,最後才能到達硬體,硬體有什麼資料需要返回,也需要經過這些層,一點都不能省。某一層的驅動只能和自己相鄰層的驅動聯絡,而且聯絡都要通過
io manager
,用乙個名叫
irp的資料結構完成通訊。
irp基本上是
nt驅動架構中最重要的乙個資料結構了,哪兒都能看到它,哪兒都需要用到它。為了對整個分層架構有個大體的了解,我們先來看乙個圖,這個圖在
ddk1. io
子系統呼叫
io服務元件,要求開啟乙個檔案。
2. io manager
呼叫object manager
尋找檔案,並呼叫安全元件來檢視該呼叫者是否真的有許可權
3. io manager
分別在檔案系統和磁碟上尋找相關的檔案實體,如果沒找到,操作掛起;如果找到了,則繼續。
4. io manager
生成乙個
irp包,初始化一些資料
5. io manager
找到file system driver
,並往它傳入先前生成的
irp。
irp中有乙個棧,指定了哪一層做哪些操作。剛傳入的
irp不一定有乙個完整的棧資訊,因為驅動程式在處理過程中,可以修改它下面層的驅動對應的
irp棧資訊。實際上跨層操作並不好,每一層的棧資訊基本都是上一層給指定的,而不是一開始指定。驅動也可以把乙個命令分成好幾個小命令,分別往底層傳。
6. 所有層上的驅動都完成自己應該做的工作
7. 所有層上的驅動分別呼叫
complete operation
。complete operation
是上一層驅動指定的,表示讓下層驅動完成操作後就呼叫該方法,好讓它做一些確定是否成功,**資源之類的操作。
8. 把
io status
拷貝到子系統空間中,好讓最頂部的呼叫者知道呼叫結果
9. io manager
清空irp
10.io manager
把檔案控制代碼返回給呼叫者
irp中有一堆的資料結構,比較重要的有如下幾個
irp主要資料項
說明
io_status_block iostatus
存放i/o
請求的狀態
pvoid associatedirp.systembuffer
如果裝置執行緩衝
i/o,則為指向系統空間緩衝區的指標。
否則為null
pmdl mdladdress
如果裝置執行直接
i/o,指向使用者空間緩衝區的記憶體描述表的指標
pvoid userbuffer
i/o緩衝區的使用者空間位址
boolean cancel
指示irp
已被取消
訪問硬體的任何裝置必須使用某種機制保證驅動程式的不同部分不同時訪問相同的硬體。在乙個多處理器系統中,「write」irp處理程式可以同時在兩個不同的處理器上執行。如果它們兩個都試圖訪問相同的硬體,則會出現不可預料的結果。同樣,如果乙個「write」irp正在試圖訪問硬體的同時發生了中斷,那麼,兩個動作可能會相互影響。
核心採用兩種機制來同步這些衝突操作:
第一種是採用臨界段例程,使用這些臨界段例程保證**不會被中斷處理程式中斷。這些臨階段例程在內部使用了中斷自旋鎖,所以可以保證多處理器同步。
第二種是使用startio例程序列處理irp,每個裝置物件有一內部的irp佇列,驅動程式的派發例程將irp插入這個佇列中。核心i/o管理器從這個佇列乙個個的取出irp,並把它們傳遞到驅動程式的startio例程。所以startio例程序列的處理irp,保證不與其它的irp處理例程衝突。
如果乙個irp已經在乙個佇列中,此時使用者執行緒突然中止或其呼叫win32函式取消了這次i/o,驅動程式必須取消這個irp。這可以通過給每乙個排隊的irp掛接乙個取消**例程來實現。
如果使用者態程式關閉了裝置的檔案控制代碼,而這個裝置有重疊請求在等待,則必須要有「清理」例程。清理例程負責取消與乙個檔案控制代碼關聯的所有irp。
驅動學習筆記 irp
irp是windows核心中的一種非常重要的資料結構。上層應用程式與底層驅動程式通訊時,應用程式會發出i o請求,作業系統將相應的i o請求轉換成相應的irp,不同的irp會根據型別被分派到不同的派遣例程中進行處理。irp相當於ring3下的訊息,應用程式對驅動程式進行操作的時候會發出相應的訊息,驅...
windows驅動程式設計學習筆記 (三)IRP
一,irp的概念 i o request package 當乙個應用程式呼叫函式去操作某個裝置時,比如呼叫createfile,deviceiocontrol,等等時,i o管理器為此函式建立乙個irp資料結構物件和乙個irp stack location資料結構物件陣列,陣列個數等於驅動程式堆疊上...
linux驅動學習筆記4
led驅動 1.框架 2.完善硬體驅動 a.看原理圖 b.看2440手冊 c.寫 對映虛擬位址 3.ioremap void ioremap unsigned long phys addr,unsigned long size,unsigned long flags void ioremap uns...