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.
Bus-Master DMAkullanma bölümünde açıklandığı gibi, veri yolu denetleyici DMA cihazları için bazı sürücüler yalnızca ortak arabellek DMA kullanır ve bazıları paket tabanlı DMA ile birlikte ortak arabellek DMA kullanır.
Paylaşımlı bellek DMA’yı ekonomik şekilde kullanın. Ortak bir arabellek ayarlamak, istenen arabelleğin boyutuna bağlı olarak, bus-master bağdaştırıcısını temsil eden bağdaştırıcı nesnesiyle ilişkili eşleme kaydedicilerinin bazılarını (veya tümünü) bağlayabilir.
PAGE_SIZE öbekleri veya tek bir ayırma kullanarak ortak arabellek alanlarını ekonomik olarak ayarlamak, paket tabanlı DMA işlemleri için daha fazla harita yazmaçları sağlar. Ayrıca, diğer amaçlar için daha fazla sistem belleği bırakır, bu da daha iyi bir genel sürücü ve sistem performansı sağlar.
Bus-master DMA için ortak bir arabellek ayarlamak amacıyla, bir bus-master DMA cihaz sürücüsü, IoGetDmaAdaptertarafından döndürülen bağdaştırıcı nesne işaretçisini kullanarak AllocateCommonBuffer çağrısı yapmalıdır. Genellikle, bir sürücü DispatchPnP yordamından IRP_MN_START_DEVICE istekleri için çağrıyı yapar. Bir sürücü ortak bir arabelleği yalnızca sürücü yüklü kalırken DMA işlemleri için arabelleği art arda kullanacaksa ayırmalıdır. Aşağıdaki diyagramda, AllocateCommonBufferçağrısı gösterilmektedir.
Arabelleğin istenen boyutu, önceki diyagramda LengthForBuffer olarak gösterildiği gibi, ortak arabellek için sanal ile mantıksal arasında bir eşleşme sağlamak üzere kaç adet eşleme kaydı kullanılması gerektiğini belirler. Gereken en fazla sayfa sayısını belirlemek için BYTES_TO_PAGES makroyu kullanın (BYTES_TO_PAGES (LengthForBuffer)). Bu değer, IoGetDmaAdaptertarafından döndürülen numberOfMapRegisters değerinden büyük olamaz.
Buna ek olarak, çağıranın aşağıdakileri sağlaması gerekir:
Önbelleğe almanın etkinleştirilip etkinleştirilmeydiğini gösteren Boole değeri
Not Bu değer dikkate alınmaz. İşletim sistemi, ayrılacak ortak arabellekte önbelleğe alınmış belleğin etkinleştirilip etkinleştirilmeyeceğini belirler. Bu karar, işlemci mimarisi ve cihaz veri yoluna dayanmaktadır.
x86 tabanlı, x64 tabanlı ve Itanium tabanlı işlemcilere sahip bilgisayarlarda önbelleğe alınmış bellek etkinleştirilir.
Arm veya Arm 64 tabanlı işlemcileri olan bilgisayarlarda, işletim sistemi tüm cihazlar için önbelleğe alınmış belleği otomatik olarak etkinleştirmez. Sistem, cihazın önbellekle uyumlu olup olmadığını belirlemek için her cihaz için ACPI_CCA yöntemine dayanır.
AllocateCommonBuffer döndürülürken, arabellek (önceki diyagramda BufferLogicalAddress) için cihazın erişebileceği temel Mantıksal Adres değerini içerecek sürücü tanımlı bir değişkenin işaretçisi olacaktır.
Çağrı başarılı olursa, AllocateCommonBuffer arabellek için sürücü tarafından erişilebilir bir temel sanal adresi (önceki diyagramda BufferVirtualAddress) döndürür. Sürücünün bu adresi cihaz uzantısına, denetleyici uzantısına veya sürücünün erişebileceği başka bir yerleşik depolama alanına (sürücü tarafından ayrılan sayfasız havuz) kaydetmesi gerekir.
AllocateCommonBuffer, arabelleğe bellek ayıramıyorsa NULL döndürür. Döndürülen temel sanal adres NULLise, sürücünün sistemin yalnızca paket tabanlı DMA desteğini kullanması veya sürücünün IRP_MN_START_DEVICE isteğinde başarısız olarak STATUS_INSUFFICIENT_RESOURCES döndürmesi gerekir.
Aksi takdirde, sürücü DMA aktarımları için sürücü ve bağdaştırıcı tarafından erişilebilir depolama alanı olarak ayrılan ortak arabelleği kullanabilir.
PnP yöneticisi cihazı durduran veya kaldıran bir IRP gönderdiğinde, sürücünün FreeCommonBuffer çağırarak ayırdığı her ortak arabelleği serbest bırakması gerekir.