第六周
阅读学习教材「庖丁解牛Linux 分析 」第6章,有问题优先使用chatgpt等AI工具。或者到蓝墨云班课中提问,24小时内回复,鼓励解答别人问题,提问前请阅读「如何提问」。
教材深入学习关注豆列「Linux内核及安全」。
学习蓝墨云班课中第六周视频「扒开系统调用的三层皮?(下)」,并完成实验楼上配套实验五。,注意从下往上看。基于树莓派或其他平台完成ARM相关内容。
在本周日晚12:00前发学习博客(标题 学号《Linux内核原理与分析》第六周作业),重点是遇到的问题和解决方案内容涵盖教材学习和视频,格式用Markdown。不按时交作业会扣分。
fork()系统调用在Linux中用于创建新的进程。在内核中,这实际上是通过sys_clone函数来完成的。sys_clone是更底层、更通用的进程和线程创建工具,而fork()只是其特定的使用情况。
创建和修改task_struct数据结构:
当调用fork()时,会创建一个新的进程。Linux系统中,每个进程都对应一个task_struct数据结构。这个数据结构存储了进程的所有信息,如进程状态、进程ID、父进程ID、堆栈、调度信息等。
sys_clone会做以下几件事情:
分配新的task_struct结构体。
根据调用sys_clone时传入的标志来复制或分享资源,如文件描述符、内存空间等。
为新进程设置堆栈。
设置新进程的状态为可运行。
将新进程插入到调度队列。
使用gdb跟踪sys_clone:
使用一个Linux虚拟机环境,如实验楼所提供的。
安装相应的内核调试信息包和gdb。
使用gdb启动一个新的进程,并断点设置在sys_clone。
当断点触发,你可以查看和跟踪函数的执行,了解task_struct如何创建和修改。
分析 Linux 内核创建一个新进程的过程
首先打开实验楼,进入LinuxKernel目录下,进入menu目录
1.编辑test.c如下
然后使用make rootfs
2.test.c中添加如下内容
MenuConfig("fork","Fork a new process",Fork);
3.利用gdb跟踪调试,在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork设置断点
设置完断点后continue,执行fork,会发现进程会在sys_clone停下,继续执行才会到do_fork的位置,依次到后面位置。
三、实验总结
在本次实验中,深入探索了Linux的fork()系统调用及其在内核中的实现sys_clone。我们了解了如何通过sys_clone创建和修改task_struct数据结构,这是每个进程的核心描述信息。通过使用gdb,能够跟踪sys_clone的执行,从而更加深入地了解进程的创建过程。最后,学习了新进程从何处开始执行,以及为什么它可以从这个地方顺利执行下去。这个实验为我们提供了深入了解Linux进程管理的宝贵机会。