博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux内核——进程切换宏switch_to
阅读量:4922 次
发布时间:2019-06-11

本文共 842 字,大约阅读时间需要 2 分钟。

  • 该宏有三个参数:prev, next, last。它们都是局部变量。

  prev:输入参数,变量值为旧进程描述符的地址。

  next:输入参数,变量值为新进程描述符的地址。

  last:输出参数,用来记录该进程是由哪个进程切换而来的,即保存 在当前进程之前 占用cpu的进程的 进程描述符地址。

 

  • 为什么需要last这个局部变量呢?

  因为:

  首先,记录前一进程的进程描述符地址,对进程切换是很有用的,具体什么用途,以后再说。

  其次,switch_to宏由就进程调用,在新进程结束,新进程如果想获取旧进程描述符地址,不能直接读取局部变量prev(因为prev存放在该宏调用者,即旧进程的内核栈中,新进程无法访问旧进程的内核栈),所以就需要一个输出参数将旧进程描述符地址传递给新进程(实现方法就是利用cpu寄存器%eax,在切换过程中该寄存器的值不变,也就是说,在旧进程中,将prev存入%eax,在新进程恢复执行后,将%eax的内容放入last)。

 

  • 该宏的实现过程

  1、将新旧进程描述符地址存放在cpu寄存器中

    mov prev,%eax

    mov next,%edx

  2、保存旧进程部分上下文

    pushl //eflags

    push %ebp

  3、进行栈切换

    mov %esp,prev->thread_info.esp

    mov (%edx)->thread_info.esp,%esp

  4、指令地址切换,执行流由旧进程进入新进程

    mov %eip或标签1的指令地址,prev->thread_info.eip

    push (%edx)->thread_info.eip

    跳入_switch_to()函数

  6、将旧进程描述符地址放入last变量

    mov %eax,last

转载于:https://www.cnblogs.com/ISeeIC/p/3625556.html

你可能感兴趣的文章
python_14(js)
查看>>
[Locked] Shortest Word Distance I & II & III
查看>>
微信小程序左滑删除功能
查看>>
Arraylist与linkedlist的区别
查看>>
运用BufferedWriter把数据写入文件
查看>>
spring MVC 如何获取session并实现传值到前台
查看>>
Mac键盘图标与对应快捷按键标志汇总
查看>>
android 通过post方式提交数据的最简便有效的方法
查看>>
关于swift中的常量和变量
查看>>
Elasticsearch
查看>>
拉近距离(洛谷_2136)——判断负环
查看>>
ajax请求返回null
查看>>
curl实现GET、POST请求
查看>>
实验二
查看>>
c++ c# java 调用 c++ 写的dll
查看>>
css经典布局—stick footer布局
查看>>
div学习之div中dl-dt-dd的详解
查看>>
当在hive中show table …
查看>>
随机森林(Random Forest)
查看>>
[转载]/etc/security/limits.conf解释及应用
查看>>