Windows操作系统下创建进程的过程

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制。从内核角度讲线程是活动体对象,而进程只是一组静态的对象集,进程必须至少拥有一个活动线程才能维持运转。

当某个应用程序调用一个创建进程的函数比如CreateProcess或者用户执行某一个程序(其实windows下用户执行一般普通程序是由explorer.exe调用CreateProcess来完成),操作系统把这个过程分成以下步骤来完成:

1.打开将要在该进程中执行的映像文件。

2.创建Windows执行体进程对象。

3.创建初始线程(栈、堆执行环境初始化及执行线程体对象)。

4.通知Windows子系统新进程创建了(子系统是操作系统的一部分它是一个协助操作系统内核管理用户态/客户方的一个子系统具体的进程为Csrss.exe)。

5.开始执行初始线程(如果创建时候指定了线程的CREATE_SUSPENDED状态则线程暂时挂起不执行)。

6.在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行。

到这里操作系统完成一个新进程的创建过程。下面来看下具体每一步操作系统所做的工作:

1.打开将要在该进程中执行的映像文件。

首先操作系统找到执行的Windows映像然后创建一个内存区对象,以便后面将它映射到新的进程地址空间中。

2.创建Windows执行体进程对象。

接下来操作系统调用内部的系统函数NtCreateProcess来创建一个Windwos执行体进程对象。具体步骤是:

(1)建立EPROCESS

*分配并初始化EPROCESS结构块

*从父进程处继承得到进程的亲和性掩码

*分配进程的最大最小工作集尺(由两个参数决定PsMinimumWorkingSet PsMaximumWorkingSet)

*降新进程的配额块设置为父进程配额块地址,并递增父进程配额块的引用计数

*继承Windows的设备名字空间

*将父进程进程ID保存在新进程对象的InheritedFormUniqueProcessId中

*创建该进程的主访问令牌

*初始化进程句柄表

*将新进程的退出状态设置为STATUS_PENDING

(2)创建初始的进程地址空间

*在适当的页表中创建页表项,以映射初始页面

*从MmresidentAvailablePage算出进程工作集大小

*系统空间的非换页部分和系统缓存的页表被映射到进程

(3)初始化内核进程块KPROCESS

(4)结束进程地址空间的创建过程

(5)建立PEB

(6)完成执行体进程对象的创建过程

3.创建初始线程(栈、堆执行环境初始化及执行线程体对象)。

这时候Windows执行体进程对象已经完全建立完成,但它还没有线程所以无法执行,接下来系统调用NtCreateThread来创建一个挂起的新线程它就是进程的主线程体。

4.通知Windows子系统新进程创建了(子系统是操作系统的一部分它是一个协助操作系统内核管理用户态/客户方的一个子系统具体的进程为Csrss.exe)。接下来操作系统通过客户态(Kernel32.dll)给Windows子系统(Csrss)发送一个新进程线程创建的数据消息,让子系统建立自己的进程线程管理块。当Csrss接收到该消息时候执行下面的处理:

*复制一份该进程和线程句柄

*设置进程优先级

*分配Csrss进程块

*把新进程的异常处理端口绑定到Csrss中,这样当该进程发生异常时,Csrss将会接收到异常消息

*分配和初始化Csrss线程块

*把线程插入到进程的线程列表中

*把进程插入到Csrss的线程列表中

*显示进程启动光标

5.开始执行初始线程(如果创建时候指定了线程的CREATE_SUSPENDED状态则线程暂时挂起不执行)。到这里进程环境已经建立完毕进程中开始创建的主线程到这里获得执行权开始执行线程。

6.在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行。

到这步实质是调用ldrInitializeThunk来初始化加载器,堆管理器NLS表TLS数组以及临界区结构,并且加载任何必须要的DLL并且用

DLL_PROCESS_ATTACH功能代码来调用各DLL入口点,最后当加载器初始化例程返回到用户模式APC分发器时进程映像开始在用户模式下执行,然后它调用线程启动函数开始执行。

到这里操作系统完成了所有的创建工作,我们写的程序就这样被操作系统调用运行起来了。

(0)

相关推荐

  • 详细介绍windows系统下创建进程.线程的过程

    进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则 ...

  • Windows 7系统创建子域的过程

    创建子域的过程和创建主域控制器的过程基本相似,下面以在dz. cn的域下面创建的test子域为例。 1)安装【DNS服务器】和【Active Directory域服务】角色 首先确认本地网卡的TCP/ ...

  • Windows操作系统下如何安装IIS及其组件

    这里简单介绍一下如何在 Windows 系统下安装 IIS组件. 操作方法 01 这里以 Windows 8 为例,首先打开" 控制面版",找到" 程序和功能" ...

  • Windows操作系统下桌面图标如何设置

    我们会经常遇到这样的问题,如何将电脑桌面图标下的字背景设置成透明的?在属性里找了好久,但是还是没有弄成,下面介绍几种解决方法。 方法1 1.右击桌面→排列图标→把“在桌面上锁定定Web项目”前的对勾去 ...

  • Windows 7怎样创建宽带连接

    大家都知道,刚安装好的Windows 7系统是不能直接上网的,需要建立宽带连接来进行联网。在Windows XP系统下如何设置宽带连接,估计大家都知道如何去做,那么在Windows 7系统 下如何创建 ...

  • win10环境变量怎么设置?在Windows 10中创建环境变量的3种方法(详细)

    设置环境变量是编程过程中经常需要做的事情,这里我们来讨论如何在Windows 10中创建环境变量.Windows中的环境变量是包含有关系统环境和当前登录用户信息的值.除了Windows之外,环境变量也 ...

  • Windows操作系统中常见的死机情况

    在电脑使用过程中,我们经常会遇到死机的情况,而死机伴随者电脑操作系统,从一开始的Windows图形化操作系统开始,就一直有这样的情况,一直到Windows 7乃至泄漏版本的Windows 8一直存在。 ...

  • Windows操作系统死机

    在电脑使用过程中,我们经常会遇到死机的情况,而死机伴随者电脑操作系统,从一开始的Windows图形化操作系统开始,就一直有这样的情况。 为什么一直解决不了?那要从Windows的工作方式说起。为什么要 ...

  • Windows操作系统十三种安装小技巧

    我使用Windows 98,请问如何设置启动方式? 在Windows 98安装时,会在C:根目录下生成一个Msdos.sys文件,这个文件是文本文件,你可以使用文件编辑器打开它,其中有一些相关的设置参 ...