1 method_buffered
buffered io中io管理器會分配一塊堆記憶體然後把使用者態緩衝區資料copy進來再傳給驅動程式,而輸出時io管理器會把堆記憶體中的資料copy回使用者態緩衝區。
ulong inputsize = i.ioctlinputbuffersize();
pvoid inputbuffer = i.ioctlbuffer();
ulong outputsize = i.ioctloutputbuffersize();
pvoid outputbuffer = i.ioctlbuffer();
一定要牢記:驅動讀寫的是同一塊記憶體,在寫操作前務必已經讀取了所需資料。
2 method_in_direct/method_out_direct
direct io方式中io管理器分將使用者態緩衝區對映到核心態(位址不一樣,但其實是一塊記憶體),並鎖定記憶體不要分頁機制將記憶體交換到外存中.然後io管理器將緩衝 區在核心態的的位址傳給驅動程式。
ulong inputsize = i.ioctlinputbuffersize();
puchar inputbuffer = (puchar) i.ioctlbuffer();
kmemory mem(i.mdl());
ulong outputsize = i.writesize();
puchar outputbuffer = (puchar) mem.maptosystemspace();
3 method_neither
在neither io,io管理器直接把使用者態的緩衝區位址和大小傳給驅動,不做任何處理。
ulong inputsize = i.ioctlinputbuffersize();
pvoid inputbuffer = i.ioctltype3inputbuffer();
ulong outputsize = i.ioctloutputbuffersize();
pvoid outputbuffer = i.userbuffer();
method
input buffer parameter
output buffer parameter
method_buffered
kirp::ioctlbuffer
kirp::ioctlbuffer
method_in_direct
kirp::ioctlbuffer
kirp::mdl
method_out_direct
kirp::ioctlbuffer
kirp::mdl
method_neither
kirp::ioctltype3inputbuffer
kirp::userbuffer
緩衝區方式讀寫操作
驅動程式建立裝置物件一共有三種讀寫方式,分別是緩衝區讀寫 直接方式讀寫和其他方式讀寫。這三種方式對應的裝置物件的flags子域分別是do buffered io do direct io和0。為什麼要設定緩衝區讀寫方式?讀寫操作一般由writefile或readfile函式引起,以writefile...
裝置讀寫方式 緩衝區方式
1.裝置物件一共有三種讀寫方式 緩衝區方式讀寫 buffered方式 直接方式讀寫 direct方式 neither方式。這三種方式的flags分別對應do buffered io,do direct io,0 在buffered方式中,i o管理器先建立乙個與使用者模式資料緩衝區大小相等的系統緩衝...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...