作业信息

这个作业属于哪个课程 <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():创建线程

 posted on 2020-11-17 01:06  20209313  阅读(135)  评论(0编辑  收藏  举报