以fork()函数为例,分析内核态进程切换的实现

首先在用户态的某个进程中执行了fork()函数

fork引发中断,切入内核,内核栈绑定用户栈

首先分析五段论中的第一段:

中断入口:先把相关寄存器压栈保存,然后call真正的fork系统调用

当前进程被阻塞或时间片到后,使用调度算法进行线程切换

reschedule的展开:其实是把ret_from_sys_call的地址压栈(作用之后就会看到),然后再去进行调度算法

此时的内核栈:??2后是内核当前的esp指针

第五段和调度算法:执行完调度算法后,即cpu已经调度到新的进程,此时从内核态返回用户态,这时就要用到ret_from_sys_cal

注意eax里存的是返回值,返回的位置是新的进程

中间三段论:

switch_to:把cpu从一个内核栈调度到另一个内核栈,即找到目标进程的tcb,这样就完成了一次切换。

  但是linux0.11用了tss方式,即用tcb保留当前进程的运行情况(保留下所有相关寄存器的值,可以理解为运行现场的照相),然后把新的进程的tcb保存的运行现场扣给所有寄存器

内嵌汇编注释:

:新TSS描述符赋值给TR(32位)

:把TR赋值给tmp.b

:跳转到tmp.a执行,ljmp是长跳转指令,需要64位的目标操作数

因为fork的工作时建立一个新的进程

copy_process函数里需要把父进程的所有寄存器信息赋值给子进程(子进程目前和父进程是一样的)

创建子进程的内核栈和绑定的用户栈

给p分配一页内核空间,esp0指向栈顶,由于子进程和父进程共用用户栈,所以绑定的用户栈和父进程也一样

copy时的一些细节:

  因为是fork所以新的tss先复制旧的tss

  然后进程切换,内存也跟着切换

  eax要变成0(之后会说)

  因为新的进程需要被调度,所以状态设置为0

  同时也必须填写两个栈

fork的一些特别之处

1.返回值有两个:父进程非0,子进程为0,(res和eax是绑定的,子进程的eax在tss中被置为0了,而父进程的eax在第一段里被压栈保存了,返回值是子进程pid)

2.子进程在被创建后,返回到用户态运行时会阻塞父进程,那么父进程什么时候返回?是子进程阻塞或退出后cpu调度到父进程时,通过iret返回到父进程对应的用户态的

那么调用fork的结果就是:父进程等待,子进程运行

exec系统调用可以调用cmd命令:exec返回前,子进程执行和父进程一样的代码,返回后就,子进程就开始调用cmd,和父进程不一样了

 那么如何才能让子进程找到a并开始运行?

调用do_execve后,a在编译链接时会产生一个链接地址(入口地址entry),通常a的第一句就是a的入口地址,从这个入口地址进入就可以按指令运行a了

所以exec就是找到a的入口地址,将其赋值给ret作为用户栈的返回地址返回,那么返回后就可以直接从a入口地址开始运行a了

Linux0.11内核源码——内核态线程(进程)切换的实现的更多相关文章

  1. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  2. linux0.11内核源码——用户级线程及内核级线程

    参考资料:哈工大操作系统mooc 用户级线程 1.每个进程执行时会有一套自己的内存映射表,即我们所谓的资源,当执行多进程时切换要切换这套内存映射表,即所谓的资源切换 2.但是如果在这个进程中创建线程, ...

  3. Linux0.11内核源码——内核态进程切换的改进

    本来想自己写的,但是发现了一篇十分优秀的博客 https://www.cnblogs.com/tradoff/p/5734582.html system_call的源码解析:https://blog. ...

  4. v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

  5. v80.01 鸿蒙内核源码分析(内核态锁篇) | 如何实现快锁Futex(下) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(内核态锁篇) | 如何实现快锁Futex(下) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

  6. 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 百篇博客分析OpenHarmony源码 | v42.02

    百篇博客系列篇.本篇为: v42.xx 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  7. 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03

    百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  8. 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 祝新的一年牛气冲天 ! | v32.02

    百篇博客系列篇.本篇为: v32.xx 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  9. 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07

    百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...

随机推荐

  1. Java 内部类“覆盖"

    Think in Java  P269 如果子类中的内部类和父类中内部类一样,这好像子类内部类“覆盖”了父类的内部类,但其实没有代表着什么. public class BigEgg extends E ...

  2. ElasticSearch2.2.0安装

    一.ElasticSearch2.2.0安装 1.下载ElasticSearch2.2.0安装包 https://download.elastic.co/elasticsearch/elasticse ...

  3. Vagrant 手册之 Vagrantfile - 机器设置 config.vm

    原文地址 配置的命名空间:config.vm config.vm 中的设置修改 Vagrant 管理的机器的配置. 1. 可用的设置项 config.vm.boot_timeout Vagrant 等 ...

  4. POJ1742 coins 动态规划之多重部分和问题

    原题链接:http://poj.org/problem?id=1742 题目大意:tony现在有n种硬币,第i种硬币的面值为A[i],数量为C[i].现在tony要使用这些硬币去买一块价格不超过m的表 ...

  5. CHEVP算法(Canny/Hough Estimation of Vanishing Points)

    这个算法是汪悦在 Lane detection and tracking using B-spline中提出来的.他在这篇论文中主要用的是B-spline模型,这个模型的主要优点是鲁棒性好,可以针对不 ...

  6. 一些常见的js校验

    今天有时间来总结一下那些常用的js校验: vernull = function(value){//非空校验 if(value.trim(value).length == 0){ return fals ...

  7. 【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器

    下面我们进入双端口RAM和多模块存储器的学习.这是提高我们的存储器的访存速度的一些措施. 我们之前已经讲过我们的主存和CPU是进行连接的,那么这就导致了一个问题就是说,随着我们现代科技的发展,计算机的 ...

  8. GeneXus笔记本—常用函数(中)

    这篇文章是接着上一篇 常用函数(上)来写的 上次写到了Format 这个函数 我们继续接着这个往下来好了(づ ̄ 3 ̄)づ  还是一样 函数列表在此 https://wiki.genexus.com/c ...

  9. Java 时间类 Date 和 Calendar

    在项目中获取一个yyyy-MM-dd HH:mm:ss格式的时间字符串 package org.htsg.kits; import java.text.SimpleDateFormat; import ...

  10. C Primer Plus 学习 第三章

    这里只记录我自己以前不懂得地方,明白的地方就略过了 位  字节  字 位    0,1 字节  8位  也就有8位0,1的组合   2的8次方的组合 字      设计计算机时给定的自然存储单元.8位 ...