Bagikan melalui


Menggunakan Buffer Memori

Driver biasanya menggunakan buffer memori untuk meneruskan data ke dan dari kerangka kerja dan driver lain atau untuk menyimpan informasi secara lokal. Topik ini menjelaskan objek memori kerangka kerja, daftar lookaside, MDL, dan buffer lokal.

Menggunakan Objek Memori Kerangka Kerja

Kerangka kerja menggunakan objek memori untuk menjelaskan buffer memori yang diterima driver dan diteruskan ke kerangka kerja. Setiap objek memori kerangka kerja mewakili satu buffer.

Untuk membuat objek memori, driver Anda memanggil salah satu metode objek berikut:

Untuk mendapatkan objek memori yang mewakili buffer permintaan I/O yang diterima, driver Anda memanggil WdfRequestRetrieveInputMemory dan WdfRequestRetrieveOutputMemory. Untuk informasi selengkapnya tentang mengambil buffer permintaan I/O, lihat Mengakses Buffer Data di Driver Framework-Based.

Untuk mendapatkan alamat dan ukuran buffer objek memori, driver Anda memanggil WdfMemoryGetBuffer.

Untuk memindahkan data ke dalam atau ke luar buffer objek memori, driver Anda memanggil WdfMemoryCopyFromBuffer atau WdfMemoryCopyToBuffer. Metode objek ini memeriksa ukuran sumber dan tujuan dan mencegah kesalahan overrun buffer.

Jika driver Anda membuat objek memori dengan memanggil WdfMemoryCreatePreallocated, kemudian dapat menetapkan buffer yang berbeda ke objek memori dengan memanggil WdfMemoryAssignBuffer.

Ketika driver mengirim permintaan I/O ke target I/O, biasanya meneruskan buffer input atau output ke metode objek target I/O kerangka kerja. Driver menentukan buffer dengan melewati struktur WDF_MEMORY_DESCRIPTOR yang menjelaskan buffer atau dengan melewati handel objek memori. (Metode objek target I/O yang mengirim permintaan I/O secara sinkron memerlukan struktur WDF_MEMORY_DESCRIPTOR , dan metode yang mengirim permintaan I/O secara asinkron memerlukan handel objek memori.)

Untuk informasi tentang kapan buffer memori valid, lihat Siklus Hidup Buffer Memori.

Menggunakan Daftar Lookaside

Jika driver Anda akan memerlukan banyak buffer dengan ukuran yang kira-kira sama, driver harus mengalokasikannya dari daftar lookaside. Driver membuat daftar lookaside dengan memanggil WdfLookasideListCreate. Selanjutnya, driver dapat memperoleh buffer dari daftar lookaside dengan memanggil WdfMemoryCreateFromLookaside.

Setiap kali driver memanggil WdfMemoryCreateFromLookaside, kerangka kerja membuat objek memori, mendapatkan buffer dari daftar lookaside, dan menetapkan buffer ke objek. Ketika driver telah selesai menggunakan salah satu objek memori ini, ia memanggil WdfObjectDelete, yang menghapus objek memori dan mengembalikan ruang buffer ke daftar lookaside.

Sistem operasi mengelola sumber daya memori yang ditetapkan ke daftar lookaside. Jika driver meminta buffer dari daftar lookaside ketika tidak ada yang tersedia, seperti pertama kali driver memanggil WdfMemoryCreateFromLookaside, sistem mengalokasikan buffer dan menetapkannya ke daftar. Ketika driver memanggil WdfObjectDelete (dan ruang buffer dikembalikan ke daftar lookaside), sistem menyimpan buffer yang sekarang tidak ditetapkan dalam daftar sampai driver membutuhkannya lagi. Sistem meningkatkan ukuran daftar seperlunya; misalnya, driver yang lebih sering meminta buffer menerima daftar lookaside yang lebih besar. Di sisi lain, sistem dapat mengurangi jumlah buffer dalam daftar jika driver tidak menggunakan semuanya.

Menggunakan MDL

Beberapa driver menggunakan daftar deskriptor memori (MDL) untuk menjelaskan buffer. Misalnya, driver untuk perangkat akses memori langsung (DMA) harus meneruskan MDL ke metode WdfDmaTransactionInitialize , jika memanggil metode tersebut.

Driver yang menggunakan MDL dapat memperoleh MDL yang mewakili buffer permintaan I/O yang diterima dengan memanggil WdfRequestRetrieveInputWdmMdl dan WdfRequestRetrieveOutputWdmMdl.

Sebagian besar driver berbasis kerangka kerja tidak menggunakan MDL.

Mengalokasikan Buffer Lokal

Driver yang memerlukan ruang buffer internal lokal yang tidak akan diteruskan ke kerangka kerja tidak harus membuat objek memori untuk mewakili buffer. Driver dapat memanggil ExAllocatePoolWithTag untuk mengalokasikan buffer internal. Ketika driver telah selesai menggunakan buffer, driver harus memanggil ExFreePoolWithTag.

Namun, driver juga dapat menggunakan objek memori untuk buffer lokal. Keuntungan menggunakan buffer memori, alih-alih memanggil ExAllocatePoolWithTag, adalah bahwa kerangka kerja secara otomatis menghapus objek memori dan buffer mereka ketika setiap objek induk objek dihapus.

Penting

ExAllocatePool DDIs yang dibahas dalam topik ini tidak digunakan lagi dalam Windows 10, versi 2004 dan telah digantikan oleh ExAllocatePool2 dan ExAllocatePool3. Untuk informasi selengkapnya, lihat Memperbarui panggilan ExAllocatePool yang tidak digunakan lagi ke ExAllocatePool2 dan ExAllocatePool3.

Meratakan Buffer

Driver Anda dapat menggunakan fungsi WDF_ALIGN_SIZE_UP atau WDF_ALIGN_SIZE_DOWN untuk menghitung ukuran buffer yang selaras dengan offset perataan tertentu. Perhitungan ini berguna jika driver Anda harus mengalokasikan beberapa buffer yang berdekatan, jika setiap buffer harus dimulai pada batas penyelarasan alamat.