大部分内容引用于:
http://www.cnblogs.com/hanfenglun/archive/2009/03/20/1417506.html
包含关系
进程和线程关系
内核进程结构
KPCR
(Kernel's Processor Control Region,内核进程控制区域)是一个不会随Windows
版本变动而改变的固定结构体,在它的末尾(偏移0x120
)指向KPRCB
结构。
KPRCB
同样是一个不会随WINDOWS版本变动而改变的固定结构体。它包含有指向当前KTHREAD
的指针(偏移值0x004
)。
ETHREAD
的第一项是KTHREAD
,也就知道了当前的ETHREAD
基地址。KTHREAD
中的_KAPC_STATE
结构包含当前KPROCESS
的地址每个进程都有一个EPROCESS
结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS
结构位于系统地址空间,所以访问这个结构需要有ring0
的权限。EPROCESS
的第一项是KPROCESS
。
CreateProcess创建进程的大致步骤:
1.打开可执行文件[.exe]
,以FILE_EXECUTE
存取方式打开。
2.把可执行映像装载进RAM
。
2.创建进程内核对象(EPROCESS
,KPROCESS
和PEB
结构)。
4.为该新建进程分配地址空间。
3.在该进程中创建主线程的线程执行对象(ETHREAD
,KTHREAD
和TEB
结构),为主线程分配堆栈,建立该进程主线程的执行上下文。
4.Kernel32.dll
通知Win32
子系统已经创建了一个新进程。
5.如果标志不是CREATE_ SUSPENDED
,那么就开始执行进程中的线程
6.在进程和线程的Context
里,完成地址空间的初始化(比如,加载需要的DLL
),开始执行程序。
线程上下文环境 (Thread Context)
在大多数情况下, 我们的系统中只安装了一个 CPU
,所以, 对于所有这些运行中的程序来说, 操作系统对每个进程中的线程所使用的 CPU 时间进行调度, 循环为每个线程分配时间片, 这就造成了多个程序同时执行的假象。
如果系统中安装了多个 CPU
, 那么操作系统的调度算法将复杂得多, 因为它要将各 CPU
上的线程进行平衡。如果 Windows
检测到一个新线程要开始运行了, 它将进行一次上下文环境切换 (context switch
) (注:上下文环境 (Content
) 实际上就是线程运行的环境, 也就是运行时各寄存器和其他东东的状态, 更自然的理解就是 "线程状态") 。
所谓上下文切换就是保存线程运行时的机器状态, 然后将另一个线程的状态恢复并重新开始执行。如果重新开始执行的线程属于另一个进程, 那么该进程的地址空间也将被同时切换过来 (通过在 CR3
寄存器中装入页表) 。上下文切换比较耗 CPU
时间。