本来想自己写的,但是发现了一篇十分优秀的博客

https://www.cnblogs.com/tradoff/p/5734582.html

system_call的源码解析:https://blog.csdn.net/tq02h2a/article/details/2934094?utm_source=blogxgwz3 了解调用进程的流程

理一理思路

通过内核栈来切换进程的流程

  用户态fork触发int80中断

    进入_system_call

      1.一些通用寄存器入栈保存(ds,es,fs)

      2.call  _sys_fork

        进入sys_fork

          1.通用寄存器压栈(gs,esi,edi,edx)

          2. copy_process建立一个新的进程,同时把返回值交给eax

      3.eax压栈,这个eax要交给res,父进程的eax(子进程pid)在父进程栈里,而子进程的eax(0)在子进程栈里。后面要修改eax的值了

      4.父进程被阻塞时执行reschedule:先把ret_from_sys_call压栈,然后call _schedule

         进入schedule

           1.时间片切换给新建的子进程

           2.switch_to

             进入switch_to

               1.保存当前进程栈帧

               2.各种通用寄存器压栈  

               3.切换pcb,重写TSS(重定位tss),切换内核栈,切换LDT

               4.通用寄存器恢复,要格外注意这里,pop出来的所有寄存器都是应该从子进程内核栈里弹出来的,所以在copy_process时,栈顶应该有这几个对应的通用寄存器

               到此为止已经进入子进程啦!

       下面就是ret_from_sys_call:

       5.通用寄存器恢复,和switch_to的第4步一样,这里恢复的通用寄存器也是子进程内核里探出来的,所以copy_process时,栈里要有对应的通用寄存器

       6.著名的iret实现从内核到用户的返回,同时res=eax

         1.如果是子进程返回,那么被压在内核栈里的eax=0

         2.如果是父进程返回,那么被压在内核栈里的eax=子进程pid  

到此为止,fork调用结束啦!

最后贴一张大神画的内核栈图

Linux0.11内核源码——内核态进程切换的改进的更多相关文章

  1. 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02

    百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  2. Linux0.11内核源码——内核态线程(进程)切换的实现

    以fork()函数为例,分析内核态进程切换的实现 首先在用户态的某个进程中执行了fork()函数 fork引发中断,切入内核,内核栈绑定用户栈 首先分析五段论中的第一段: 中断入口:先把相关寄存器压栈 ...

  3. 内核源码分析之进程地址空间(基于3.16-rc4)

    所谓进程的地址空间,指的就是进程的虚拟地址空间.当创建一个进程时,内核会为该进程分配一个线性的地址空间(虚拟地址空间),有了虚拟地址空间后,内核就可以通过页表将进程的物理地址地址空间映射到其虚拟地址空 ...

  4. 鸿蒙内核源码分析(进程回收篇) | 老父亲如何向老祖宗临终托孤 ? | 百篇博客分析OpenHarmony源码 | v47.01

    百篇博客系列篇.本篇为: v47.xx 鸿蒙内核源码分析(进程回收篇) | 临终前如何向老祖宗托孤 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  5. 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01

    百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  6. 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07

    百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...

  7. 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04

    百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  8. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  9. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03

    百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

随机推荐

  1. HTML--JS 多列求和

    <html> <head> <title>多列求和</title> <script type="text/javascript" ...

  2. 网络流强化-UVA10480

    做这道题,自己先是想了好几种找被割的边的方法——都被否决了. 后来发现是最小割:只要一条边的两端在不同的点集里面就代表是被割掉的满流边(这些满流边的流量和等于最大流的流量与最小割的权值和). 但是之前 ...

  3. spring容器、spring MVC容器以及web容器的区别

    本文转载自 https://www.cnblogs.com/xiexin2015/p/9023239.html 说到spring和springmvc,其实有很多工作好多年的人也分不清他们有什么区别,如 ...

  4. Item-Based Collaborative Recommender System

    与User-Based Collaborative Recommender System认为‘类似的用户会对同一个item给出类似的打分’不同,Item-Based Collaborative Rec ...

  5. linux下的sleep()和usleep()的使用和区别

    函数名: sleep头文件: #include<windows.h> // 在VC中使用带上头文件              #include<unistd.h>    // ...

  6. PHP 是怎么接收到请求的?

    本篇文章主要描述一下几点 ● nginx 怎么转发请求 给 PHPFPM? ● CGI 和 FastCGI 到底是个什么玩意? ● PHPFPM 是什么?有什么作用? 简单场景描述 在浏览器上访问一个 ...

  7. 前后端分离 token和cookie对比

    HTTP协议本身是无状态的,所以需要一个标志来对用户身份进行验证 1.cookie 用户登录成功后,会在服务器存一个session,同时发送给客户端一个cookie,这个cookie里面有唯一标识该用 ...

  8. Jmeter录制web和app脚本

    前置: 一.已经安装了jmeter 步骤: 一.打开jmeter,右键测试计划-->添加添加线程组-->线程-->线程组,新建线程组 二.右键线程组-->添加-->逻辑控 ...

  9. [Linux] 015 用户管理命令

    1. 用户管理命令:useradd 命令名称:useradd 命令所在路径:/bin/sbin/useradd 执行权限:root 语法:useradd 用户名 功能描述:添加新用户 范例: $use ...

  10. bfs(最短路径)

    链接:https://ac.nowcoder.com/acm/contest/993/F来源:牛客网 Farmer John is leaving his house promptly at 6 AM ...