一、分析 Linux 内核创建一个新进程的过程
1、阅读理解 task_struct 数据结构
2、分析 fork 函数对应的内核处理过程 sys_clone,理解创建一个新进程如何创建和修改 task_struct 数据结构
3、使用 gdb 跟踪分析一个 fork 系统调用内核处理函数 sys_clone ,验证自己对 Linux 系统创建一个新进程的理解, 特别关注新进程是从哪里开始执行的?为什么从那里能顺利执行下去?即执行起点与内核堆栈如何保证一致。
4、根据本周所学知识分析 fork 函数对应的系统调用处理过程
二、实验
1、首先重新编译LinuxKernel中的menu,再将test_fork.c覆盖在运行程序test.c上
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c//在MenuOS中增加fork命令,并覆盖掉test.c文件
make rootfs
MenuOS>>help
可以发现help中已经有fork指令。
2、激活连接
首先建立连接
fork成功调用。
3、使用gdb对fork()进行添加断点分析
4、
"fork" 函数在 Linux 内核中被用于创建新进程。实际上,它是一个系统调用,主要任务是复制当前父进程的状态,以创建一个新的子进程。这个子进程在创建后,会与父进程拥有相同的代码和数据,但它们运行在不同的进程空间中。
"fork" 函数的系统调用过程包括多个内核函数,其中最重要的是 "do_fork" 函数。它负责完成子进程的创建和初始化,并调用 "copy_process" 函数来复制父进程的关键数据结构。这些数据结构包括文件描述符表、内存映射、信号处理程序等。这个复制过程确保了子进程继承了父进程的核心状态。
此外,还有一个重要的函数叫做 "copy_thread"。它的主要任务是复制内核堆栈的内容,以确保新进程拥有独立的内核堆栈。这是非常重要的,因为它确保了父进程和子进程在执行期间不会相互干扰。
总之,"fork" 函数是 Linux 内核中的一个关键系统调用,用于创建新进程并继承父进程的状态,从而为多进程编程提供了基础。