目录

进程切换关键代码

上下文切换函数定义

上下文切换函数调用

进程上下文切换整体流程

proc_run执行流程

jmp switch_to如何改变了指令控制流程

执行jmp switch_to指令时,栈情况

进程上下文切换三个过程

第一阶段,跳转到switch_to函数入口

第二阶段,保存from上下文

第三阶段,恢复to上下文


进程切换关键代码

上下文切换函数定义

void switch_to(struct context *from, struct context *to);
.text
.globl switch_to
switch_to:                      # switch_to(from, to)# save from's registersmovl 4(%esp), %eax          # eax points to frompopl 0(%eax)                # save eip !poplmovl %esp, 4(%eax)movl %ebx, 8(%eax)movl %ecx, 12(%eax)movl %edx, 16(%eax)movl %esi, 20(%eax)movl %edi, 24(%eax)movl %ebp, 28(%eax)# restore to's registersmovl 4(%esp), %eax          # not 8(%esp): popped return address already# eax now points to tomovl 28(%eax), %ebpmovl 24(%eax), %edimovl 20(%eax), %esimovl 16(%eax), %edxmovl 12(%eax), %ecxmovl 8(%eax), %ebxmovl 4(%eax), %esppushl 0(%eax)               # push eipret

上下文切换函数调用

struct context {uint32_t eip;uint32_t esp;uint32_t ebx;uint32_t ecx;uint32_t edx;uint32_t esi;uint32_t edi;uint32_t ebp;
};
void proc_run(struct proc_struct *proc)
{L1: local_intr_save(intr_flag);L2: switch_to(&(prev->context), &(next->context));L3: local_intr_restore(intr_flag);
}

进程上下文切换整体流程

proc_run执行流程

void proc_run(struct proc_struct *proc)
{L1: local_intr_save(intr_flag);L2: switch_to(&(prev->context), &(next->context));L3: local_intr_restore(intr_flag);
}

jmp switch_to如何改变了指令控制流程

CPU执行指令只靠CS:IP两个寄存器,这条指令的执行最终改变了什么呢?其实关键点在于jmp指令改变了当前的IP值,用个图解释这个原因。等待下次执行指令的时候,CPU通过IP寄存器获得当前执行的指令movl 4(%esp), %eax,这就完成了指令跳转。

执行jmp switch_to指令时,栈情况

进程上下文切换三个过程

在第2节中,分析了proc_run函数执行的整体流程,在这里将进一步分析switch_to汇编代码。

void switch_to(struct context *from, struct context *to);
.text
.globl switch_to
switch_to:                      # switch_to(from, to)# save from's registersmovl 4(%esp), %eax          # eax points to frompopl 0(%eax)                # save eip !poplmovl %esp, 4(%eax)movl %ebx, 8(%eax)movl %ecx, 12(%eax)movl %edx, 16(%eax)movl %esi, 20(%eax)movl %edi, 24(%eax)movl %ebp, 28(%eax)# restore to's registersmovl 4(%esp), %eax          # not 8(%esp): popped return address already# eax now points to tomovl 28(%eax), %ebpmovl 24(%eax), %edimovl 20(%eax), %esimovl 16(%eax), %edxmovl 12(%eax), %ecxmovl 8(%eax), %ebxmovl 4(%eax), %esppushl 0(%eax)               # push eipret

第一阶段,跳转到switch_to函数入口

第二阶段,保存from上下文

核心,切换到from的context中,并将当前的EIP保存到from.context.eip中,这样完成进程控制流的保存。

第三阶段,恢复to上下文

核心,切换至to的context中,将to.context.eip放入栈的函数返回值中,这样切换到另外一个进程控制流。

ucore进程上下文切换关键代码分析相关推荐

  1. Blog5 无监督深度关键短语生成——关键代码分析3

    2021SC@SDUSC 附所有代码链接:https://github.com/Jayshen0/ Unsupervised-Deep-Keyphrase-Generatio 本篇分析代码模块为:ex ...

  2. linux进程上下文切换,Linux 性能分析总结之 CPU 上下文切换(二)

    0x00 前言 上一篇笔记中我讲到了,在寻找 CPU 的性能瓶颈的问题的时候,首先会查看整台机器的平均负载是否高,然后再使用 pidstat 等工具判断到底是哪种情况导致的平均负载升高,主要情况有三种 ...

  3. Blog3 无监督深度关键短语生成——关键代码分析1

    2021SC@SDUSC 附所有代码链接:https://github.com/Jayshen0/ Unsupervised-Deep-Keyphrase-Generatio 本篇分析代码模块为:ex ...

  4. json2jsoncpp 关键代码分析1

    j2jc有个高级功能就是实现从一个json字符串自动生成对象的功能 她主要是通过一个做一个map,实现类名字符串对应new对象的函数,通过字符串调用相对应的new类的函数(见string2object ...

  5. <2021SC@SDUSC>博客(5)山东大学软件工程应用与实践JPress代码分析(四)

    2021SC@SDUSC 前言 在前面三篇文章中,我对 JPress 项目的基础框架 JFinal 和 JBoot 在使用层面进行了拆解与分析.在接下来的文章中,我将在代码层面对 JPress 项目中 ...

  6. Miari部分代码分析

    关于Mirai僵尸病毒攻击分析报告 前言 2016年10月21日,美国东海岸地区遭受大面积网络瘫痪,其原因为美国知名域名解析服务提供商DYN公司当天受到强力的DDoS攻击.该厂商为Github.Twi ...

  7. vin-slam中调用ceres库内部代码分析与性能优化

    vin-slam中调用ceres库内部代码分析与性能优化 1,vin-slam中后端参数优化调用流程代码 2,ceres内部的求解流程(未完待续) 首先,很抱歉前几次上传的关于一些图像算法代码不全,主 ...

  8. Linux kernel 3.10内核源码分析--进程上下文切换

    一.疑问 进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换. 进行上下文切换时,有一些问题不太容易理解,比如: 1.进程上下文切换必然发生在内核态吗? 2.上下文切换后原 ...

  9. Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...

    @ 实验环境 OS Linux cj-virtual-machine 5.3.0-51-generic 虚拟机 QEMU 内核版本 5.3.4 调式方法 GDB PS:调试环境安装请看上一篇博客汇编级 ...

最新文章

  1. visual2017中给C#项目添加配置文件
  2. 一些简单的SQL语句
  3. C#生成pdf的源代码
  4. 来看看如何使用策略模式干掉讨厌的 if else
  5. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?
  6. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法
  7. 图的根节点-数据结构作业。。
  8. c++中的左值与右值
  9. break和continue理解
  10. java to oc_急急急!各位大神:一段JAVA代码转OC代码!
  11. 【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)
  12. 后缀数组模板 hdu1403
  13. Java一个简单的Employee类
  14. 【破解】PyCharm2018专业版激活(激活到2100年)
  15. python arp断网攻击_arp断网攻击,手把手教你arp断网攻击怎么解决
  16. 宜早不宜晚,使用思维导图训练孩子的逻辑思维!
  17. pytorch入门(二):数据加载和处理
  18. 嵌入式linux ASoC架构声卡驱动开发
  19. 汤森路透 Thomson Reuters--使用多模型数据库ArangoDB 打造快速安全的简单视图分析...
  20. 云计算机的云是指什么,什么是云计算(Cloud Computing)、如何简单理解云计算? —白绿蓝信息科技...

热门文章

  1. 夯实密码基础服务,服务上层应用
  2. 1、Transact-SQL 语言基础
  3. 私域流量运营之增长运营:用户运营实战与行为数据洞察,私域流量运营者必修课!...
  4. 用一台windows系统电脑操作另一台linux电脑
  5. 大数据技术原理与应用(林子雨)MOOC作业与检验答案
  6. Ubuntu18 安装ROS-Melodic及常见配置
  7. Java面向对象程序设计 - 清览云题库
  8. SSM-SpringMVC过滤器
  9. 计算机导论课程论文标题大全,计算机导论课程论文大纲格式模板 计算机导论课程论文大纲怎么写...
  10. Windows系统读写ext2/3/4文件系统的工具「ext2fsd」