作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第七周作业> |
这个作业的目标 | <分析进程的创建过程> |
作业正文 | ... https://i.cnblogs.com/posts/edit;postId=13992141 |
实验:gdb追踪do_fork函数
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
make rootfs
cd LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.omg -s -S
gdb
file linux-3.18.6/vmlinux
target remote:1234
b start_kernel
b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_fork
b system_call
二、分析进程创建过程
(一)描述
1、关键部分:进程内容、进程状态定义与转换、进程管理结构:双向链表
- 进程描述符 struct task_struct
成员说明:
-
进程状态与转换
-
进程管理结构:双向链表struct list_head
(二)进程创建
1、0号进程初始化,放在双向链表头
2、内存管理
复制进程描述符、复制其它进程资源(采用写时复制技术)、分配子进程的内核堆栈并对内核堆栈关键信息进行初始化。
3、通过fork复制和生成其他进程
保护中断现场,进入中断向量,查找并执行系统调用fork:
复制pcb,创建内核堆栈,分配页面,
修改pcb(包括文件信息,内存信息等等,其中特别重要的是,查找父进程和子进程的内存堆栈,复制父进程的部分内核堆栈到子进程,找到子进程的第一条指令地址,这样以来,子进程就是一个独立的进程),最ret_from_fork,这个命令最后会跳到syscall_exit,此时系统调用结束,中断结束,恢复中断现场,返回用户态。
(三)三种调用do_fork函数的函数比较
具体看:
分析Linux内核创建一个新进程的过程
1、差异
fork、vfork、clone这三种系统调用的不同:参数不同、目的不同
相同:都调用do_fork函数
2、调用关系:
libc fork() -> system_call -> sys_clone() -> do_fork()
fork():子进程拷贝父进程的数据段,代码段,父子进程的执行次序不确定;
vfork():创建的子进程与父进程共享数据段,而且子进程将先于父进程运行;
clone():创建线程