版权述说:冠词是视频博客作者的独创的文字。,没博主答应,不得推测转载。。 https://blog.csdn.net/sinat_19596835/article/details/80834870

fork()效能:
用于安排工序。,所安排的工序印刷父工序的明确提出遗传密码段/录音段/BSS段/堆/栈等缠住用户填空处知识;内核中,监控体系重行为其运用PCB。,并运用父工序的PCB设定初值它。;
子工序演技的定位是fork()效能演技后的明确提出遗传密码处,猜想是将父工序的PC指导印刷到子工序。。

习题:

int main()
{
    pid_t pid1;
    pid_t pid2;

    pid1 = fork();
    pid2 = fork();

    printf("pid1:%d, pid2:%d\n", pid1, pid2);
}

需求列举如下:
显露,从同样顺序到顺序EN演技的缠住工序,没另外新的工序被手段。。

  1、演技此顺序后请阐明。,将有各自的工序正运转。。

  2、假使一工序的出口是pID1:1001, pid2:1002”,在不思索工序演技的局面下写出另外工序的出口总算。

1 /呈现父工序(main工序)是P0。,经两遍fork()效能,将安排2建造工序P1/P2。;安排后的子工序P1,从fork()演技后的明确提出遗传密码处开端演技,演技明确提出遗传密码段

pid1:1001, pid2:1002pid1:0, pid2:1002pid1:1001, pid2:0pid1:0, pid2:0

fork()具体步骤列举如下:
原始的阶段:翻开目的绘制地图提出。。

第二阶段:内核中安排工序不赞成

第三阶段:安排初始线状物

月的第四日阶段:理睬Windows纳粹党卫军工序工序以设法对付新工序。

第五阶段:启动初始线状物

六年级阶段:用户填空处设定初值与Dll衔接

具体的内容:

在Windows中,CreateProcess要先经过体系打电话给NtCreateProcess安排工序,成较晚地就一起经过体系打电话给NtCreateThread安排其原始的线状物。

原始的阶段:翻开目的绘制地图提出。。

率先用CreateProcess(在世界上是CreateProcessW)翻开明确提出的可演技绘制地图提出,并安排内存区域不赞成。。理睬,内存区域不赞成没计划到内存(由于目的工序h),内存计划是不可能的的。,但它的确吐艳了。。

第二阶段:内核中安排工序不赞成

其实,它是由于EPROCESS安排互插的录音结构。,首要包含:

内核中打电话给NTCCRATEPROTEX 体系服务性的,实践的呼叫工序执意这样地。: 打电话给工序 正式抄本效能ntCCRATEPROTEX,NtCreateProcessEx 运用加工的设圈套机制切换到内核典范。;内核典范,体系服务性的分派效能 获得物把持,它运用如今线状物明确提出的体系服务性的表。,演技层的NTCCRATEPROTEX 效能。那么,演技层ntCCRATEPROTEX 效能安排了后面界定方法的工序的逻辑。,包含安排E工序 不赞成、设定初值域、安排初始工序地址填空处、安排和设定初值句柄表,发展工序 和KPROCESS 达到目标杂多的属性,如工序优先考虑的事、获得安全属性、安排工夫等。。到这边,发展了演技层的演技不赞成。,工序的地址填空处曾经设定初值。,而且EPROCESS 经过的球 也设定初值。

第三阶段:安排初始线状物

同样阶段是经过打电话给NTCREATE线状物完整的的。,首要包含: 如今,憎恨工序不赞成曾经发展起来,但它没成群地迁徙或飞行。,因而,它不克不及单独做稍微事实。。接下来,本人需求安排一初始线状物。,到这程度,率先,本人需求排列一堆栈和一运转细节。。初始线状物的堆栈大多数可以经过IMAG获得物。,线状物的安排可以经过打电话给来完整的。 达到目标NtCreateThread 效能完整的。 安排和设置目的线状物的EthType录音结构,并处置与EPULL的相干(譬如,PROC达到目标线状物计数)。 在目的用户填空处中安排并设置目的线状物的TEB。 将目的线状物在用户填空处的根源地址设置成得分达到目标BaseProcessStart()或BaseThreadStart(),前者用于该工序达到目标原始的线状物。,后者用于后续线状物。。 用户顺序在打电话给NtCreateThread()时也要供一用户级的根源效能(地址), BaseProcessStart()和BaseThreadStart()在完整的设定初值时会打电话给同样根源效能。 E线状物录音结构中有两个隶属的小组织。,它们参加用于记忆力这两个地址。。 打电话给KeInitThread设置目的线状物的KTHREAD录音结构并为其分派堆栈和发展演技细节。   特殊地,将其语境达到目标断点(赢利点)设置成得分内核达到目标一节顺序KiThreadStartup,这样,一旦线状物被调整运转,它就从这边开端。。 体系可以留下印象少量的应称为WH的理睬效能。,打电话给这些效能。

月的第四日阶段:理睬Windows纳粹党卫军

当安排时,每个工序都理睬Windows纳粹党卫军工序工序。,由于它肩膀着对windows缠住工序的设法对付的责任感, 理睬,上面是安排工序打电话给方的理睬。,这不是一新的工序。,由于它还没开端运转。。

到这程度,完整的了CREATE工序的操纵。,可是子工序达到目标线状物还没开端运转。,它的运转将阅历以下第五个阶段和六年级个阶段。。

第五阶段:启动初始线状物

内核中,新线状物的启动例程是KyRead启动效能。,这是当pSPCREATE线状物时 打电话给KeInitThread 效能时,KeInitThread 效能打电话给KiInitializeContextThread(翻阅base\ntos\ke\i386\ 要设置的提出。

KiThreadStartup 效能率先从IQL开端。 取消法令到APCL级,那么打电话给体系初始的线状物效能PspUserThreadStartup。这边的PspUserThreadStartup 效能是pSPCREATEXTION。 效能打电话给KeInType。 时明确提出的,。理睬,PspCreateThread效能在安排体系线状物时明确提出的初始线状物效能为PspSystemThreadStartup 。线状物启动效能被作为一参量印象给PspUserThreadStartup,在这边,它应该是 达到目标BaseProcessStart。

PspUserThreadStartup 效能称为。逻辑一点也没有复杂。,可是它屈尊做某事异步效能打电话给(APC)机制。。

新安排的线状物不一定是可以被一起调整运转的,由于用户可以在安排时评价指示位安排。 延缓设置为1。; 假使那么的话,帮忙在其他人走后留下来另外工序在T过后被调整和运转。。不然,如今可以调整运转。。在那时讲演?,这打开前慢走。。

六年级阶段:用户填空处设定初值与Dll衔接

PspUserThreadStartup 效能赢利后,KiThreadStartup 效能赢利用户典范,此刻,PspUserThreadStartup 拔出式APC 被交付,结果LdrInitializeThunk 效能称为,这是图像装货器(图像)。 装载机设定初值效能。LdrInitializeThunk 效能完整的装货器、堆设法对付器和另外设定初值任务,那么装货稍微命令的DLL。,呼唤这些DLL 的参加比赛的人效能。决赛,当LdrInitializeThunk 赢利用户典范APC 拿出器时,线状物在用户典范下开端演技。,打电话给运用顺序明确提出的线状物使某事物或某人敏感效能,同样启动效能的地址曾经在APC中。 印象被紧缩到用户堆栈中。。

DLL衔接由达到目标LdrInitializeThunk()在用户填空处完整的。到如今为止,与运用软件没稍微关联。,可是它曾经计划到用户填空处。 效能LdrInitializeThunk()在绘制地图达到目标定位是体系设定初值时就预先注定决定并记录在案的,因而在进入同样效能从前不需求衔接。。