Aracılığıyla paylaş


Common-Buffer Sistem DMA'sı için Bağdaştırıcı Kanalı Ayırma

Sürücü, DispatchRead veya DispatchWrite yordamından (veya DMA aktarımını işleyen başka bir dağıtım yordamından) sonra AllocateAdapterChannel çağırır, IRP parametrelerinin geçerliliğini denetlemiştir ve daha fazla işlem için bir veya daha fazla IRP'yi başka bir sürücü yordamına kuyruğa almış ve büyük olasılıkla aktarılacak verilerle ortak arabelleği yüklemiştir, uygunsa.

AllocateAdapterChannel çağıran sürücü yordamı IRQL = DISPATCH_LEVEL'de yürütülmelidir. AllocateAdapterChannel yordamı, sürücünün AdapterControl yordamını kuyruğa alır. Bu yordam, sistem DMA denetleyicisi bu sürücüye atandıktan ve sürücünün DMA işlemi için ayrılmış eşleme yazmaçları kümesinden sonra çalışır.

Girişte, AdapterControl rutine, AllocateAdapterChannelçağrısında geçirilen cihaz nesnesi ve bağlam için göstergeler, ve ayrıca ayrılan haritalama kayıtları için bir tanıtıcı tutamağı verilir. AdapterControl yordamına, sürücüde > yordamı varsa DeviceObject-CurrentIrp bir işaretçi de verilir. Sürücü bir StartIo rutinine sahip olmak yerine kendi IRP'leri kuyruklama işlemini yönetiyorsa, sürücünün AllocateAdapterChannelçağırdığı zaman geçtiği bağlam verilerine geçerli IRP'yi gösteren bir işaretçi eklemesi gerekmektedir.

AdapterControl yordamı genellikle aşağıdakileri yapar:

  1. Sürücünün DMA işlemleriyle ilgili koruduğu bağlamı kaydeder veya başlatır. Bağlam, sürücünün MapTransfer ve FlushAdapterBuffers işlevlerine ve muhtemelen IRP'deki G/Ç yığını konumundan istenen aktarımın Uzunluğu iletmesi gereken MapRegisterBase tanıtıcısını içerebilir.

  2. Aktarım işlemini başlatmak için alt cihazı ayarlar.

  3. KeepObject değerini döndürür.

Ek bilgi için, AdapterControl Yordamları Yazmabölümüne bakınız.

Sistem DMA denetleyicisinin otomatik başlatma modunu kullanan sürücüler için AdapterControl yordamı KeepObject değerini döndürmelidir. Bu, sürücünün sistem DMA denetleyicisinin "sahipliğini" ve ayrılan harita yazmaçlarını tüm verileri aktarıncaya kadar korumasını sağlar.

AdapterControl yordamı, alt cihazın DMA işlemini gerçekleştirmesini bekleyemediğinden, AdapterControl yordamı en azından aşağıdakileri yapmalıdır:

  1. Bağlam bilgilerini, özellikle de MapRegisterBase tutamacını sürücünün cihaz uzantısına, denetleyici uzantısına veya sürücü tarafından erişilebilen diğer yerleşik depolama alanına (sürücü tarafından ayrılan sayfalanmamış havuz) kaydedin.

  2. KeepObject'i döndür.

Başka bir sürücü rutininden (muhtemelen DpcForIsr rutininden) DMA aktarım işlemi tamamlandığında FlushAdapterBuffers ve FreeAdapterChannel çağrılması gerekir.