Aracılığıyla paylaş


Kilitlenme Algılama

Kilitlenme Algılama, sürücünün kilitlenmesi gereken kaynakları (spin kilitleri, mutex'ler ve hızlı mutex'ler) kullanımını izler. Bu Sürücü Doğrulayıcı seçeneği, gelecekteki bir noktada kilitlenmeye neden olabilecek kod mantığını algılar.

Sürücü Doğrulayıcı'nın Kilitlenme Algılama seçeneği ve !kilitlenme çekirdek hata ayıklayıcısı uzantısı, kodunuzun bu kaynakların kötü kullanılmasını önlemeye yönelik etkili bir araçtır.

Kilitlenme Algılama yalnızca Windows XP ve Windows'un sonraki sürümlerinde desteklenir.

Kilitlenmelerin Nedenleri

İki veya daha fazla iş parçacığının bazı kaynaklar üzerinde çatışarak hiçbir yürütmenin mümkün olmadığı durumda bir kilitlenme meydana gelir.

En yaygın kilitlenme biçimi, iki veya daha fazla iş parçacığı diğer iş parçacığına ait bir kaynağı beklediğinde oluşur. Bu, aşağıdaki gibi gösterilmiştir:

İş Parçası 1 Başlık 2
Kilit A'yı alır B Kilidini alır
B Kilidini İstekler İstekler A'ya Kilit

Her iki dizi de aynı zamanda gerçekleşirse, İş Parçacığı 1, İş Parçacığı 2'ye ait olduğundan B Kilidini asla alamaz ve İş Parçacığı 2, İş Parçacığı 1'e ait olduğundan A Kilidini asla alamaz. En iyi ihtimalle bu, söz konusu iş parçacıklarının durmasına ve en kötü ihtimalle sistemin yanıt vermeyi durdurmasına neden olur.

Kilitlenmeler sadece iki iş parçacığı ve iki kaynakla sınırlı değildir. Üç iş parçacığı ve üç kilit arasında üç yönlü kilitlenmeler yaygındır ve hatta bazen beş veya altı parçalı kilitlenmeler bile oluşur. Bu kilitlenmeler, aynı anda gerçekleşen bir dizi şeye güvendikleri için belirli bir ölçüde "kötü şans" gerektirir. Ancak kilit alımları ne kadar uzak olursa, bunların olma olasılığı o kadar artar.

Tek iş parçacıklı kilitlenmeler, bir iş parçacığı zaten sahip olduğu bir kilidi almaya çalıştığında meydana gelebilir.

Tüm kilitlenmeler arasındaki ortak payda kilit hiyerarşisinin dikkate alınmamasıdır. Bir kerede birden fazla kilidin alınması gerektiğinde, her kilidin net bir önceliği olmalıdır. A bir noktada B'nin önünde, B ise başka bir noktada C'nin önünde alınırsa, hiyerarşi A-B-C'dir. Bu, A'nın B veya C'nin ardından asla alınmaması ve B'nin C'nin ardından alınmaması gerektiği anlamına gelir.

Kilitlenme olasılığı olmadığında bile kilit hiyerarşisi izlenmelidir, çünkü kodu koruma sürecinde bir kilitlenmenin yanlışlıkla tanıtılması kolay olacaktır.

Kilitlenmelere Neden Olabilecek Kaynaklar

En açık kilitlenmeler, sahip olunan kaynakların sonucudur. Bunlar spin kilitleri, mutex'ler, hızlı mutex'ler ve ERESOURCE'lardır.

Alınan kaynaklar (olaylar ve LPC bağlantı noktaları gibi) yerine sinyal verilen kaynaklar çok daha belirsiz kilitlenmelere neden olma eğilimindedir. Kodun bu kaynakları, iki iş parçacığının birbirlerinin tamamlanmasını süresiz bir şekilde bekleyeceği bir duruma neden olacak şekilde kötüye kullanması elbette mümkündür ve oldukça yaygındır. Ancak, bu kaynaklar aslında herhangi bir iş parçacığına ait olmadığından, sınırlayıcı iş parçacığını herhangi bir kesinlik derecesiyle tanımlamak mümkün değildir.

Sürücü Doğrulayıcı'nın Kilitlenme Algılama seçeneği, döndürme kilitleri, mutex'ler ve hızlı mutex'ler içeren olası kilitlenmeleri arar. ERESOURCES kullanımını izlemez, ayrıca sahip olunmayan kaynakların kullanımını da izlemez.

Kilitlenme Tespitinin Etkileri

Sürücü Doğrulayıcı'nın Kilitlenme Algılama yordamları, aynı anda olması gerekmeyen kilit hiyerarşisi ihlallerini bulur. Çoğu zaman, bu ihlaller şans verildiğinde kilitlenmeye neden olacak kod yollarını tanımlar.

Sürücü Doğrulayıcı, olası kilitlenmeleri bulmak için kaynak alma siparişi grafiği oluşturur ve döngüleri denetler. Her kaynak için bir düğüm oluştursaydınız ve önce bir kilit, sonra diğerini edindiğinizde bir ok çizseydiniz, döngüsel yollar, kilit hiyerarşisi ihlallerini gösterirdi.

Sürücü Doğrulayıcı, bu ihlallerden biri bulunduğunda bir hata denetimi yapacaktır. Bu, gerçek kilitlenmeler gerçekleşmeden önce gerçekleşir.

Uyarı

Çakışan kod yolları hiçbir zaman aynı anda gerçekleşemese bile, kilit hiyerarşisi ihlalleri içeriyorsa yine de yeniden yazılmalıdır. Bu tür kod, kod biraz yeniden yazılırsa gerçek kilitlenmelere neden olabilecek bir "kilitlenme gerçekleşmeyi bekliyor" şeklindedir.

Kilitlenme Algılama bir ihlal bulduğunda, hata denetimi 0xC4 yayımlanacak. Bu hata denetiminin ilk parametresi tam ihlali gösterir. Olası ihlaller şunlardır:

  • Kilit hiyerarşisi ihlaline dahil olan iki veya daha fazla iş parçacığı

  • Zaten paylaşılan bir sahibi olduğu bir kaynağı münhasıran edinmeye çalışan bir iş parçacığı (münhasıran sahip olunan kaynaklar paylaşılabilir; paylaşılan kaynaklar münhasıran edinilemez).

  • Aynı kaynağı iki kez almaya çalışan bir iş parçacığı (kendi kendine kilitlenme)

  • İlk önce edinilmeden serbest bırakılan bir kaynak

  • Farklı bir iş parçacığı tarafından, onu edinen iş parçacığından ayrı olarak yayımlanan bir kaynak

  • Birden çok kez başlatılan veya hiç başlatılmayan bir kaynak

  • Kaynaklara sahip olduğu halde silinen bir iş parçacığı

  • Windows 7'den başlayarak, Sürücü Doğrulayıcı olası kilitlenmeleri tahmin edebilir. Örneğin, aynı KSPIN_LOCK veri yapısını hem standart bir spin lock hem de yığın sıralı spin lock olarak kullanmaya çalışmak.

Hata denetimi parametrelerinin listesi için bkz . Hata Denetimi 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

Kilitlenme Tespitini İzleme

Kilitlenme Algılama bir ihlal bulduğunda, tam olarak ne olduğunu araştırmak için !deadlock çekirdek hata ayıklayıcı eklentisi kullanılabilir. Kilit hiyerarşisi topolojisinin yanı sıra kilitlerin ilk alındığı sırada her iş parçacığı için çağrı yığınlarını görüntüleyebilir.

Windows için Hata Ayıklama Araçları paketindeki belgelerde !kilitlenme 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ştirme

Uyarı

Bu seçenek Çekirdek eşitleme gecikmesi fuzzing ile uyumsuz.

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 Kilitlenme Algılama ö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 Kilitlenme Algılama seçeneği Bit 5 (0x20) ile temsil edilir. Kilitlenme Algılama'yı etkinleştirmek için 0x20 bayrak değerini kullanın veya bayrak değerine 0x20 ekleyin. Örneğin:

    verifier /flags 0x20 /driver MyDriver.sys
    

    Özellik bir sonraki önyüklemeden sonra etkin olacaktır.

    Windows Vista ve windows'un sonraki sürümlerinde, / volatile parametresini komutuna ekleyerek bilgisayarı yeniden başlatmadan Kilitlenme Algılama'yı etkinleştirebilir ve devre dışı bırakabilirsiniz. Örneğin:

    verifier /volatile /flags 0x20 /adddriver MyDriver.sys
    

    Bu 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.

    Kilitlenme Algılama özelliği standart ayarlara da dahildir. Örneğin:

    verifier /standard /driver MyDriver.sys
    
  • Sürücü Doğrulayıcı Yöneticisini Kullanarak

    1. Özel ayarlar oluştur 'u (kod geliştiricileri için) ve ardından İleri'yi seçin.

    2. Tam liste'den tek tek ayarları seçin.

    3. Kilitlenme algılamayı seçin (denetleyin).

Kilitlenme Algılama özelliği standart ayarlara da dahildir. Bu özelliği kullanmak için Sürücü Doğrulayıcı Yöneticisi'ndeStandart Ayarlar Oluştur'u seçin.