Bagikan melalui


Menggunakan Common-Buffer Bus-Master DMA

Seperti yang dijelaskan dalam Menggunakan Bus-Master DMA, beberapa driver untuk perangkat DMA master bus menggunakan DMA common-buffer secara eksklusif, dan beberapa menggunakan DMA buffer umum dalam kombinasi dengan DMA berbasis paket.

Gunakan DMA common-buffer secara ekonomis. Menyiapkan buffer umum dapat mengikat beberapa (atau semua, tergantung pada ukuran buffer yang diminta) dari daftar peta yang terkait dengan objek adaptor yang mewakili adaptor bus-master.

Menyiapkan area buffer umum secara ekonomis, seperti dengan menggunakan potongan PAGE_SIZE atau alokasi tunggal, membuat lebih banyak daftar peta tersedia untuk operasi DMA berbasis paket. Ini juga meninggalkan lebih banyak memori sistem gratis untuk tujuan lain, yang menghasilkan kinerja driver dan sistem secara keseluruhan yang lebih baik.

Untuk menyiapkan buffer umum untuk DMA bus-master, driver perangkat DMA master bus harus memanggil AllocateCommonBuffer dengan penunjuk objek adaptor yang dikembalikan oleh IoGetDmaAdapter. Biasanya, driver melakukan panggilan ini dari rutinitas DispatchPnP-nya untuk permintaan IRP_MN_START_DEVICE . Pengemudi harus mengalokasikan buffer umum hanya jika akan menggunakan buffer tersebut berulang kali untuk operasi DMA-nya selama driver tetap aktif. Diagram berikut mengilustrasikan panggilan tersebut ke AllocateCommonBuffer.

diagram yang mengilustrasikan alokasi buffer umum untuk bus-master dma.

Ukuran yang diminta untuk buffer, yang ditunjukkan dalam diagram sebelumnya sebagai LengthForBuffer, menentukan berapa banyak register peta yang harus digunakan untuk menyediakan pemetaan virtual-ke-logis untuk buffer umum. Gunakan makro BYTES_TO_PAGES untuk menentukan jumlah maksimum halaman yang diperlukan (BYTES_TO_PAGES (LengthForBuffer)). Nilai ini tidak boleh lebih besar dari NumberOfMapRegisters yang dikembalikan oleh IoGetDmaAdapter.

Selain itu, penelepon harus menyediakan hal berikut:

  • Nilai Boolean yang menunjukkan apakah caching harus diaktifkan

    Nota Nilai ini diabaikan. Sistem operasi menentukan apakah akan mengaktifkan memori cache di buffer umum yang akan dialokasikan. Keputusan itu didasarkan pada arsitektur prosesor dan bus perangkat.

    Pada komputer dengan prosesor berbasis x86, berbasis x64, dan berbasis Itanium, memori cache diaktifkan.

    Pada komputer dengan prosesor berbasis Arm atau Arm 64, sistem operasi tidak secara otomatis mengaktifkan memori cache untuk semua perangkat. Sistem bergantung pada metode ACPI_CCA untuk setiap perangkat untuk menentukan apakah perangkat berkoheren cache.

  • Penunjuk ke variabel yang ditentukan driver yang akan berisi Alamat Logis dasar yang dapat diakses perangkat untuk buffer (BufferLogicalAddress dalam diagram sebelumnya) saat dikembalikan dari AllocateCommonBuffer

Jika panggilan berhasil, AllocateCommonBuffer mengembalikan alamat virtual dasar buffer yang dapat diakses oleh driver (BufferVirtualAddress dalam diagram sebelumnya), yang harus disimpan oleh driver dalam ekstensi perangkatnya, ekstensi pengontrol, atau area penyimpanan residen lain yang dapat diakses oleh driver (kumpulan nonpaged yang telah dialokasikan oleh driver).

AllocateCommonBuffer mengembalikan NULL jika tidak dapat mengalokasikan memori untuk buffer. Jika alamat virtual dasar yang dikembalikan adalah NULL, driver harus menggunakan dukungan DMA berbasis paket sistem secara eksklusif atau driver harus membatalkan permintaan IRP_MN_START_DEVICE: mengembalikan STATUS_INSUFFICIENT_RESOURCES.

Jika tidak, driver dapat menggunakan buffer umum yang dialokasikan sebagai area penyimpanan yang dapat diakses driver dan adaptor untuk transfer DMA.

Ketika manajer PnP mengirim IRP yang menghentikan atau menghapus perangkat, driver harus memanggil FreeCommonBuffer untuk merilis setiap buffer umum yang telah dialokasikan.