Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Driver yang melayani perangkat interaktif atau lambat, atau yang biasanya mentransfer data dalam jumlah yang relatif kecil pada satu waktu, harus menggunakan metode transfer I/O yang di-buffer . Menggunakan I/O buffer untuk transfer interaktif kecil meningkatkan penggunaan memori fisik secara keseluruhan, karena manajer memori tidak perlu mengunci halaman fisik penuh untuk setiap transfer, seperti halnya untuk driver yang meminta I/O langsung. Umumnya, video, keyboard, mouse, serial, dan driver paralel meminta I/O yang di-buffer.
Manajer I/O menentukan bahwa operasi I/O menggunakan I/O buffer sebagai berikut:
Untuk permintaan IRP_MJ_READ dan IRP_MJ_WRITE , DO_BUFFERED_IO diatur dalam anggota Bendera struktur DEVICE_OBJECT . Untuk informasi selengkapnya, lihat Menginisialisasi Objek Perangkat.
Untuk permintaan IRP_MJ_DEVICE_CONTROL dan IRP_MJ_INTERNAL_DEVICE_CONTROL , nilai kode IOCTL berisi METHOD_BUFFERED sebagai nilai TransferType dalam nilai IOCTL. Untuk informasi selengkapnya, lihat Menentukan Kode Kontrol I/O.
Gambar berikut menggambarkan bagaimana manajer I/O menyiapkan permintaan IRP_MJ_READ untuk operasi transfer yang menggunakan I/O yang di-buffer.
Gambar menunjukkan gambaran umum tentang bagaimana driver dapat menggunakan penunjuk SystemBuffer di IRP untuk mentransfer data untuk permintaan baca, ketika driver memiliki ORed Bendera objek perangkat dengan DO_BUFFERED_IO:
Beberapa rentang alamat virtual ruang pengguna mewakili buffer utas saat ini, dan konten buffer tersebut mungkin disimpan di suatu tempat dalam berbagai alamat fisik berbasis halaman (bayangan gelap pada gambar sebelumnya).
Manajer I/O melayani permintaan baca utas saat ini, yang alurnya melewati berbagai alamat virtual ruang pengguna yang mewakili buffer.
Manajer I/O memeriksa buffer yang disediakan pengguna untuk aksesibilitas dan memanggil ExAllocatePoolWithTag untuk membuat buffer ruang sistem yang tidak dipagasi (SystemBuffer) ukuran buffer yang disediakan pengguna.
Manajer I/O menyediakan akses ke SystemBuffer yang baru dialokasikan di IRP yang dikirimnya ke driver.
Jika gambar menunjukkan permintaan tulis, manajer I/O akan menyalin data dari buffer pengguna ke buffer sistem sebelum mengirim IRP ke driver.
Untuk permintaan baca yang ditunjukkan pada gambar sebelumnya, driver membaca data dari perangkat ke dalam buffer ruang sistem. Memori untuk buffer ini tidak bertumpuk dan driver dapat mengakses buffer dengan aman tanpa terlebih dahulu menguncinya. Ketika permintaan baca telah terpenuhi, driver memanggil IoCompleteRequest dengan IRP.
Ketika utas asli kembali aktif, manajer I/O menyalin data baca-masuk dari buffer sistem ke dalam buffer pengguna. Ini juga memanggil ExFreePool untuk merilis buffer sistem.
Setelah manajer I/O membuat buffer ruang sistem untuk driver, utas mode pengguna yang meminta dapat ditukar dan memori fisiknya dapat digunakan kembali oleh utas lain, mungkin oleh utas milik proses lain. Namun, rentang alamat virtual ruang sistem yang disediakan dalam IRP tetap valid sampai driver memanggil IoCompleteRequest dengan IRP.
Driver yang mentransfer data dalam jumlah besar pada satu waktu, khususnya, driver yang melakukan transfer perkalian, tidak boleh mencoba menggunakan I/O buffer. Saat sistem berjalan, kumpulan yang tidak disebarkan dapat menjadi terfragmentasi sehingga manajer I/O tidak dapat mengalokasikan buffer ruang sistem yang besar dan berdekatan untuk dikirim dalam RUN untuk driver seperti itu.
Biasanya, driver menggunakan I/O buffer untuk beberapa jenis IRP, seperti permintaan IRP_MJ_DEVICE_CONTROL , bahkan jika ia juga menggunakan I/O langsung. Driver yang menggunakan I/O langsung biasanya hanya melakukannya untuk permintaan IRP_MJ_READ dan IRP_MJ_WRITE , dan mungkin permintaan IRP_MJ_INTERNAL_DEVICE_CONTROL yang ditentukan driver yang memerlukan transfer data besar.
Setiap permintaan IRP_MJ_DEVICE_CONTROL dan IRP_MJ_INTERNAL_DEVICE_CONTROL menyertakan kode kontrol I/O. Jika kode kontrol I/O menunjukkan bahwa IRP harus didukung dengan menggunakan I/O yang di-buffer, manajer I/O menggunakan buffer sistem tunggal untuk mewakili buffer input dan output aplikasi pengguna. Driver yang mendukung kode kontrol I/O tersebut harus membaca data input (jika ada) dari buffer lalu menyediakan data output (jika ada) dengan menimpa data input. Untuk informasi selengkapnya, lihat Menentukan Kode Kontrol I/O.