Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sistem DMA denetleyicisinin otomatik başlatma modunu kullanan bir sürücü, DMA aktarımlarının gerçekleştirilebileceği veya gerçekleştirilebileceği bir arabellek için bellek ayırmalıdır. Sürücü, genellikle bir IRP_MN_START_DEVICE isteği işleyen DispatchPnP yordamından bu arabelleği almak için AllocateCommonBuffer'ı çağırır. Aşağıdaki şekilde, bir sürücünün arabelleği nasıl ayırıp sanal adres aralığını sistem fiziksel belleğine nasıl eşleyeği gösterilmektedir.
Önceki şekilde gösterildiği gibi, bir sürücü sistem DMA'sı için arabellek ayırmak için aşağıdaki adımları izler:
Sürücü, IoGetDmaAdapter tarafından döndürülen bağdaştırıcı nesnesine işaretçiyle birlikte, arabelleği için istenen bayt cinsinden uzunluğu AllocateCommonBuffer'a geçirir. Belleği ekonomik olarak kullanmak için arabellek için giriş Uzunluğu değeri PAGE_SIZE küçük veya buna eşit olmalıdır ya da PAGE_SIZE tam sayı katı olmalıdır.
AllocateCommonBuffer bir NULL işaretçi döndürürse, sürücü önceden talep ettiği tüm sistem kaynaklarını serbest yapmalı ve IRP_MN_START_DEVICE isteğine yanıt olarak STATUS_INSUFFICIENT_RESOURCES döndürmelidir.
Aksi takdirde , AllocateCommonBuffer sistem sanal adres alanında istenen bellek miktarını ayırır ve bu arabelleğe iki farklı tür işaretçi döndürür:
Sürücünün depolama sağlaması ancak daha sonra yoksayması gereken arabelleğin LogicalAddress'i (önceki şekilde BufferLogicalAddress)
Sürücünün, DMA işlemleri için arabelleğini açıklayan bir MDL oluşturabilmesi amacıyla depolaması gereken arabelleğin sanal adresi (önceki şekilde BufferVirtualAddress)
Sürücü bu işaretçileri cihaz uzantısında veya sürücü tarafından ayrılan başka bir yerleşik bellekte depolamalıdır.
Sürücü, bir arabellek için MDL ayırmak amacıyla IoAllocateMdl işlevini çağırır. Sürücü, AllocateCommonBuffer tarafından döndürülen arabelleğin VirtualAddress değerini ve MDL ayırmak için arabelleğin Uzunluğunu aktarır.
Sürücü, sanal adres aralığını kendine ait tampon belleğinin sistem fiziksel belleğiyle eşlemek için IoAllocateMdl tarafından döndürülen işaretçiyle MmBuildMdlForNonPagedPool fonksiyonunu çağırır.
Ortak bir arabellek ayırdıktan ve sanal adres aralığını eşledikten sonra, bir alt cihazın sürücüsü DMA aktarımı isteyen bir IRP'yi işlemeye başlayabilir. Bunu yapmak için sürücü aşağıdaki genel destek yordamlarını çağırır:
Sürücü yazarının takdirine bağlı olarak, kilitli bir kullanıcı arabelleğindeki verileri cihaza iletim için sürücü tarafından ayrılan ortak arabelleğe kopyalamak amacıyla RtlMoveMemory kullanılır.
Sürücü cihazını DMA için programlamaya hazır olduğunda ve sistem DMA denetleyicisine ihtiyaç duyduğunda AllocateAdapterChannel
Sürücü tarafından ayrılan ortak arabelleği tanımlayan MDL ile MapTransfer kullanarak aktarım işlemi için sistem DMA denetleyicisinde ayarlamaları yapmak
Sürücünün, sistem DMA denetleyicisini ortak arabelleği kullanacak şekilde ayarlamak için MapTransfer'ı yalnızca bir kez çağırdığını unutmayın. Aktarım sırasında sürücü, aktarılacak bayt sayısını belirlemek için ReadDmaCounter'ı çağırabilir ve gerekirse kullanıcı arabelleğine veya kullanıcı arabelleğinden daha fazla veri kopyalamak için RtlMoveMemory'yi çağırabilir.
FlushAdapterBuffers, sürücü üst cihazdan alt cihazla olan DMA aktarımını tamamladığında
FreeAdapterChannel istenen tüm veriler aktarıldığında veya sürücü bir cihaz G/Ç hatası nedeniyle IRP'yi başarısız yapması gerektiğinde
IoGetDmaAdapter tarafından döndürülen bağdaştırıcı nesne işaretçisi, RtlMoveMemory dışında bu destek yordamlarının her biri için gerekli bir parametredir.
Tek tek sürücüler, her sürücünün cihazına hizmet vermek için nasıl uygulandığına bağlı olarak bu destek yordamları dizisini farklı noktalarda çağırır. Örneğin, bir sürücünün StartIo yordamı, AllocateAdapterChannelçağrısı yapabilir, başka bir sürücü bu çağrıyı sürücü tarafından oluşturulan bir birbirine bağlı kuyruktan IRP'leri kaldıran bir yordamdan yapabilir ve alt DMA cihazı veri aktarımına hazır olduğunu gösterdiğinde başka bir sürücü bu çağrıyı yapabilir.