线程优先级
前面分析过了SwapContext函数,用来线程切换的;线程切换需要2个线程,一个是当前线程,一个是用来切换的目标线程,我们知道当前线程可以通过KPCR+0x124位置的CurrentThread获得,那么目标线程该如何获得呢?下面一块来研究一下
线程切换的方式先回顾一下线程切换三种方式的过程:
...
分析SwapContext
SwapContext这个函数是Windows线程切换的核心,无论是主动切换还是系统时钟导致的线程切换,最终都会调用这个函数。在这个函数中,除了切换堆栈以外,还做了一些其它事情,了解这些细节对我们学习操作系统至关重要。
遗留问题在分析SwapContext函数之前,来回顾两个之前的文章中并没有交代的 ...
时间片管理与备用线程
前一篇,我们主要分析了线程切换的几种情况,其中一种是时钟中断,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:
当前线程的CPU时间片到期
存在备用线程(KPCR.PrcbData.NextThread处值不为空)
CPU时间片ThreadQuantum当一个新的线 ...
Windows线程切换
前一篇介绍了海哥写的一份Windows线程切换代码,通过对代码的分析和学习,我们知道了线程切换的本质就是堆栈的切换,其中有一个非常关键的函数:SwitchContext,当调用这个函数时,就会导致线程切换。同样,Windows也有一个用于线程切换的函数:KiSwapContext
KiSwapCon ...
模拟线程切换
我们知道CPU执行和调度的单位是线程,在有了线程结构体(ETHREAD)以及等待链表,调度链表的概念后,这一篇简单介绍一下线程切换,通过分析模拟线程切换的代码(源于滴水编程达人海东老师编写)来了解线程切换的过程及原理。
示例代码c12345678910111213141516171819202122 ...
等待链表&调度链表
在前面介绍进程结构体时,进行了断链实验,程序可以正常运行,原因是CPU执行与调度的单位是线程,因此进程的断链并不影响程序的正常执行。对线程的断链也是一样的,断链后虽然可以隐藏断掉的线程,但同样不影响程序的执行。这说明,CPU调度时根本没有用到ThreadListEntry这个链表。接下来介绍两个与调 ...
KPCR
进程在内核中对应结构体:EPROCESS
线程在内核中对应结构体:ETHREAD
CPU在内核中也有一个对应的结构体:KPCR(Processor Control Region)
KPCR结构我们已经很熟悉了,在API函数的调用过程中,多次使用到了KPCR,也简要介绍过一点。在保存现场之前有一个 ...
线程结构体
Windows中每个进程会包含一个或多个线程,每个线程在0环都有一个对应的结构体:ETHREAD,这个结构体包含了线程所有重要的信息,下面来简单了解一下。
ETHREADWindbg中,执行dt _ETHREAD可以看到这个完成的结构:
+0x000 Tcb
成员名:Tcb
数据类型:_KTHR ...
进程结构体
进程,站在内核的角度来说,它就是个结构体。当操作系统想要创建一个进程时,本质上就是分配一块内存,填充一个结构体,今天就来了解一下这个进程结构体EPROCESS。
EPROCESS每个Windows进程在0环都有一个对应的结构体:EPROCESS,这个结构体包含了进程所有重要的信息。
在Windbg中 ...
API函数的调用过程(系统服务表)
前面的学习过程中,我们了解到程序进入0环后,有一个保存现场的过程,会将3环的各种寄存器都保存到一个叫做_Trap_Frame的结构体中。在3环部分,程序将一个编号存到了eax中,这个编号叫做系统服务号,此外,在保存现场的过程中,程序还让edx指向了3环第一个参数的地址。回忆起这两步,接下来,就可以继 ...