我想了解內核級別的死鎖/活鎖並探索不同的等待對象。使用notmyfault我創建了一個系統掛起並強制內存轉儲。顯示notmyfault的進程我看到兩個線程;一個正在嘗試獲取快速互斥體,正在等待SynchronizationEvent,另一個正在等待多個對象 - 所有SynchronizationTimers。爲什麼SynchronizationEvent指向自己?
THREAD fffffa800895f060 Cid 0f6c.0f5c Teb: 000007fffffde000 Win32Thread: fffff900c206bc20 WAIT: (WrFastMutex) KernelMode Non-Alertable
fffff88006ed0198 SynchronizationEvent
和
THREAD fffffa800895c060 Cid 0f6c.0f20 Teb: 000007fffffdc000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Alertable
fffffa80069d8ef0 SynchronizationTimer
fffffa80093d28c0 SynchronizationTimer
fffffa800948e060 SynchronizationTimer
我檢查在第一次同步事件分派首:
3: kd> dt nt!_DISPATCHER_HEADER fffff88006ed0198
*SNIP*
+0x008 WaitListHead : _LIST_ENTRY [ 0xfffffa80`0895f168 - 0xfffffa80`0895f168 ]
和等待表頭中的kwait塊。
3: kd> dt nt!_KWAIT_BLOCK 0xfffffa80`0895f168
+0x000 WaitListEntry : _LIST_ENTRY [ 0xfffff880`06ed01a0 - 0xfffff880`06ed01a0 ]
+0x010 Thread : 0xfffffa80`0895f060 _KTHREAD
+0x018 Object : 0xfffff880`06ed0198 Void
+0x020 NextWaitBlock : 0xfffffa80`0895f168 _KWAIT_BLOCK
*SNIP*
綜觀其他線程的等待名單似乎是有道理的對我說:僵局似乎是由每個kwait_blocks引用對方一種循環的(我想原因引起的實際定義死鎖)。
我遇到的問題是上面的調度器頭和kwait塊。我的假設是,第一個線程將等待在使用同步定時器循環的線程上。我假設我已經錯過了一個步驟,或者僅僅是誤解,但爲什麼NextWaitBlock會引用它自己呢?
編輯:
另外我注意到,沒有這些事件/定時器表示,他們已經發出信號,但fffffa800948e060包含一個插入的計時器。我的理解是,致病事件必須處於信號狀態,這是不正確的還是有另一個我忽略的等待對象?
LIST_ENTRY標頭引用自身以指示列表爲空。 KWAIT_BLOCK可能類似。 –