Rich (BB code):
DPC_WATCHDOG_VIOLATION (133)
The DPC watchdog detected a prolonged run time at an IRQL of DISPATCH_LEVEL
or above.
Arguments:
Arg1: 0000000000000001, The system cumulatively spent an extended period of time at
DISPATCH_LEVEL or above.
Arg2: 0000000000001e00, The watchdog period (in ticks).
Arg3: fffff8056fafb320, cast to nt!DPC_WATCHDOG_GLOBAL_TRIAGE_BLOCK, which contains
additional information regarding the cumulative timeout
Arg4: 0000000000000000
Sürücüler prosedür çağrıları (DPC) yaptığında gerekli işlemleri tamamlamak için çok fazla süreye sahip olmazlar. Bir kernel sürücüsü bu çağrı süresini aşarsa sistem mavi ekrana düşer.
Bir de sistemin birden fazla prosedür çağrısına ayırdığı kümülatif bir süre olur. (İlk parametrede bundan bahsediliyor) StorAHCI sürücüsü veya bununla beraber + bir sürücü, sistemi bu süre zarfının dışına çıkacak kadar uzun bir süre askıda bıraktığı için mavi ekran yemişsin.
Rich (BB code):
0: kd> ? 1e00
Evaluate expression: 7680 = 00000000`00001e00
768us gibi bir sürede DISPATCH seviyesinde takılı kalmak sistemi çok büyük bir gecikmeye sürükler, zira sistem bu süre zarfında gecikemez. (Windows özelinde)
Rich (BB code):
0: kd> KnL
# Child-SP RetAddr Call Site
00 fffff805`73c84818 fffff805`6f237d96 nt!KeBugCheckEx
01 fffff805`73c84820 fffff805`6f05937d nt!KeAccumulateTicks+0x1e1c36
02 fffff805`73c84880 fffff805`6f0518d1 nt!KiUpdateRunTime+0x5d // Çökme
03 fffff805`73c848d0 fffff805`6f053793 nt!KiUpdateTime+0x4a1 // İşlemcinin sistemin takılı kaldığını fark edip zamanlayıcı düzeltmesi
04 fffff805`73c84a10 fffff805`6f0509a2 nt!KeClockInterruptNotify+0x2e3
05 fffff805`73c84ac0 fffff805`6f100805 nt!HalpTimerClockInterrupt+0xe2
06 fffff805`73c84af0 fffff805`6f1ff8ca nt!KiCallInterruptServiceRoutine+0xa5
07 fffff805`73c84b40 fffff805`6f2000f7 nt!KiInterruptSubDispatchNoLockNoEtw+0xfa
08 fffff805`73c84b90 fffff805`727f4565 nt!KiInterruptDispatchNoLockNoEtw+0x37
09 fffff805`73c84d20 fffff805`727f44d7 storahci!AhciInterruptHandler+0x45 // Kesmenin ele alınması
0a fffff805`73c84e50 fffff805`727f43e7 storahci!AhciHwInterrupt+0xd7
0b fffff805`73c84e80 fffff805`72841604 storahci!AhciHwMSIInterrupt+0x17 // Donanım kesmeleri
0c fffff805`73c84eb0 fffff805`6f140311 storport!RaidpAdapterMSIInterruptRoutine+0x54
0d fffff805`73c84f10 fffff805`6f100805 nt!KiInterruptMessageDispatch+0x11
0e fffff805`73c84f40 fffff805`6f1ff64f nt!KiCallInterruptServiceRoutine+0xa5
0f fffff805`73c84f90 fffff805`6f1ff917 nt!KiInterruptSubDispatch+0x11f
10 fffff805`73c753a0 fffff805`6f15b2ae nt!KiInterruptDispatch+0x37
11 fffff805`73c75530 fffff805`72835bdc nt!KeReleaseInterruptSpinLock+0x2e
12 fffff805`73c75570 fffff805`7283f258 storport!RaidAdapterReleaseInterruptLock+0x50
13 fffff805`73c755a0 fffff805`727f41df storport!StorPortNotification+0xaa8 // StorPort sürücüsünün SpinLock edinimi
14 fffff805`73c75670 fffff805`727f350b storahci!AhciInterruptSpinlockRelease+0x23 // SpinLock'u edinim ki bu durum ile beraber IRQL seviyesi de DISPATCH duruma geçer
15 fffff805`73c756a0 fffff805`727f7e98 storahci!P_Running_WaitOnBSYDRQ+0x2fb
16 fffff805`73c75730 fffff805`727f8dd0 storahci!P_Running+0x144
17 fffff805`73c75780 fffff805`72831169 storahci!P_Running_Callback+0xb0
18 fffff805`73c757d0 fffff805`6f0c1ca2 storport!StorportTimerDpc+0x59 // DPC zamanlayıcını ediniyor
19 fffff805`73c75820 fffff805`6f0c0d1d nt!KiProcessExpiredTimerList+0x172
1a fffff805`73c75910 fffff805`6f20235e nt!KiRetireDpcList+0x5dd
1b fffff805`73c75ba0 00000000`00000000 nt!KiIdleLoop+0x9e
StorAHCI sürücüsü ile başlayan DPC edinimi, haliyle DPC zamanlayıcısnı devreye sokuyor, AHCI sürücüsü bu süre zarfında çalışıyor, CallBack'ler ve ne oldukları tam açıklanmayan şeyler yapıyor, Ardından SpinLock'u elde ediyor. SpinLock elde edilince IRQL durumu da 2'e yani DISPATCH duruma geçiyor. StorPort sürücüsü için de aynısı geçerli. Sistem bundan sonra kesmeleri sıraya alıp düzenliyor bir sonraki AHCI çağrısına kadar, Bundan sonra AHCI'nin
Message-Signaled Interrupts kesmelerine baktığını (Unutma ki bunları hızlı düzenlemeli, IRQL 2 düzeyinde bunları düzenlerken hızlı olmalı ve sayfalanmayan belleklere erişmemeli.) ve sonrasında sistemin geciktiğini fark etmesiyle mavi ekrana kendi isteğiyle düştüğünü görüyoruz.
StorPort sürücüsünün SpinLock edinime dair;
Rich (BB code):
storport!(perf)
Parameter[0] = 0000000000001004
Parameter[1] = ffffa803001a0c30
Parameter[2] = fffff80573c756e0
Parameter[3] = fffff80573c756b0
Rich (BB code):
0: kd> ? 0000000000001004
Evaluate expression: 4100 = 00000000`00001004
Eki Görüntüle 115045
Düşündüğüm veya düşüneceğim şeylerden ilki zayıf bir disk bağlantısının da DPC sürelerinde gecikme yarattığıdır. Eğer disk zayıf bir bağlantıdaysa (Örneğin: Gevşemiş bir SATA kablosu, yerinde düzgün oturtulmayan bir NVMe) DPC sürelerinde artma ve gecikme yarattığına dair şeyler gördüm.
Diğer bir şey ise sistem bu noktada kümülatif olarak çalışıyor ve anlık olarak hangi DPC'lerin hangi sürede olduğunu görmemizin minidump üzerinden bir yolu yok. Eğer C:/Windows dizini içinde MEMORY.DMP dosyası varsa onu da minidump dosyaların gibi bir bağlantıyla paylaşırsan anlık olarak 0x133 hatasından hangi DPC'lerin bu kümülatif sürede hangi sürede çalıştıklarına bakabilirim. Bu da eğer ki AHCI sürücüsünü bu duruma iten farklı bir sürücü varsa onun varlığını gösterebilir tabii.
Rich (BB code):
All durations are in seconds (1 System tick = 0.000000 milliseconds)
Circular Kernel Context Logger history: !logdump 0x2
DPC and ISR stats (total since boot): !intstats /d
DPC and ISR stats (during DPC watchdog period): !intstats /w
--------------------------------------------------
CPU#0
--------------------------------------------------
Current DPC: Unable to read nt!_KDPC.DeferredRoutine // İncelenemez durumda
DPC süreleri için chkdsk çalıştırmanın bir mantığı yok bu durumda. Olay görüntüleyicisi içinden
yönetim olayları raporunu
rehbere bakarak paylaş.