分析Linux内核创建一个新进程的过程


分析Linux内核创建一个新进程的过程

沙雨济

原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

一、实验目的

阅读理解task_struct数据结构;分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构;使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone,验证对Linux系统创建的理解;进程是从哪里开始执行的。

 

二、实验内容

首先,进入实验楼环境,进入LinueKernel文件。

技术分享


然后,删除menu,clone一份新的,再将test.c覆盖为fork.c,make rootfs。

技术分享

进入menuOS,实现fork函数功能。

技术分享

请来大小S,进行设置断点:sys_clone, do_fork, dup_task_struct, copy_process, copy_thread。(sorry,真的好卡,设置断点的地点未达到,原理同前实验。)

跟踪分析一个fork系统调用内核处理函数sys_clone,结束实验。

 

三、 实验总结(含分析)

task_struct数据库结构很庞大,Linux进程的状态与操作系统原理中描述的进程状态有所不同,比如就绪态和运行态都是TASK_RUNNING。简略的双向循环链表。程序创建的进程具有父子关系

 

系统调用内核处理函数sys_clone创建一个新进程,通过调用do_fork来实现进程的创建,Linux通过复制父进程的PCB来创建进程,再对其进行相应修改。

 

子进程在内核中fork返回,在内核中开始执行,当子进程开始运行的时候,其ret_from_fork将做一系列工作,然后返回到用户态。 

 

通过对本章的学习,我对于task_struct有了一定了解,认识了进程创建的具体过程。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。