Linux进程切换一般过程
实验环境
OS | Linux cj-virtual-machine 5.3.0-51-generic |
---|---|
虚拟机 | QEMU |
内核版本 | 5.3.4 |
调式方法 | GDB |
PS:调试环境安装请看上一篇博客汇编级理解Linux系统调用
fork系统调用过程
和普通系统系统调用对比
正常的⼀个系统调⽤都是陷⼊内核态,再返回到⽤户态,然后继续执⾏系统调⽤后的下⼀条指令。
fork和其他系统调⽤不同之处是它在陷⼊内核态之后有两次返回
,第⼀次返回到原来的⽗进程的位置继续向下执⾏,这和其他的系统调⽤是⼀样的。
在⼦进程中fork也返回了⼀次,会返回到⼀个特 定的点——ret_from_fork,通过内核构造的堆栈环境,它可以正常系统调⽤返回到⽤户态
_do_fork系统调用流程概述
源码在/linux/kernel/fork.c目录下,由于代码太多,只是大概了解
long _do_fork(struct kernel_clone_args *args) {
.....
//复制进程描述符和执⾏时所需的其他数据结构
p = copy_process(NULL, trace, NUMA_NO_NODE, args);
......
wake_up_new_task(p);//将⼦进程添加到就绪队列
.......
return nr;//返回⼦进程pid(⽗进程中fork返回值为⼦进程的pid)
}