switch_to:这是一个宏,有三个参数prev,next,last

局部变量prev,next:指向进程描述符的内存地址

首先明确的是:last和prev是同一个,用last只是为了理解方便,完全可以用两个参数prev,next。因为last就是prev

switch_to宏用于进程切换,给定了前一个进程结构体指针prev,以及需要切换到的进程结构体指针next,从prev切换到next.
但是,实际上,switch_to宏有三个参数,除了上面说的两个参数之外,还有一个last参数.而且使用switch_to宏的时候传入的prev和last都是同一个值,比如会这么调用这个宏:
switch_to(prev,next,prev).

这是为什么呢?

考虑一种场景,进程A切换到进程B,因为每个进程的空间是不同的,所以在切换之前,进程A的空间里prev=A,next=B,last=A.
一段时间之后,需要切换回到进程A,假设当前进程是C,那么对于C而言prev=C,next=A,last=C.

对比前后两种场景:
进程A切换前:prev=A,next=B,last=A
进程C切换前:prev=C,next=A,last=C

这时开始从进程C切换到进程A,注意到在切换之前switch_to宏将prev存放到了eax寄存器中,也就是在进程C切换到进程A之前,eax=C
切换之后,很显然,来到了进程A的空间,因此prev,next,last指针要回到进程A被切换出去之前的指向,因此prev=A,next=B,last=A,而eax的数据保持不变(这是在eax的内容覆盖A进程的堆栈的prev之前的情况)
在switch_to宏返回之前,将eax寄存器的数据存放到last中,因此,last=eax=C,其实也就是prev=C

注意,在宏里面,出现last的地方实质上就是prev。

当从C转回A的时候,A怎么知道它的上一个进程是哪一个呢?
    为了使你好理解,现在做如下假设:
    加入没有last这个参数,那么switch变成:switch_to(prev, next);
     这时候返回A进程后,prev指向它自己,next指向B,那么如何知道A的上一个进程是谁呢?就是不能够获取C的描述符。
    这时候我们加上last,switch_to(prev, next, prev);,最后一个参数是一个输出参数,那么当switch_to执行完毕后,prev就会变成进程C的描述符。
    这是通过movl %eax, last来实现的。
    关键的一点来了,为什么这个eax存的是C的描述符呢,这是由于在从C->A中的时候,movl prev, %eax,这个prev就是C。

我个人认为这样做是为了便于理解,不然的话,switch_to(prev, next);也可以实现上述功能,直接把prev这个参数即当输入参数,又当输出参数就可以了。

linux 内核的 switch_to原理的更多相关文章

  1. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

  2. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  3. 《Linux内核原理与分析》第九周作业

    课本:第八章 进程的切换和系统的一般执行过程 进行进程调度的时机 Linux内核通过schedule函数实现进程调度,schedule函数在运行队列中找到一个进程,把CPU分配给它 调用schedul ...

  4. 2017-2018-1 20179205《Linux内核原理与设计》第九周作业

    <Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多 ...

  5. 2017-2018-1 20179215《Linux内核原理与分析》第四周作业

    本次的实验是使用gdb跟踪调试内核从start_kernel到init进程启动,并分析启动的过程. 1.首先是在实验楼虚拟机上进行调试跟踪的过程. cd LinuxKernel qemu -kerne ...

  6. 2019-2020-9 20199317 《Linux内核原理与分析》第九周作业

    第8章  进程的切换和系统的一般执行过程 1  进程调度的时机 1.1  硬终端与软中断 进程调度的时机都与中断相关,中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序.中 ...

  7. 2019-2020-1 20199308《Linux内核原理与分析》第九周作业

    <Linux内核分析> 第八章 可执行程序工作原理进程的切换和系统的一般执行过程 8.1 知识点 进程调度的时机 ntel定义的中断类型主要有以下几种 硬中断(Interrupt) 软中断 ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  9. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

随机推荐

  1. Oracle 在约束中使用正则表达式

    ALTER TABLE mytest ADD CONSTRAINT CK_REG CHECK(REGEXP_LIKE(TEST, '^[0-9]{1,3}(\.[0-9]){0,1}$'));

  2. windows中git输错密码后不能重新输入的问题

    当输入密码错误后,git会把密码保存在windows的你的当前用户名的缓存中. 我们可以在控制面板中寻找到这个缓存,再删掉就可以了. 首先,打开“控制面板”,把“查看方式”改为“大图标”,再打开“用户 ...

  3. redis学习一 大体概述

    redis 命令查找:http://doc.redisfans.com/ 1,redis 技术简介以及疑问      redis是一个开源的,内存存储的数据结构服务器.可以用做数据库,高速缓存和消息队 ...

  4. Linux常用的编辑保存退出命令

    Vi Vim进入编辑后退出 按ESC后 1.保存退出 :wq :x 最快捷的方法:直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z.区别::wq 强制性写入文件并 ...

  5. linux命令-mount挂载umount卸载

    格式化完成之后想写数据 要先挂载 //////////////////////////////////////////////////////////////////// [root@wangshao ...

  6. Eclipse一步一步搭建SSM+Maven

          Eclipse 搭建SSM(Spring.Spring MVC .Mybatis)  利用Maven管理Jar包      一般而言,新的eclipse都已经集成了maven,如果没有那么 ...

  7. js实现导航栏的吸顶操作

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  8. HDU 6395(2018多校第7场1010)Sequence

    不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ...

  9. pecl的使用

    1. 安装方法 : pecl install packagename, 安装目录在/usr/local/php7/lib/php/extensions 例如:pecl install sealog 2 ...

  10. 15-struct(构造函数,重载)

    必须充分掌握struct的使用,包括其构造和重载函数的写法: #include <iostream> using namespace std; struct node { int x, y ...