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.
DMA Doğrulaması, Doğrudan Bellek Erişimi (DMA) kullanımını izler. Windows geliştikçe DMA yordamları değiştiğinden, birçok sürücü DMA çağrılarını yanlış kullanır. Ayrıca, bazı sürücü yazarları HAL DMA alt sistemini tamamen atlamayı dener. Bu uygulama, sürücüye sinsi hata oluşumuna neden olabilir.
Sürücü Doğrulayıcı'nın DMA Doğrulama seçeneği yaygın DMA hatalarını yakalamaya çalışır. !dma çekirdek hata ayıklayıcısı uzantısıyla birlikte, bir sürücünün DMA'yı düzgün bir şekilde kullandığını doğrulamak için kullanılabilir.
Bu Sürücü Doğrulayıcı seçeneği , HAL Doğrulaması olarak da adlandırılır. Sürücü Doğrulayıcı tarafından oluşturulan bazı hata iletileri bu terimi kullanabilir.
Farklı DMA Türleri
DMA, bir donanım cihazının işlemciyi kullanmadan bellekten veya bellekten veri aktarabildiği bir mekanizmadır. Aktarımı ayarlamak için işlemci gereklidir ve cihaz aktarımı tamamladığında işlemciye sinyal gönderir. Bu sistemin avantajı, DMA aktarımı yapılırken işlemcinin diğer görevleri gerçekleştirebiliyor olmasıdır.
Windows 2000 ve sonraki sürümlerde kullanılan çeşitli DMA türleri vardır:
Ortak arabellek DMA'sı
Sistem hem donanım hem de yazılım tarafından erişilebilen tek bir arabellek ayırabildiğinde ortak arabellek DMA'sı gerçekleştirilir. Sürücü, arabelleğe erişimleri eşitlemekten sorumludur. Bellek önbelleğe alınmadığından, bu eşitleme sürücü için daha kolay olur. Ortak bir arabellek ayarladıktan sonra, hem sürücü hem de donanım HAL'den herhangi bir müdahale olmadan doğrudan arabellekteki adreslere yazabilir.
Paket DMA
Paket DMA'sı, donanım tarafından kullanılmak üzere eşlenmesi gereken tek bir mevcut arabellek olduğunda gerçekleştirilir. Paket DMA'sının kullanılmasına örnek olarak bir dosyanın bellekten diske aktarılması örnek olarak verilmiştir. Donanım dosyayı diske aktarabilsin diye dosyanın önce ortak arabelleğe aktarılması gerektiğinden, bu durumda ortak bellek DMA kullanımı israf olur. Bunun yerine, HAL'ye danışılır; sürücüye donanımın bellekteki gerçek arabelleği bulmasına yardımcı olması için gereken bilgileri verir. Bu işlem, farklı mimarilerde çalışmak için kullanılan yordamlara duyulan gereksinim nedeniyle karmaşıktır.
Scatter/gather DMA
Dağılım/toplama DMA, aynı anda birkaç paket DMA aktarımı ayarlayan bir kısayol yöntemidir. Örneğin bir paketi ağ üzerinden aktarıyorsanız, ağ yığınının her bölümü kendi üst bilgisini (TCP, IP, Ethernet vb.) ekler. Bu üst bilgilerin tümü bellekteki farklı yerlerden tahsis edilir. Bu durumda, dağılım/toplama DMA'sı, her bir üst bilgi ve veri kesimini donanım tarafından erişilebilmesi için eşlemek üzere HAL'ye toplu bir istek göndererek zaman tasarrufu sağlar. Bu yöntem, paketin her bir parçasında paket DMA yordamlarını çağırmak zorunda kalmak yerine her yordamı bir kez çağırır ve HAL'nin her birini ayrı ayrı eşlemekten sorumlu olmasını sağlar.
NotDağılım/toplama özelliği , cihazın dağılım/toplama yordamlarını kullanabileceği anlamına gelmez. Dağılım/toplama özelliği, cihaz açıklamasında, cihazın yalnızca belirli bir aralık yerine bellekteki herhangi bir alandan okuyup yazabildiğine işaret eden bir bayrağı ifade eder.
Sistem DMA'sı
Sistem DMA'sı, aktarımı doğrudan yapmak için anakart üzerindeki sistem DMA denetleyicisinin programlaması ile gerçekleştirilir. Sistem DMA'sı yalnızca ISA kartları tarafından kullanılabilir.
DMA Doğrulamanın Etkileri
DMA Doğrulaması etkin olduğunda, Sürücü Doğrulayıcı aşağıdakiler dahil olmak üzere DMA yordamlarının kötüye kullanımlarını algılar:
DMA bellek arabelleğinin taşması veya eksik çalıştırılması (bu hatalar donanım veya sürücü tarafından yapılabilir).
Ortak bir arabelleğin, bağdaştırıcı kanalının, harita kaydının veya dağılım/toplama listesinin iki kez serbest bırakılması.
Ortak arabellekleri, bağdaştırıcı kanallarını, harita yazmaçlarını, dağılım/toplama listelerini veya bağdaştırıcıları serbest bırakmamak, bellek sızıntısına neden olur.
Bir bağdaştırıcıya ait birden fazla bağdaştırıcı kanalının aynı anda bulunması.
Zaten serbest bırakılmış ve artık mevcut olmayan bir bağdaştırıcı kullanılmaya çalışılıyor.
Bağdaştırıcı arabelleği boşaltılmıyor.
Bir bağdaştırıcı için çok fazla aşılması gereken başvuru sayısı olması.
Sayfalama yapılabilir bir arabellek üzerinde DMA gerçekleştirme (DMA aktarımı başlamadan önce tüm arabelleklerin kilitlenmesi gerekir).
Mangled bayraklara sahip bir MDL üzerinde DMA gerçekleştirmek.
İlk MDL'den önce veya ilk MDL'nin sonundan sonra geçersiz bir sistem adresine başvurmak ya da MDL arabelleğinden daha uzun olan ve MDL içindeki bir sayfa sınırını geçen bir aktarım uzunluğu kullanmak.
Bir seferde çok fazla haritalama yazmacı ayırmak veya izin verilen en fazla sayıdan daha fazla haritalama yazmacı ayırmak.
Harita kaydedicilerinin çift eşlenmesi.
Bazıları hala eşlenmiş durumdayken harita yazmaçlarını boşaltmaya çalışılıyor.
Eşlenmemiş bir bellek yazmacını temizlemeye çalışmak.
Eşleme kaydı dosyasının sonunda çok fazla bayt temizlemeye çalışılıyor.
Uygun olmayan bir IRQL'de DMA yordamlarını çağırma.
HAL rutinine null değerli bir DMA_ADAPTER geçirme.
MDL'de yer almadığında bir adresi ve MDL'yi HAL rutinine geçirme.
Önceden eşlenmiş olan bir adres aralığını eşlemeye çalışılıyor.
Eşlenmemiş bir arabellek boşaltılmaya çalışılıyor.
Aktarım için sıfır uzunluklu bir arabelleği eşlemeye çalışılıyor.
Eski halGetAdapter işlevini çağırma (bunun yerine tüm sürücülerin IoGetDmaAdapter kullanması gerekir).
Sürücü Doğrulayıcı, sürücünün davranışını izler ve bu ihlallerden herhangi biri gerçekleşirse 0xE6 hata denetimi verir. Hata denetimi parametrelerinin listesi için Hata Denetimi 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) kısmına bakın.
DMA Doğrulaması Ne Zaman Yararlı Olur?
Doğrudan DMA kullanan tüm sürücüler (HAL DMA yordamlarını çağırarak) DMA Doğrulaması ile test edilmelidir.
Ayrıca, genellikle dolaylı olarak DMA kullandıklarından (DMA kullanan bağlantı noktası sürücülerini çağırarak) miniport sürücüleri de test edilmelidir.
DMA Doğrulaması, bir sürücünün veya donanım cihazının bir DMA arabelleğinin üzerine taşması durumunda tespit edebildiği için, bellek bozulmasını algılamanın etkili bir yolu olabilir.
DMA Doğrulamasını İzleme
Çekirdek hata ayıklayıcısı uzantısı !dma , zengin DMA bilgilerini görüntülemek için kullanılabilir. Her DMA bağdaştırıcısının davranışı hakkında çeşitli ayrıntıları görüntüleyebilir. Windows için Hata Ayıklama Araçları paketindeki belgelerde !dma uzantısının ayrıntılı bir örneğinin yanı sıra hata ayıklayıcı uzantıları hakkında genel bilgiler yer alır. Ayrıntılar için bkz. Windows Hata Ayıklama .
Bu Seçeneği Etkinleştir
Sürücü Doğrulayıcı Yöneticisi'ni veya Verifier.exe komut satırını kullanarak bir veya daha fazla sürücü için DMA Doğrulama özelliğini etkinleştirebilirsiniz. Ayrıntılar için bkz. Sürücü Doğrulayıcı Seçeneklerini Seçme.
Komut satırında
Komut satırında DMA Doğrulama seçeneği Bit 7 (0x80) ile gösterilir. DMA Doğrulamasını etkinleştirmek için 0x80 bayrak değerini kullanın veya bayrak değerine 0x80 ekleyin. Örneğin:
verifier /flags 0x80 /driver MyDriver.sysÖzellik bir sonraki önyüklemeden sonra etkin olacaktır.
Windows Vista ve windows'un sonraki sürümlerinde, komutuna /volatile parametresini ekleyerek bilgisayarı yeniden başlatmadan DMA Doğrulamasını etkinleştirebilir ve devre dışı bırakabilirsiniz. Örneğin:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysBu ayar hemen etkindir, ancak bilgisayarı kapattığınızda veya yeniden başlattığınızda kaybolur. Ayrıntılar için bkz. Geçici Ayarları Kullanma.
DMA Doğrulama özelliği standart ayarlara da dahildir. Örneğin:
verifier /standard /driver MyDriver.sysSürücü Doğrulayıcı Yöneticisini Kullanarak
- Sürücü Doğrulayıcı Yöneticisi'ni başlatın. Komut İstemi penceresine Doğrulayıcı yazın.
- Özel ayarlar oluştur'u (kod geliştiricileri için) seçin ve İleri'ye tıklayın.
- Tam liste'den tek tek ayarları seçin.
- DMA doğrulamayı seçin (denetleyin).
DMA Doğrulama özelliği standart ayarlara da dahildir. Bu özelliği kullanmak için Sürücü Doğrulayıcı Yöneticisi'nde Standart Ayarlar Oluştur'a tıklayın.