线程的状态
线程有3种状态,run wait ready
run:在KPCR里可以找到正在运行的线程。一个CPU有一个KPCR,就可以有一个处于run状态的线程。 8个CPU就有8个同时run的线程。
wait: Sleep WaitForSingleObject Suspend 都可以让线程处于wait状态
等待链表
kd> dd KiWaitListHead
8055b088 861f83e0 862e7e08 00000011 00000000
8055b098 e57a42bd d6bf94d5 01000013 ffdff980
8055b0a8 ffdff980 804dd2cd 00000000 00000494
8055b0b8 00000000 ffdff9c0 8055b0c0 8055b0c0
8055b0c8 00000000 00000000 8055b0d0 8055b0d0
8055b0d8 00000000 00000000 00000000 867b08b8
8055b0e8 00000000 00000000 00040001 00000000
8055b0f8 867b0928 867b0928 00000001 000000
查看出来的地址是_ETHREAD的60处。 减去0x60就是_ETHREAD的开始处
就绪链表
一共有32个链表,线程不同的优先级,就在不同的链表中。如果当前地址=链表中第一个值 链表中第一个值 =链表中第二个值 那么这个链表就是空的。 调试时,所有线程都会被挂起来,所以就绪链表是空的。
dd KiDispatcherReadyListHead l70
8055bb20 8055bb20 8055bb20 8055bb28 8055bb28
8055bb30 8055bb30 8055bb30 8055bb38 8055bb38
8055bb40 8055bb40 8055bb40 8055bb48 8055bb48
8055bb50 8055bb50 8055bb50 8055bb58 8055bb58
8055bb60 8055bb60 8055bb60 8055bb68 8055bb68
8055bb70 8055bb70 8055bb70 8055bb78 8055bb78
8055bb80 8055bb80 8055bb80 8055bb88 8055bb88
8055bb90 8055bb90 8055bb90 8055bb98 8055bb98
8055bba0 8055bba0 8055bba0 8055bba8 8055bba8
8055bbb0 8055bbb0 8055bbb0 8055bbb8 8055bbb8
8055bbc0 8055bbc0 8055bbc0 8055bbc8 8055bbc8
8055bbd0 8055bbd0 8055bbd0 8055bbd8 8055bbd8
8055bbe0 8055bbe0 8055bbe0 8055bbe8 8055bbe8
8055bbf0 8055bbf0 8055bbf0 8055bbf8 8055bbf8
8055bc00 8055bc00 8055bc00 8055bc08 8055bc08
8055bc10 8055bc10 8055bc10 8055bc18 8055bc18