緩衝區方式讀寫操作

2021-09-30 06:05:22 字數 930 閱讀 3919

驅動程式建立裝置物件一共有三種讀寫方式,分別是緩衝區讀寫、直接方式讀寫和其他方式讀寫。這三種方式對應的裝置物件的flags子域分別是do_buffered_io、do_direct_io和0。

為什麼要設定緩衝區讀寫方式?讀寫操作一般由writefile或readfile函式引起,以writefile為例,該函式要求使用者提供一段緩衝區,並且說明緩衝區大小,然後writefile將這段記憶體的資料傳入到驅動程式中。由於這段緩衝區記憶體是使用者模式的記憶體位址,因此如果驅動程式直接引用該段記憶體是十分危險的。因此,就產生了使用緩衝區讀寫方式。具體是作業系統將應用程式提供的緩衝區的資料複製到核心模式下的位址中。這種方法的有點是,比較簡單地解決了將使用者位址傳入驅動的問題,缺點是需要在使用者模式和核心模式之間複製資料,影響了執行效率,因此,在少量 的記憶體操作時,可以考慮採取這個方法。

以緩衝區方式寫裝置時,作業系統將writefile提供的使用者模式的緩衝區複製到核心模式位址下。這個位址由writefile建立的irp的associatedirp.systembuffer子域記錄。

以「緩衝區」方式讀裝置時,作業系統會分配一段核心模式下的記憶體。這段記憶體大小等於readfile或者writefile指定的位元組數,並且readfile或者writefile建立的irp的associatedirp.systembuffer子域會記錄這段記憶體位址。當irp請求結束時,這段記憶體位址會被複製到readfile提供的緩衝區中。在派遣函式中,可以通過io_stack_location中的parameters.read.length子域知道readfile請求多少位元組。通過io_stack_location中的parameters.write.length子域知道writefile請求了多少位元組。

然後,writefile和readfile指定對裝置操作多少位元組,並不意味著操作了這麼多的位元組。在派遣函式中,應設定irp的子域iostatus.information。這個子域記錄裝置實際操作了多少位元組。

裝置讀寫方式 緩衝區方式

1.裝置物件一共有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別對應do buffered io,do direct io,0 在buffered方式中,i o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統緩衝...

WDM ioctl 緩衝區讀寫

1 method buffered buffered io中io管理器會分配一塊堆記憶體然後把使用者態緩衝區資料copy進來再傳給驅動程式,而輸出時io管理器會把堆記憶體中的資料copy回使用者態緩衝區。ulong inputsize i.ioctlinputbuffersize pvoid inp...

驅動開發之 裝置讀寫方式 緩衝區方式

1.裝置物件一共有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別對應do buffered io,do direct io,0 在buffered方式中,i o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統緩衝...