Aracılığıyla paylaş


DMA İşlemleri Sırasında Önbelleğe Alınan Verileri Temizleme

Bazı platformlarda, işlemci ve sistem DMA denetleyicisi (veya veri yolu ana DMA bağdaştırıcıları) önbellek tutarlılığı anomalileri sergiler. Aşağıdaki yönergeler, önbellek tutarlılığını otomatik olarak zorlamak için donanım içermeyen mimariler de dahil olmak üzere desteklenen tüm işlemci mimarilerinde tutarlı önbellek durumlarını korumak için DMA işlemleri arabiriminin 1 veya 2. sürümünü (bkz. DMA_OPERATIONS) kullanan sürücüleri etkinleştirir.

Not Bu konudaki yönergeler yalnızca DMA işlemleri arabiriminin 1. ve 2. sürümlerini kullanan sürücüler için geçerlidir. Bu arabirimin 3. sürümünü kullanan sürücülerin farklı yönergelere uyması gerekir. Daha fazla bilgi için bkz. DMA İşlemleri ArabirimiSürüm 3.

DMA işlemleri sırasında veri bütünlüğünü korumak için en düşük düzey sürücülerin bu yönergeleri izlemesi

  1. İşlemcide önbelleğe alınabilecek verilerle bellekteki veriler arasında tutarlılık sağlamak için aktarım işlemine başlamadan önce keFlushIoBuffers çağrısı yapın.

    Sürücü, CacheEnabled parametresi TRUEolarak ayarlanmış AllocateCommonBuffer çağırırsa, sürücünün aktarım işlemine arabelleğe doğru/arabellekten başlamadan önce KeFlushIoBuffers çağrısı yapması gerekir.

  2. Sistem DMA denetleyicisinin arabelleklerindeki kalan baytların belleğe veya alt cihaza yazılmış olduğundan emin olmak için her cihaz aktarım işleminin sonunda FlushAdapterBuffersçağırın.

    Ya da tüm verilerin sistem belleğine okunduğundan veya veri yolu yöneticisi DMA cihazına yazıldığından emin olmak için belirli bir IRP için her aktarım işleminin sonunda FlushAdapterBuffers çağırın.

Aşağıdaki şekilde, ana bilgisayar işlemcisi ve DMA denetleyicisi önbellek tutarlılığını otomatik olarak korumazsa DMA kullanarak bir okuma veya yazma işleminden önce işlemci önbelleğini temizlemenin neden önemli olduğu gösterilmektedir.

dma kullanarak okuma ve yazma işlemlerini gösteren diyagramı.

Zaman uyumsuz DMA okuma veya yazma işlemi, işlemci önbelleğinde değil bellekteki verilere erişir. Bu önbellek, okumadan hemen önce KeFlushIoBuffers çağrılarak temizlenmediği sürece, işlemci önbelleği daha sonra boşaltıldığında, DMA işlemiyle sistem belleğine aktarılan veriler, eski verilerle üzerine yazılabilir. yazmadan hemen önce KeFlushIoBuffers çağrılarak işlemci önbelleği temizlenmediği sürece, bu önbellekteki veriler bellekteki kopyadan daha up-totarih olabilir.

KeFlushIoBuffers, işlemcinin ve DMA denetleyicisinin önbellek tutarlılığını korumak için kullanılabilmesi durumunda hiçbir şey yapmaz, bu nedenle bu destek yordamına yapılan çağrıların böyle bir platformda neredeyse hiçbir yükü yoktur.

Önceki şekilde de gösterildiği gibi, bağdaştırıcı nesneleriyle temsil edilen DMA denetleyicilerinin iç arabellekleri olabilir. Böyle bir DMA denetleyicisi, önbelleğe alınmış verileri sabit boyutlu öbekler halinde (genellikle bir kerede sekiz veya daha fazla bayt) aktarabilir. Ayrıca, bu DMA denetleyicileri her aktarım işleminden önce iç arabellekleri dolana kadar bekleyebilir.

Değişken boyutlu öbeklerdeki veya sistem DMA denetleyicisinin önbellek boyutunun ayrılmaz bir katı olmayan sabit boyutlu öbeklerdeki verileri okumak için alt DMA kullanan en düşük düzeyli bir sürücü örneğini düşünün. Bu sürücü, her cihaz aktarımının sonunda FlushAdapterBuffers çağrısını yapmadığı sürece, talep ettiği her baytın gerçekten ne zaman aktarılacağından emin olamaz.

Veri yolu yöneticisi DMA cihazının sürücüsü, tüm verilerin sistem belleğine aktarılmış veya cihaza aktarılmış olduğundan emin olmak için bir IRP için her aktarım işleminin sonunda FlushAdapterBuffers çağırmalıdır.

FlushAdapterBuffers istenen temizleme işleminin başarılı olup olmadığını gösteren bir Boole değeri döndürür. Bir sürücü, DMA okuma veya yazma işlemi için IRP tamamlarken G/Ç durum bloğunun nasıl ayarlandığını belirlemek için bu değeri kullanabilir.