Aracılığıyla paylaş


Common-Buffer DMA için Sistem DMA Denetleyicisini Ayarlama

AllocateAdapterChannel denetimi bir sürücünün AdapterControl yordamına aktardığında, sürücü sistem DMA denetleyicisine ve bir dizi harita yazmaçlarına "sahip olur". Ardından, sürücü aktarım işlemi için cihazını ayarlamadan önce sürücü tarafından ayrılan ortak arabelleği kullanacak şekilde sistem DMA denetleyicisini ayarlamak için MapTransfer çağrısı yapmalıdır.

Sürücü MapTransfer'a aşağıdaki parametreleri sağlar:

  • IoGetDmaAdapter tarafından döndürülen bağdaştırıcı nesne işaretçisi

  • Sürücü tarafından ayrılan ortak arabelleği açıklayan MDL işaretçisi

  • AllocateAdapterChannel tarafından sürücünün AdapterControl rutinine geçirilen MapRegisterBase tanıtıcısı

  • Sürücü tarafından ayrılan ortak arabelleğin bayt cinsinden boyutunu gösteren bir değişken (Uzunluk) işaretçisi

  • Aktarım işleminin yönünü gösteren boole değeri (sistem belleğinden cihaza istenen aktarım için TRUE)

MapTransfer , sistem DMA'sını kullanan sürücülerin yoksayması gereken mantıksal bir adres döndürür. MapTransfer denetimi döndürdüğünde, sürücü DMA işlemi için cihazını ayarlamalıdır. Sürücü MapTransfer'ı yalnızca bir kez çağırır, ancak istenen aktarım yapılana kadar ortak arabelleği ile kilitli kullanıcı arabelleği arasında veri kopyalamaya devam eder.

Sürücü, ortak arabellekte şu anda aktarılacak bayt sayısını belirlemek için ReadDmaCounter'ı çağırabilir; Sürücü daha sonra ortak arabelleği kullanıcı verileriyle doldurmaya devam edebilir veya DMA işleminin yönüne bağlı olarak ortak arabelleğindeki verileri kullanıcı arabelleğine kopyalayabilir.

Aktarım tamamlandığında veya sürücünün IRP için hata durumu döndürmesi gerekiyorsa, sürücü sistem DMA denetleyicisinde önbelleğe alınan tüm verilerin sistem belleğine okunduğundan veya cihaza yazıldığından emin olmak için FlushAdapterBuffers'ı çağırır. Ardından sürücü freeAdapterChannel'i çağırarak sistem DMA denetleyicisini herhangi bir sürücü (kendisi dahil) tarafından kullanılmak üzere serbest bırakmalıdır.