【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套

上一篇文章学习了任务门的概念:任务门—任务切换。主要学习了以下内容:

  • 使用任务门进行任务切换的一般工作原理(和中断有关的任务切换)

本篇文章接着上一篇文章学习以下内容:

  • 利用jmp进行任务切换
  • 利用call进行任务切换
  • jmp、call与任务门的中断嵌套三者之间的区别与联系

注意:和中断有关的任务切换的详细原理是在后面的文章中会讲解。本文主要还是学习使用call、jmp和iret指令发起的任务切换。

1、回顾

在学习jmp、call与iret指令发起的任务切换之前,我们来回顾上一篇文章所学。

我们知道,当中断发生时,可以执行常规的中断处理过程,也可以进行任务切换。尽管性质不同,但它们都需要使用iret指令返回。只不过前者返回到同一任务的不同代码段;后者返回到被中断的那个任务。那么处理器是如何体现这两种截然不同的返回类型呢?

如下图是32位的标志寄存器EFLAGS。它有一个NT位。意思是嵌套任务标志。

在这里插入图片描述

每个任务的TSS中都有一个任务链接域(指向前一个任务的指针),可以填写为前一个任务的TSS描述符选择子。如果当前任务的EFLAGS的寄存器的NT位为1,则表示当前正在执行的任务是嵌套与其他任务,并且能够通过TSS的任务链接域的指针返回到前一个任务。

对于新任务的处理是,要把老任务的TSS描述符选择子填写到新任务的TSS中的任务链接域,同时,将新任务的EFLAGS寄存器的NT位置1,以允许返回到前一个任务机械厂执行。同时,还要把新任务的TSS描述符的B位置1(忙)。

无论何时,只要处理器碰到iret指令,它都会检查NT位,如果NT位是1,表明当前任务只需偶一能够执行时因为它中断了被的任务,因此应该返回到之前被中断的任务去执行。如果NT=0,表明是一般的中断过程。

2、CALL指令与JMP指令

除了使用中断引发任务切换,还可以使用远过程调用指令CALL或者远跳转指令JMP直接发起任务切换。在这两种情况下,CALL与JMP指令的操作数是任务的TSS描述符的选择子或者任务门。比如以下两条指令:

call 0x0010:0x00000000
jmp  0x0010:0x00000000

当处理器执行这两条指令的时候,首先用指令中给出的描述符选择子访问GDT,分析它的描述符类型。将会有如下几种情况发生:

  • 如果是一般的代码段描述符的话,就按普通的段间转移的规则执行
  • 如果是调用门,按调用门的规则来执行
  • 如果是TSS描述符或者任务门的话。则执行任务切换

注意,如果是进行任务切换的话,后面的32位偏移量将会被忽略。原因是执行任务切换时,所有处理器的状态都可以从TSS中获得。

任务门可以安装在中断向量表中,也可以安装在GDT中或者LDT中。

如果是用于发起任务切换,那么call指令与jmp指令有什么不同的呢?

  1. 使用call指令发起的任务切换,类似于中断发起的任务切换。这就是说由call指令发起的切换时嵌套的,当前任务(就任务)TSS描述符法人B位保持原来的1不变,EFLAGS寄存器的NT位也不发生变化;新任务的TSS描述符的B位置1,EFLAGS寄存器的NT位也置1,表示此类任务是嵌套于其他任务中。同时TSS任务链接域的内容改为旧任务的TSS描述符选择子。

如下图是嵌套任务切换的一个图示过程:

在这里插入图片描述

  • 当任务1开始执行时。其TSS描述符的B位是1,EFLAGS寄存器的NT位是0,不嵌套于其他任务
  • 当任务1转换到任务2后,任务1仍然为忙,EFLAGS寄存器的NT位不变(在其TSS中);任务2也变为忙,EFLAGS寄存器的NT位变为1,表示嵌套于任务1中,同时将任务1的TSS描述符选择子复制到任务2的TSS链接域
  • 最后将任务2切换到任务3,过程与任务1切换到任务2是一样的。
  • 用call指令发起的任务切换,可以通过iret指令返回到前一个任务。返回到前一个任务后,当前任务(旧任务的EFLAGS的NT位以及TSS的B位恢复为0)
  1. 和call指令不同,jmp指令发起的任务切换不会形成任务之间的嵌套关系。执行任务切换时,当前任务(旧任务)TSS的描述符的B位请0,变为非忙态,EFALGS寄存器的NT位不变。新任务的TSS的B位置1,EFLAGS寄存器的NT位保持从TSS中加载的状态不变。

3、任务的不可重入性

任务是不可重入的

任务的不可重入的意思是,执行任务切换时,将要切换到的新任务此时的状态不能为忙。已经在忙了,没法再让它忙。有以下两种典型情况:

  • 执行任务切换时,新任务不能是当前任务自己
  • 如上述嵌套任务切换的示意图此刻的状态,不能从任务3切换到任务1或者任务2

处理器是通过TSS的B位来检测重入的。因中断,iret,call,jmp指令发起的任务切换时,处理器固件会检测新任务的TSS的B位,如果该位为1,则处理器不允许这样的任务切换。

4、任务切换时的几种方法总结

处理器用以下四种方法将控制转移到其他任务

  • 当前程序、任务或者过程,执行jmp或者call指令,将控制转移到GDT内的某一个TSS描述符
  • 当前程序、任务或者过程,执行jmp或者call指令,将控制转移到GDT或者LDT内的某一个任务门
  • 一个异常或者中断发生时,中断号指向中断描述符表内的任务门
  • 在EFLAGS寄存器的NT位置1的情况下,当前任务执行了一个iret指令。

jmp、call、iret指令或者异常和中断是程序重定向的机制,它们所引用的TSS描述符或者任务门,以及EFLAGS寄存器NT标志位的状态,决定了任务切换是否,以及如何发生。

以下给出一个表格:不同任务切换方法对B位、NT位和任务链接域的影响

在这里插入图片描述

5、总结

本文主要学习关于任务切换的一些方法:jmp,call,以及中断切换,这三者之间的区别。很明显,call指令类似于中断引起的切换,jmp指令就不同。同时注意iret指令执行时处理器大概都需要执行哪些指令(视不同的状态而做出不同的反应)。

详细的内容还是要参考原书籍,这里只是做一个简单的总结。

学习探讨加个人:
qq:1126137994
微信:liu1126137994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Phone 7 开发 31 日谈——第22日:应用?还是 游戏?

本文是“Windows Phone 7 开发 31 日谈”系列的第22日。 昨天,我发了一篇极长的关于Silverlight Toolkit for Windows Phone的文章。今天的会短一些,但却非常珍贵。我会讨论你的应用程序设置中非常细微但很重要的设置:类别(Genre&…

《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos...

1. 在WinDbg下载入01MDASample.exe 2. 执行 sxe ld mscorwks.dll 该命令的作用是在进程载入mscorwks之后停下来 3. 执行 g 可见程序在载入mscorwks.dll 之后停下来了 4. 执行 .loadby sos.dll mscorwks 转载于:https://www.cnblogs.com/charrli/archive/2010/12/25/1916964.h…

转载并学习实现三重DES加密解密代码(一)

作者:finallyliuyu 出处:博客园 声明:此篇博文代码来自于邹德强先生。由于目前找到的版本是残缺版,所以我又进行了补全。读一份好代码,可以领略到作者的编程风格和语言驾驭能力,同时又能从其中汲取养分。现将我所修改后…

【OS学习笔记】三十 保护模式九:段页式内存管理机制概述

上几篇文章学习了任务切换相关知识,如下: 【OS学习笔记】二十六 保护模式八:任务门—任务切换【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 今天继续学习保护模式下的分页机制。本篇…

真人拳皇项目第六次Scrum总结——史经浩

今天,我们组开始了正式的编码阶段,前期plan的时候天马行空,现在是脚踏实地的coding了。在Scrum上,大家sync了一下各自的进展,如下: 今天 进度 问题及解决 明天 田飞 work item 37528:DirectX动画的de…

【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解

上一篇文章学习了:保护模式九:段页式内存管理机制概述 本篇文章接着学习以下内容: 页目录概念页表概念页目录、页表与页之间的关系虚拟地址(线性地址)到物理地址的具体变换过程。 1、页目录、页表和页的对应关系 第…

使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)...

值此新年即将到来之际,在这献上今年最后一篇文章. 产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太…

一款研发管理软件的对象标签介绍

如果你了解WIKI,WIKI中的所有信息链接以标签的方式网状关联。TOPO系统中实现了完整的TAG功能,区别于目前市面上的其他类似管理系统,TOPO系统中实现的标签功能更加彻底和全面,例如完全用户自定义TAG,系统中所有管理对象…

【OS学习笔记】三十四 保护模式十:中断和异常区别

上几篇文章学习了分页机制的一些原理: 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异常的概念。本文主要学习中断与异常的…

记录一次文件迁移

事情的经过是这样子的!数据库A表添加一条记录,**系统中B目录下就会多出5n个文件。随着系统运行3年多,B目录中的文件数已高达2M多,而这些文件恰恰又是用户高度频繁访问的。于是问题就来了,一方面是用户访问文件速度变慢…

【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

上一篇文章学习了中断与异常的概念:【OS学习笔记】三十四 保护模式十:中断和异常区别 本片文章接着学习以下内容: 中断描述符表中断门陷阱门 1 中断描述符表 我们前面讲了无数次,在实模式下,是由位于低地址的1M内存…

【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中断任务

上一篇文章学习了:OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门 本篇文章接着上一篇文章学习中断任务。 我们在前面文章中一直在说通过中断发起任务切换,本文就是将之前没有说明白的内容:通过中断发起任务切换讲…

小议传统分层与新式分层,抑或与DDD分层

引言本文提到的分层只是软件架构上的分层。文中的传统分层指的是传统的三层结构:UI(界面表现层),BLL(业务逻辑层),DAL(数据访问层)。文中提出的观点也都是个人的一点认识,与任何组织…

WCF 第八章 安全 客户端认证

一个服务的客户端认证是通过向服务提供一系列信赖的声明。声明可以是任何形式,只要客户端和服务端理解这个格式并信赖它的来源就可以。 如果客户端和服务端共享一个秘密信息,比如一个用户名和密码,只要客户端通过一个合法认证发送数据&#x…

前端学习(205):animation动画库

动画库 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

【剑指offer - C++/Java】7、斐波那契数列

在线题目链接&#xff1a;斐波那契数列 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&a…

【剑指offer - C++/Java】8、跳台阶

在线题目链接&#xff1a;跳台阶 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳…

【剑指offer - C++/Java】10、矩形覆盖

在线题目链接&#xff1a;矩形覆盖 文章目录1 题目描述2 题目分析3 代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划算法3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形…

【剑指offer - C++/Java】12、数值的整数次方

在线题目链接&#xff1a;数值的整数次方 文章目录1 题目描述2 题目分析2.1 方法1 循环2.11 Java代码2.12 C代码2.2 方法2 递归2.21 Java代码2.22 C代码3 总结1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方…

【剑指offer - C++/Java】14、链表中倒数第k的节点

在线题目链接&#xff1a;链表中倒数第k的节点 文章目录1 题目描述2 题目分析2.1 Java代码2.2 C代码3 总结1 题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 2 题目分析 这道题比较简单。常规做法是先求出链表的总的节点个数n&#xff0c;然后再从头开始找第n-…