作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第七周作业> |
这个作业的目标 | <分析Linux内核创建一个新进程的过程> |
作业正文 | https://www.cnblogs.com/matahh/p/14012929.html |
1.实验目的
围绕对Linux系统如何创建一个新进程进行。
仔细分析新进程的执行起点及对应的堆栈状态等。
总结部分需要阐明自己对“Linux系统创建一个新进程”的理解。
2.实验内容
在MenuOS里面增加一个命令fork,只需删掉menu,然后克隆一份新的,还要把test.c给覆盖掉,menu下面执行make roofts,编译运行出来就可以看到列表中增加了一个fork。
代码如下:
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
make rootfs
结果如下:
然后再开启第二个shell,进行gdb调试:
file linux-3.18.6/vmlinux
target remote:1234
b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_for //一堆断点
3.实验分析
Linux系统创建一个新进程:
进程的创建
1.进程的创建概览及fork一个进程的用户态代码
(1)进程的起源
道生一(start_kernel...cpu_idle)
一生二(kernel_init和kthreadd)
二生三(即前面的0、1、2三个进程)
三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)
(2)0号进程手工写,1号进程复制、加载init程序
(3)shell命令行是如何启动进程的
新进程的执行源于以下前提:
(1)dup_task_struct中为其分配了新的堆栈
(2)调用了sched_fork,将其置为TASK_RUNNING
(3)copy_thread中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的
(4)将ret_from_fork的地址设置为eip寄存器的值
(5)最终子进程从ret_from_fork开始执行
参考文章:(https://www.cnblogs.com/zhangchao0515/p/5339964.html)