分析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有了一定了解,认识了进程创建的具体过程。