Windows NT 裝置驅動程式開發基礎(5) (轉)

worldblog發表於2007-12-12
Windows NT 裝置驅動程式開發基礎(5) (轉)[@more@]1.3.6 緩衝的I/O與直接I/O 
 
 在建立了一個裝置後,可以透過設定Device的Flags域的值來將裝置設 
置成緩衝的I/O或直接的I/O。 
 
 如果該值被設為DO_BUFFERED_IO,每當I/O管理器收到一個讀寫請求,就在的非分 
頁區分配一塊與區大小相同的區域,並將首指標存放於Irp的AssociatedIrp.S 
ystemBuffer中,驅動程式就透過這個緩衝區與使用者資料。每當一個讀請求被完成時 
I/O管理器自動將該緩衝區中的內容複製到使用者區,並釋放該區域。 
 
 如果使用者區大於一頁(在80x86上為4096位元組),一般將該值設為DO_DIRECT_IO。 
這時每當I/O管理器收到一個讀寫請求,先鎖定使用者區的實體記憶體,然後為其建立一個內 
存描述表(MDL),並將該表的首指標存放於Irp物件的MdlAddress中,驅動程式可以透過 
MmGetSystemAddresorMdl獲得使用者區在空間中的地址。每當一個讀請求被完 
成時I/O管理器自動將該區域解鎖。 
 
 
 1.3.7 定時 

 
為了防止當裝置出現某種故障時導致讀寫請求超時,或需要定時輪詢某些裝置的狀態 
,驅動程式需要設定一些定時器。驅動程式中有兩種方法可以設定定時器。一種是呼叫 
IoInitializeTimer將一個定時器過程IoTimer與一個裝置物件聯絡起來。在呼叫IoStar 
tTimer後,系統將每一秒鐘呼叫一次IoTimer,直至驅動程式呼叫IoStopTimer。如果需 
要設定更小間隔的定時器,需要用到被稱為CustomTimerDpc的一種推遲過程呼叫機制。 
它可以設定系統每隔一定時間將一個設定好的DPC物件放到DPC佇列的末尾,一個指 
定的定時器Dpc過程。這個時間間隔可以精確到100ns。 
 
 
 
-- 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992241/,如需轉載,請註明出處,否則將追究法律責任。

相關文章