熬之滴水成石:最想深入了解的内容--windows内核机制(9)

                                                                           61 进程与线程(6)

在windows的OS中,一个进程的创建是从一个内核函数ntcreateprocess函数开始的。在内核中当然要创建我们之前说到的那个对象;EPROCESS,这个对象创建完毕,实际上也创建了一个初始化的线程,这个时候,这个线程也创建了一个供自己调用的栈并且设置好它的执行环境。进程一个最为重要的事情就是要建立自己独立的地址空间。这个叫NtCreateProcessEx的函数,跟之前说过的数据机构比起来还是简单易懂多了。这个函数的参数实际上也并不复杂,它的输出实际上就是一个进程句柄。函数包含的参数有访问权限、进程对象属性、父进程的句柄,创建标志等。在实际运行中,ntcreateprocessEx只是简单的检查了进程句柄的参数是否可用,然后将其交给幕后真正的创建函数:pspcreateprocess。该函数的创建过程就比较复杂了,这里面最复杂的部分莫过于就是初始化新进程的地址空间了。简单来说,就是如何针对各自出现的情况划分地址空间了。一般有映射对象的,就好办了调用相关的initializeProcessaddressspace函数就可以,如果没有指定映射内存区域的鹅,但指定了父进程,但父进程并是不系统初始化就有得,就调用initalizeprocessaddress space函数,根据父进程的初始化地址空间,将父进程的映像名称copy到进程对象的数据结构中,还有一种情况是没有指定映射的内存对象,但指定了系统的函数posinitalsystemprocess作父进程的,这种情况下就直接初始化将父进程的映像copy到进程对象的数据结构中。总而言之,通过pspcreateprocess创建进程这还是一个比较复杂的过程,新建的进程中并没有任何线程对象。所以还要创建一个线程,跟进程创建是类似的。线程是通过ntcreatethread创建而来的,首先是检查该函数的各个参数,该函数的参数比起进程来多一点,但还是比较好理解的。有一个输出参数,就是该线程的句柄。有些参数和进程很是类似,像访问权限,对象属性等。Ntcreateprocess在实际调用中,是调用了pspcreate函数的方法,用来获得当前线程对象,然后根据进程句柄获得相应的进程对象。这里面都是在和之前提到的数据结构EPROCESS和ETHREAD对象打交道。一旦PspCreateThread函数返回,那么新线程对象状态已经完全覆盖好,它就可以马上执行了。因为线程的创建是在进程已经创建完成以后才可以进行的。所以线程的创建过程和进程比起来还是简单多了。当然我们在winodws编程时,也处于整个调用的顶层。我们都是习惯用windows提供的API函数,像createprocess。此函数一旦成功,则新的进程便已经建立起来。实际上还有许多我们未能看到的内容。

进程和线程有开始必然也会有结束。在执行层面来考虑,线程的终止方法叫做ntTerminateThread。这个函数实际上在运行中调用了pspTerminatethreadbypointer函数来完成真正的处理。至此线程终止会牵引出来三个相关的函数:ntterminatethread、psterminatesystemthread、pspterminatethreadbypointer。这三个方法,ntterminatethread最为简单,因为她所包含的参数就是线程的句柄,正是因为有这个句柄,它才可以名正言顺的调用pspterminatethreadbypointer来结束线程。该函数则是执行实际的终止过程,而这个实际的终止过程又是另一个方法叫pspexitthread。这个函数首先获得进程对象,然后判断线程是否被允许被干掉,如允许则它可干掉各种调用该线程的引用,将指向该线程的进程的活动计数减去,如果这是最后一个线程了,则必须等到该进程的线程链表中的所有线程都退出才能继续进行。所有的操作其实都可以理解是消息,就是向所有已经登记过的要接收的线程发送终止消息。当然进程和线程的终止实际上远没有我所描述这般简单,实际上在调用的方法中还有一些我也并未讲出,那些也将是我要继续深入的一些方向。

                                                                                                                                                                         (未完待续...............)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值