实验六-分析Linux内核创建一个新进程的过程
一.实验要求
1.更新内核并增添fork命令
2.跟踪分析进程创建的过程
进程创建分析:fork代码分析
dup_task_struct分析
copy_thread分析
copy_process分析
二.实验步骤
1.更新内核并增添fork命令:
首先要删除原有的menu,在github上下载新版本menu
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
向MenuOS中增加fork命令
cd menu
mv test_fork.c test.c
make rootfs
使用help查看现有命令,执行MenuOS>>fork
MenuOS>>help
MenuOS>>fork
2.启动gdb调试,并对主要的函数设置断点
(gdb)b sys_clone
(gdb)b do_fork
(gdb)b dup_task_struct
(gdb)b copy_process
(gdb)b copy_thread
(gdb)b ret_from_fork
三.总结
1. fork()
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 int main(int argc, char * argv[])
5 {
6 int pid;
7 /* fork another process */
8 pid = fork();
9 if (pid < 0) 出错处理
10 {
11 /* error occurred */
12 fprintf(stderr,"Fork Failed!");
13 exit(-1);
14 }
15 else if (pid == 0)
16 {
17 /* child process */ 子进程 pid=0时 if和else都会执行 fork系统调用在父进程和子进程各返回一次
18 printf("This is Child Process!\n");
19 }
20 else
21 {
22 /* parent process */
23 printf("This is Parent Process!\n");
24 /* parent will wait for the child to complete*/
25 wait(NULL);
26 printf("Child Complete!\n");
27 }
fork()允许用户态下创建新的进程, fork 创造的子进程复制了父亲进程的资源,包括内存的内容和task_struct内容,新旧进程使用同一代码段,复制数据段和堆栈段。。
2.do_fork
在 Linux 内核中,供用户创建进程的系统调用fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork(),这三个函数都是通过调用内核函数 do_fork() 来实现的。根据调用时所使用的 clone_flags 参数不同,do_fork() 函数完成的工作也各异。
3. copy_process
copy_process()主要完成进程数据结构,各种资源的初始化,调用了sched_fork,将其置为TASK_RUNNING。
4. copy_thread
copy_thread函数主要用于获取子进程寄存器信息的存放位置,并对子进程的thread.sp赋值,将来子进程运行,这就是子进程的esp寄存器的值。