(55)_KPCR, _NT_TIB, _KPRCB
生活随笔
收集整理的這篇文章主要介紹了
(55)_KPCR, _NT_TIB, _KPRCB
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、回顧
上次課我們學習了 ETHREAD 的部分屬性,其中有一個 ThreadListEntry 屬性,存儲了線程鏈表,我們可以把它斷鏈處理,然后任務管理器,OD,windbg就會認為進程里沒有線程了,但實際上程序還在正常運行,這說明了操作系統線程調度并不通過 ThreadListEntry 鏈表。
這次課我們首先學習KPCR(Processor Control Region)結構,然后學習調度鏈表和等待鏈表,了解操作系統通過調度鏈表調度線程的過程。但是我打算將KPCR單獨寫一篇博客,調度鏈表和等待鏈表也單獨寫一篇。
二、_KPCR, _NT_TIB, _KPRCB
KPCR(Processor Control Region)存儲了CPU頻繁使用的信息,在0環通過 fs:[0] 可以訪問到。
_NT_TIB 是 _KPCR 的前 0x1c 字節
ntdll!_NT_TIB+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD異常鏈表,執行到 _try _catch 時,會在這個鏈表里添加異常處理函數+0x004 StackBase : Ptr32 Void+0x008 StackLimit : Ptr32 Void0環當前線程的棧基址和棧大小+0x00c SubSystemTib : Ptr32 Void+0x010 FiberData : Ptr32 Void+0x010 Version : Uint4B+0x014 ArbitraryUserPointer : Ptr32 Void+0x018 Self : Ptr32 _NT_TIB指向自己的指針_KPCR
nt!_KPCR+0x000 NtTib : _NT_TIB+0x01c SelfPcr : Ptr32 _KPCR指向自己的指針+0x020 Prcb : Ptr32 _KPRCB指向 _KPRCB,即 _KPCR + 0x120 偏移處的結構+0x024 Irql : UChar+0x028 IRR : Uint4B+0x02c IrrActive : Uint4B+0x030 IDR : Uint4B+0x034 KdVersionBlock : Ptr32 Void+0x038 IDT : Ptr32 _KIDTENTRY+0x03c GDT : Ptr32 _KGDTENTRYIDT, GDT 表基址+0x040 TSS : Ptr32 _KTSS指向TSS表,里面存儲了0環棧頂ESP0和0環堆棧段SS0,中斷門提權要用+0x044 MajorVersion : Uint2B+0x046 MinorVersion : Uint2B+0x048 SetMember : Uint4B+0x04c StallScaleFactor : Uint4B+0x050 DebugActive : UChar+0x051 Number : UCharCPU編號+0x052 Spare0 : UChar+0x053 SecondLevelCacheAssociativity : UChar+0x054 VdmAlert : Uint4B+0x058 KernelReserved : [14] Uint4B+0x090 SecondLevelCacheSize : Uint4B+0x094 HalReserved : [16] Uint4B+0x0d4 InterruptMode : Uint4B+0x0d8 Spare1 : UChar+0x0dc KernelReserved2 : [17] Uint4B+0x120 PrcbData : _KPRCB擴展結構體_KPRCB
ntdll!_KPRCB+0x000 MinorVersion : Uint2B+0x002 MajorVersion : Uint2B+0x004 CurrentThread : Ptr32 _KTHREAD當前線程+0x008 NextThread : Ptr32 _KTHREAD即將切換的下一個線程+0x00c IdleThread : Ptr32 _KTHREAD空閑線程+0x010 Number : Char+0x011 Reserved : Char+0x012 BuildType : Uint2B+0x014 SetMember : Uint4B+0x018 CpuType : Char+0x019 CpuID : Char+0x01a CpuStep : Uint2B+0x01c ProcessorState : _KPROCESSOR_STATE+0x33c KernelReserved : [16] Uint4B+0x37c HalReserved : [16] Uint4B+0x3bc PrcbPad0 : [92] UChar+0x418 LockQueue : [16] _KSPIN_LOCK_QUEUE+0x498 PrcbPad1 : [8] UChar+0x4a0 NpxThread : Ptr32 _KTHREAD+0x4a4 InterruptCount : Uint4B+0x4a8 KernelTime : Uint4B+0x4ac UserTime : Uint4B+0x4b0 DpcTime : Uint4B+0x4b4 DebugDpcTime : Uint4B+0x4b8 InterruptTime : Uint4B+0x4bc AdjustDpcThreshold : Uint4B+0x4c0 PageColor : Uint4B+0x4c4 SkipTick : Uint4B+0x4c8 MultiThreadSetBusy : UChar+0x4c9 Spare2 : [3] UChar+0x4cc ParentNode : Ptr32 _KNODE+0x4d0 MultiThreadProcessorSet : Uint4B+0x4d4 MultiThreadSetMaster : Ptr32 _KPRCB+0x4d8 ThreadStartCount : [2] Uint4B+0x4e0 CcFastReadNoWait : Uint4B+0x4e4 CcFastReadWait : Uint4B+0x4e8 CcFastReadNotPossible : Uint4B+0x4ec CcCopyReadNoWait : Uint4B+0x4f0 CcCopyReadWait : Uint4B+0x4f4 CcCopyReadNoWaitMiss : Uint4B+0x4f8 KeAlignmentFixupCount : Uint4B+0x4fc KeContextSwitches : Uint4B+0x500 KeDcacheFlushCount : Uint4B+0x504 KeExceptionDispatchCount : Uint4B+0x508 KeFirstLevelTbFills : Uint4B+0x50c KeFloatingEmulationCount : Uint4B+0x510 KeIcacheFlushCount : Uint4B+0x514 KeSecondLevelTbFills : Uint4B+0x518 KeSystemCalls : Uint4B+0x51c SpareCounter0 : [1] Uint4B+0x520 PPLookasideList : [16] _PP_LOOKASIDE_LIST+0x5a0 PPNPagedLookasideList : [32] _PP_LOOKASIDE_LIST+0x6a0 PPPagedLookasideList : [32] _PP_LOOKASIDE_LIST+0x7a0 PacketBarrier : Uint4B+0x7a4 ReverseStall : Uint4B+0x7a8 IpiFrame : Ptr32 Void+0x7ac PrcbPad2 : [52] UChar+0x7e0 CurrentPacket : [3] Ptr32 Void+0x7ec TargetSet : Uint4B+0x7f0 WorkerRoutine : Ptr32 void +0x7f4 IpiFrozen : Uint4B+0x7f8 PrcbPad3 : [40] UChar+0x820 RequestSummary : Uint4B+0x824 SignalDone : Ptr32 _KPRCB+0x828 PrcbPad4 : [56] UChar+0x860 DpcListHead : _LIST_ENTRY+0x868 DpcStack : Ptr32 Void+0x86c DpcCount : Uint4B+0x870 DpcQueueDepth : Uint4B+0x874 DpcRoutineActive : Uint4B+0x878 DpcInterruptRequested : Uint4B+0x87c DpcLastCount : Uint4B+0x880 DpcRequestRate : Uint4B+0x884 MaximumDpcQueueDepth : Uint4B+0x888 MinimumDpcRate : Uint4B+0x88c QuantumEnd : Uint4B+0x890 PrcbPad5 : [16] UChar+0x8a0 DpcLock : Uint4B+0x8a4 PrcbPad6 : [28] UChar+0x8c0 CallDpc : _KDPC+0x8e0 ChainedInterruptList : Ptr32 Void+0x8e4 LookasideIrpFloat : Int4B+0x8e8 SpareFields0 : [6] Uint4B+0x900 VendorString : [13] UChar+0x90d InitialApicId : UChar+0x90e LogicalProcessorsPerPhysicalProcessor : UChar+0x910 MHz : Uint4B+0x914 FeatureBits : Uint4B+0x918 UpdateSignature : _LARGE_INTEGER+0x920 NpxSaveArea : _FX_SAVE_AREA+0xb30 PowerState : _PROCESSOR_POWER_STATE三、思考題
分析從0環回3環時,這個 KPCR.KPCRB.ExceptionList 怎么處理?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的(55)_KPCR, _NT_TIB, _KPRCB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (54)线程结构体 ETHREAD,线程
- 下一篇: (56)等待链表,调度链表