1.从一个问题开始
来源:互联网 发布:ipadmini1实用软件 编辑:程序博客网 时间:2024/06/06 03:12
1.从一个问题开始:
操作系统如何得知当下正在运行的线程或者进程以及如何做到下一个将要运行的进程或线程?
“Windows内核有一个特殊的基本要求,就是只要CPU在内核中运行,就得使段寄存器Windows系统中段寄存器FS在用户空间指向TEB、而在系统空间则指向KPCR。”关于FS段寄存器有什么作用以及如何指向KPCR和TEB数据结构那就是另外一个回事了,下面我们先来看一下KPCR的定义吧,之所以如此是因为在之后我们介绍的线程里有关于TEB的调用,KPCR在WRK-v1.2\base\ntos\inc\i386.h或者是amd64.h里都有这个重要结构的定义:
typedef struct _KPCR {
union {
NT_TIB NtTib;
struct {
struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
PVOID Used_StackBase;
PVOID PerfGlobalGroupMask;
PVOID TssCopy;
ULONG ContextSwitches;
KAFFINITY SetMemberCopy;
PVOID Used_Self;
};
};
struct _KPCR *SelfPcr; // flat address of this PCR
struct _KPRCB *Prcb; // pointer to Prcb
KIRQL Irql; // do not use 3 bytes after this as
// HALs assume they are zero.
ULONG IRR;
ULONG IrrActive;
ULONG IDR;
PVOID KdVersionBlock;
struct _KIDTENTRY *IDT;
struct _KGDTENTRY *GDT;
struct _KTSS *TSS;
USHORT MajorVersion;
USHORT MinorVersion;
KAFFINITY SetMember;
ULONG StallScaleFactor;
UCHAR SpareUnused;
UCHAR Number;
UCHAR Spare0;
UCHAR SecondLevelCacheAssociativity;
ULONG VdmAlert;
ULONG KernelReserved[14]; // For use by the kernel
ULONG SecondLevelCacheSize;
ULONG HalReserved[16]; // For use by Hal
ULONG InterruptMode;
UCHAR Spare1;
ULONG KernelReserved2[17];
struct _KPRCB PrcbData;
} KPCR, *PKPCR;
从这个结构我是看不懂什么的,但是细心的我发现了一件事,这里面出现了一个KPRCB的结构,和我们的KPCR如此相似,所以立马找到这个结构的定义,在同一个文件里我们发现了它:
typedef struct _KPRCB {
USHORT MinorVersion;
USHORT MajorVersion;
struct _KTHREAD *CurrentThread;
struct _KTHREAD *NextThread;
struct _KTHREAD *IdleThread;
...
CCHAR CpuType;
CCHAR CpuID;
USHORT CpuStep;
struct _KPROCESSOR_STATE ProcessorState;
...
struct _KTHREAD *NpxThread;
ULONG InterruptCount;
ULONG KernelTime;
ULONG UserTime;
ULONG DpcTime;
ULONG DebugDpcTime;
ULONG InterruptTime;
...
volatile ULONGLONG IsrTime;
ULONGLONG SpareField1;
FX_SAVE_AREA NpxSaveArea;
PROCESSOR_POWER_STATE PowerState;
} KPRCB, *PKPRCB, *RESTRICTED_POINTER PRKPRCB;
这个结构是非常非常的长啊,也侧面的说明这个结构是非常重要的,我只是简单的选取了一部分内容,在这里我们发现有很多重要的信息,接下来就是对这个结构的很长的解释了,这个结构里我们终于可以简单的解答一下第一个问题了,KPRCB结构里有个专门指向CurrentThread的指针,还有下一个将要执行的线程指针了,简单的回顾一下:操作系统通过FS段寄存器指向KPCR结构,KPCR结构里有个指向KPCRB结构的内容项,而在KPCRB里面外面发现了一个KTHREAD结构的指针,指向当前正在运行的线程和接下来要运行的线程。
操作系统如何得知当下正在运行的线程或者进程以及如何做到下一个将要运行的进程或线程?
“Windows内核有一个特殊的基本要求,就是只要CPU在内核中运行,就得使段寄存器Windows系统中段寄存器FS在用户空间指向TEB、而在系统空间则指向KPCR。”关于FS段寄存器有什么作用以及如何指向KPCR和TEB数据结构那就是另外一个回事了,下面我们先来看一下KPCR的定义吧,之所以如此是因为在之后我们介绍的线程里有关于TEB的调用,KPCR在WRK-v1.2\base\ntos\inc\i386.h或者是amd64.h里都有这个重要结构的定义:
typedef struct _KPCR {
union {
NT_TIB NtTib;
struct {
struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
PVOID Used_StackBase;
PVOID PerfGlobalGroupMask;
PVOID TssCopy;
ULONG ContextSwitches;
KAFFINITY SetMemberCopy;
PVOID Used_Self;
};
};
struct _KPCR *SelfPcr; // flat address of this PCR
struct _KPRCB *Prcb; // pointer to Prcb
KIRQL Irql; // do not use 3 bytes after this as
// HALs assume they are zero.
ULONG IRR;
ULONG IrrActive;
ULONG IDR;
PVOID KdVersionBlock;
struct _KIDTENTRY *IDT;
struct _KGDTENTRY *GDT;
struct _KTSS *TSS;
USHORT MajorVersion;
USHORT MinorVersion;
KAFFINITY SetMember;
ULONG StallScaleFactor;
UCHAR SpareUnused;
UCHAR Number;
UCHAR Spare0;
UCHAR SecondLevelCacheAssociativity;
ULONG VdmAlert;
ULONG KernelReserved[14]; // For use by the kernel
ULONG SecondLevelCacheSize;
ULONG HalReserved[16]; // For use by Hal
ULONG InterruptMode;
UCHAR Spare1;
ULONG KernelReserved2[17];
struct _KPRCB PrcbData;
} KPCR, *PKPCR;
从这个结构我是看不懂什么的,但是细心的我发现了一件事,这里面出现了一个KPRCB的结构,和我们的KPCR如此相似,所以立马找到这个结构的定义,在同一个文件里我们发现了它:
typedef struct _KPRCB {
USHORT MinorVersion;
USHORT MajorVersion;
struct _KTHREAD *CurrentThread;
struct _KTHREAD *NextThread;
struct _KTHREAD *IdleThread;
...
CCHAR CpuType;
CCHAR CpuID;
USHORT CpuStep;
struct _KPROCESSOR_STATE ProcessorState;
...
struct _KTHREAD *NpxThread;
ULONG InterruptCount;
ULONG KernelTime;
ULONG UserTime;
ULONG DpcTime;
ULONG DebugDpcTime;
ULONG InterruptTime;
...
volatile ULONGLONG IsrTime;
ULONGLONG SpareField1;
FX_SAVE_AREA NpxSaveArea;
PROCESSOR_POWER_STATE PowerState;
} KPRCB, *PKPRCB, *RESTRICTED_POINTER PRKPRCB;
这个结构是非常非常的长啊,也侧面的说明这个结构是非常重要的,我只是简单的选取了一部分内容,在这里我们发现有很多重要的信息,接下来就是对这个结构的很长的解释了,这个结构里我们终于可以简单的解答一下第一个问题了,KPRCB结构里有个专门指向CurrentThread的指针,还有下一个将要执行的线程指针了,简单的回顾一下:操作系统通过FS段寄存器指向KPCR结构,KPCR结构里有个指向KPCRB结构的内容项,而在KPCRB里面外面发现了一个KTHREAD结构的指针,指向当前正在运行的线程和接下来要运行的线程。
0 0
- 1.从一个问题开始
- 一个新的开始,从现在开始!
- 爱从一个微笑开始
- 爱,从一个微笑开始
- 从HelloWold开始一个操作系统
- 从一个芯片开始hack
- 从0开始 搭建一个SVN 和Maven 中遇到的问题
- 1. 从对象开始
- 从今天开始,一个线程诞生了
- 1、从一个疯狂的想法开始
- [DirectShow] 从一个小程序开始
- Basic Windbg - 从一个程序开始说起
- 从一个菜鸟开始 --插入排序
- 外遇 从一个暧昧的感觉开始
- 从一个手机号开始-正则表达式
- 从一个菜鸟开始学习机器学习
- 从现在开始,成为一个saper
- 图像处理从一个女人开始
- js逗号运算符
- 仿站的流程
- html5新属性,事件,API方法 笔记1.
- dsadsads
- 用扩展先序创建二叉链表
- 1.从一个问题开始
- HTML 5 APP 与原生 APP的差距到底在哪
- SQL server 添加主外键约束
- UVa 12563_Jin Ge Jin Qu hao
- 开源GIS系统介绍
- 黑马程序员----java面向对象
- 2.进程和线程的结构是什么?
- 关于活动的一些小技巧
- HTML-超链接标签