内核中的进程 PEB TEB

大部分内容引用于:
http://www.cnblogs.com/hanfenglun/archive/2009/03/20/1417506.html

包含关系

内核中的进程 PEB TEB_第1张图片
包含关系

进程和线程关系

内核中的进程 PEB TEB_第2张图片
进程和线程关系

内核进程结构

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

内核中的进程 PEB TEB_第3张图片
Windows NT结构图

CreateProcess创建进程的大致步骤:

1.打开可执行文件[.exe],以FILE_EXECUTE存取方式打开。
2.把可执行映像装载进RAM
2.创建进程内核对象(EPROCESSKPROCESSPEB结构)。
4.为该新建进程分配地址空间。
3.在该进程中创建主线程的线程执行对象(ETHREADKTHREADTEB结构),为主线程分配堆栈,建立该进程主线程的执行上下文。
4.Kernel32.dll通知Win32子系统已经创建了一个新进程。
5.如果标志不是CREATE_ SUSPENDED,那么就开始执行进程中的线程
6.在进程和线程的Context里,完成地址空间的初始化(比如,加载需要的DLL),开始执行程序。

线程上下文环境 (Thread Context)

在大多数情况下, 我们的系统中只安装了一个 CPU,所以, 对于所有这些运行中的程序来说, 操作系统对每个进程中的线程所使用的 CPU 时间进行调度, 循环为每个线程分配时间片, 这就造成了多个程序同时执行的假象。
如果系统中安装了多个 CPU, 那么操作系统的调度算法将复杂得多, 因为它要将各 CPU 上的线程进行平衡。如果 Windows 检测到一个新线程要开始运行了, 它将进行一次上下文环境切换 (context switch) (注:上下文环境 (Content) 实际上就是线程运行的环境, 也就是运行时各寄存器和其他东东的状态, 更自然的理解就是 "线程状态") 。
所谓上下文切换就是保存线程运行时的机器状态, 然后将另一个线程的状态恢复并重新开始执行。如果重新开始执行的线程属于另一个进程, 那么该进程的地址空间也将被同时切换过来 (通过在 CR3 寄存器中装入页表) 。上下文切换比较耗 CPU 时间。

你可能感兴趣的:(内核中的进程 PEB TEB)