2021-2022-1 20212810《Linux内核原理与分析》第七周作业

实验六-分析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寄存器的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值