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

实验六 分析 Linux 内核创建一个新进程的过程

一、实验原理

1、操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理。
2、linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状态和运行状态都是TASK_RUNNING。(这个表示它是可运行的,但是实际上有没有在运行取决于它是否占有 CPU )。
3、fork 被调用一次,能够返回两次。在父进程中返回新创建子进程的 pid;在子进程中返回 0。
4、调用 fork 之后,数据、堆、栈有两份,代码仍然为一份(这个代码段成为两个进程的共享代码段)。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。

二、实验步骤
1、打开实验楼系统,清空原来的menu文件夹,克隆一个新的menu
ls
cd ~/LinuxKernel
rm menu -rf 
git clone https://github.com/mengning/menu.git 

在这里插入图片描述

2、然后将test_fork.c文件改为test.c用以测试,再make一下,保证更新过
cd menu
mv test_fork.c test.c 
make rootfs

在这里插入图片描述

3、正常运行,输入help命令,发现可以使用fork函数

在这里插入图片描述

4、退出qemu界面,返回上衣文件夹LinuxKernel,输入qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s让MenuOs停下方便调试

在这里插入图片描述

5、打开另一个终端窗口进行gdb调试

在这里插入图片描述

6、正常连接内核后设置六个断点sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork

在这里插入图片描述

7、按c继续运行可得如下结果

在这里插入图片描述
在这里插入图片描述

三、实验总结

1、fork函数
库函数fork是用户态创建一个子进程的系统调用,实际上fork系统调用把当前进程又复制了一个子进程,也就是一个进程变成了两个进程,两个进程执行相同的代码,只是fork系统调用在父进程和子进程中的返回值不同。但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

2、do_fork
do_fork()主要完成了调用copy——process()复制父进程信息、获得pid、调用wake_up_new_task将子进程加入调度器队列等待获得分配CPU资源运行、通过clone_flags标志做一些辅助工作,其中copy_process()是创建一个进程内容的主要的代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值