【Linux进程切换】源码理解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)
 }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值