作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第七周作业> |
这个作业的目标 | <分析Linux内核创建一个新进程的过程> |
作业正文 | https://www.cnblogs.com/dyyblog/p/14001867.html |
一.进程描述
基本概念
程序:
为了完成特定任务的一系列指令的有序集合。存储在磁盘上,程序 : 代码 + 数据。
进程:
程序的一次动态执行过程,存储在内存中,每个程序都有自己的状态,每个进程都有自己的虚拟地址空间,进程 : 代码 + 数据 + 堆栈 + PCB。
PCB (进程控制块)
pid 进程标识符,pwd 进程标识符,ppid 父进程进程号
进程状态转换
fork注意点:
-
1 、 fork 父子进程交替进行
-
2 、父进程死亡,子进程将变成孤儿进程,由 1号 进程领养
-
3 、 子进程死亡,成为僵尸进程
二.跟踪分析进程创建过程
删除menu,在github上克隆一份新的,
git clone https://github.com/mengning/menu.git
把test.c覆盖,在menu下执行make rootfs
启动内核,连接gdb
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread和ret_from_fork处设置断点
总结
设定完断点后执行fork,发现只输出了一个命令描述,后面没有执行,而是停在了sys_clone这里。如果继续执行,会停在do_fork的位置,从do_fork继续执行,停在copy_process,继续执行,停在dup_task_struct函数。进入dup_task_struct函数内部,将当前进程内核堆栈压的那一部分寄存器复制到子进程中,以及赋值子进程的起点,最后运行到ret_from_fork。