![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
进程与线程
My classmates
QQ349561280
展开
-
C++类中封装线程函数
线程函数必须声明为静态非静态函数都要有一个隐含参数,作为this指针而线程函数只能是普通函数,要写在类里面一定要是静态的,然后把类指针作为参数进行显式传递class MyClass{public: void zz() { i = 1000; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GO, this, 0, NULL); }...原创 2018-09-27 20:42:01 · 442 阅读 · 0 评论 -
9.Windows线程切换_TSS
SwapContext这个函数是Windows线程切换的核心,无论是主动切换还,是系统时钟导致的线程切换,最终都会调用这个函数。在这个函数中除了切换堆栈以外,还做了很多其他的事情,了解这些细节对我们学习操作系统至关重要。下面我们看看线程切换与TSS的关系。栈底开始往上0x210个字节存储浮点寄存器的值,以上都是TrapFrame结构(在api3环进0环已经讲过了)。调用API进0环普...原创 2018-10-20 22:55:30 · 1238 阅读 · 0 评论 -
8.Windows线程切换_时间片管理
时钟中断会导致线程进行切换,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:当前的线程CPU时间片到期有备用线程(KPCR.PrcbData.NextThread)关于CPU时间片当一个新的线程开始执行时,初始化程序会在KTHREAD.Quantum赋初始值,该值的大小由KPROCESS.ThreadQuantum决定(观察ThreadQuantum大小...原创 2018-10-20 16:45:09 · 3363 阅读 · 0 评论 -
7.Windows线程切换_时钟中断切换
绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的。如何中断一个正在执行的程序?异常 比如缺页,或者INT N指令中断 比如时钟中断系统时钟Windows系列操作系统: 10-20毫秒如要获取当前的时钟间隔值,可使用Win32API:GetSystemTimeAdjustmentida中ALT+T搜索_IDT 点...原创 2018-10-20 11:05:30 · 1260 阅读 · 0 评论 -
13.跨进程读写内存
跨进程的本质是"进程挂靠”正常情况下, A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基值(KPROCESS.DirectoryTableBase)。即: mov cr3,B.DirectoryTableBase跨进程操作A进制中的线程代码:mov cr3,B.DirectoryTableBase //切换Cr3...原创 2018-10-22 20:49:40 · 3883 阅读 · 1 评论 -
12.进程挂靠
进程与线程的关系:一个逃程可以包含多个线程一个进程至少要有一个线程进程为线程提供资源,也就是提供Cr3的值, Cr3中存储的是页目录表基址, Cr3确定了,线程能访问的内存也就确定了。进程与线程的关系线程代码:mov eax, dword ptr ds:(0x12345678]CPU如何解析0x12345678这个地址呢?CPU解析线性地址时要通过页目录表来找对应的物理页,页目录...原创 2018-10-22 15:50:41 · 861 阅读 · 1 评论 -
6.windows线程切换_主动切换
ida 分析KiSwapThreadsub esp, 10hmov [esp+10h+var_4], ebx ;保存当前线程寄存器现场mov [esp+10h+var_8], esimov [esp+10h+var_C], edimov [esp+10h+var_10], ebpmov ebx, ds:0FFDFF01Chmov ...原创 2018-10-19 22:23:07 · 1189 阅读 · 1 评论 -
5.模拟线程切换
模拟Windows线程切换(ThreadSwitch)正在运行的线程在KPCR里,等待的线程在等待链表中,调度中的线程在那32个调度链表中。创建它是从下标1的位置开始存的而不是0,因为main需要一个线程。创建的线程还不能调度还需要初始化的环境,寄存器的值、当前线程的堆栈要确定模拟线程切换总结:线程不是被动切换的,而是主动让出CPU线程切换并没有使用TSS来保存寄存器,而是使用堆...原创 2018-10-19 18:18:02 · 1048 阅读 · 3 评论 -
11.Windows线程切换_线程优先级
(1)、当前线程主动调用API:API函数->KiSwapThread->KiSwapContext->SwapContexti(2)、当前线程时间片到期:KiDispatchInterrupt->KiQuantumEnd->SwapContext(3)、有备用线程(KPCR.PrcbData.NextThread)KiDispatchInterrupt-&...原创 2018-10-22 06:36:08 · 1425 阅读 · 0 评论 -
4.等待链表与调度链表
等待链表kd>dd KiWaitListHead比如:线程调用了Sleep()或者WaitForSingleObject()等函数时,就挂到这个双向链表, (查看等待线程)kd> dd KiWaitListHeadkd> dt _KTHREAD 895fd230(表里成员) - 60kd> dt _ETHREAD 895fd230(表里成员) - 60_ETH...原创 2018-10-19 14:07:59 · 672 阅读 · 0 评论 -
3.KPCR
KPCR: CPU控制区(Processor Control Region)当线程进入0环时, FS:[0]指向KPCR(3环时FS[0]-> TEB)每个CPU都有一个KPCR结构体(一个核一个)KPCR中存储了CPU本身要用的一些重要数据: GDT, IDT以及线程相关的一些信息。在winbbg中查看KPCR结构体kd>原创 2018-10-19 12:03:52 · 237 阅读 · 0 评论 -
2.线程结构体
ETHREADkd> dt _ETHREADntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x1c0 CreateTime : _LARGE_INTEGER +0x1c0 NestedFaultCount : Pos 0, 2 Bits +0x1c0 ApcNeeded : Pos ...原创 2018-10-19 09:45:48 · 1095 阅读 · 0 评论 -
1.进程结构体
其实我们创建进程或者线程就是分配一块内存填充一个结构体赋上具体的值这样进程或者线程也就创建出来了。每个windows进程在0环都有一个对应的结构体: EPROCESS这个结构体包含了进程所有重要的信息。kd> dt _EPROCESSnt!_EPROCESS //名称 //类型 +0x000 Pcb : _KPROCESS //子结构 ...原创 2018-10-18 22:48:37 · 2205 阅读 · 0 评论 -
10.Windows线程切换_FS段寄存器
FS:[0]寄存器在3环时指向TEB.进入0环后FS:[0]指向KPCR系统中同时存在很多个线程,这就意味着FS:[0]在3环时指向的TEB要有多个(每个线程一份)。但在实际的使用中我们发现,当我们在3环查看不同线程的FS寄存器时, FS的段选择子都是相同的,那是如何实现通过一个FS寄存器指向多个TEB呢?下面是ida的分析代码 ; CODE ...原创 2018-10-21 08:23:01 · 489 阅读 · 1 评论