linux编程之进程创建的内部实现

在Linux中,进程创建实际上是通过do_fork函数处理的。do_fork函数的功能相对简单:

代码在:kernel/fork.c
1.检查是否或者哪个事件应该汇报给ptracer。
2
.通过copy_process创建进程描述符和子进程执行所需要的其它数据结构。
3.执行wake_up_new_task函数,唤醒新进程。
4
.结束并返回子进程的ID

  copy_process则负责对进程创建的相关资源的申请:

复制代码
代码在:kernel/fork.c
1.调用security_task_create以及稍后调用的security_task_alloc执行附加的安全检查。

2
.执行dup_task_struct复制父进程的task_struct描述符 3.初始化新结构体的各个字段:did_exec,utime,stime,gtime,irq_events,hardirqs_enabled等等 4.进行调度相关的初始化:perf_event_init_task,audit_alloc. 5.复制父进程的信息到子进程:copy_semundo,copy_files,copy_fs,copy_mm等 6.初始化其它进程相关字段 7.将total_forks增加1
复制代码

  task_struct进程控制块与进程地址空间的联系:

  在task_struct结构体内的struct mm_struct成员执行内存区描述符的指针。在进程描述符中,还应该存储进程空间的页表信息,和将逻辑地址转换成页号和页内偏移地址所需的相关信息。

  通过总结可以得到:进程的创建的系统调用clone fork vfork都是调用do_fork实现的,而do_fork在做了一些参数检查之后。调用了copy_process函数,copy_process函数在进行安全性检查之后,使用dup_task_struct复制父进程的结构体。对新进程描述符的一些标志信息和时间信息进行初始化,之后将父进程的所有进程信息拷贝到子进程空间,包括IO、文件、内存信息等。然后,设置新进程的pid,将新进程加入进程调度队列中。子进程的eax设置为0,父进程则返回新进程的pid,所以在fork调用中,子进程返回的是0,父进程返回的是新进程的pid。详细代码分析,请参加附录。

你可能感兴趣的:(专辑8,---,嵌入式linux,C基础)