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

上一篇文章学习了:OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

本篇文章接着上一篇文章学习中断任务。

我们在前面文章中一直在说通过中断发起任务切换,本文就是将之前没有说明白的内容:通过中断发起任务切换讲明白。

1、 中断任务

当中断和异常发生时,如果根据中断向量从IDT中找到的描述符是任务门,则不是进行一般的中断处理过程,而是发起任务切换。如下图,是通过中断发起任务切换的原理:

在这里插入图片描述

用中断发起任务切换,直觉上的好处是方便。比如,因为硬件中断的发起是客观的,很容易用它来实现一个剥夺式的、抢占式的多任务系统。这就是硬件调度机制。

不过,这并不是它最主要的目的。想象一下,当前任务正在执行的时候,突然发生了终止类型的异常,比如双重故障,会怎么样?在这种情况下,想要用iretd指令返回到哪个任务继续执行时不可能的了。

在这种情况下,如果把双重故障的处理程序定义成任务,非常恰当。当双重故障发生时,执行任务切换,切换到内核中的任务中去,从容的将发生故障的任务从从系统中抹去,回收内存空间,然后重新调度其他任务执行,会是最好的解决办法。

具体的说,在中断机制中使用任务门有以下好处:

  • 被中断的那个程序或者任务的整个执行环境可以被完整的保存起来(保存带它的TSS中)
  • 由于接管任务的是一个全新的任务,因此,可以使用一个全新的0特权级栈。这可以有效的防止因当前任务的0特权级栈遭到破坏而使整个系统崩溃
  • 由于是切换到一个新的任务,因此,它有一个独立的地址空间

当然,和一般的中断胡成立过程相比,利用中断发起任务切换也有不利的一面:那就是速度很慢,毕竟要保存大量的机器状态,并进行一些列的特权级和内存访问的检查。

由中断和异常而发起的任务切换时,不再保存CS、EIP的状态,但是在任务切换工作完成后,处理器要把错误代码压入新任务的栈中(如果有错误代码的话)。

任务是不可重入的,因此,在进入中断任务之后和执行iretd指令之前,必须关中断,以防止因相同的中断再次发生而产生常规保护异常。

2、错误代码

上面提到了错误代码。下面我们简单介绍错误代码。

有些异常产生时,处理器会在异常处理程序或者中断任务的栈中压入一个错误代码。通常,这意味着异常和特定的段选择子或者中断向量有关。

如下图是一个错误代码的格式:

在这里插入图片描述

  • EXT位:异常是由外部事件引起的。此位为1时,表示异常是由NMI、硬件中断等引发的。
  • IDT位:用于指示描述符的位置。次位为1时,表示段选择子的索引部分(错误代码的位15-位3)是指向中断描述符表(IDT)的。为0时,表示段选择子的索引部分是指向GDT或者LDT的。
  • TI位 :仅在IDT位为0的时候才有意义。当TI=0时,表示段选择子的索引部分指向GDT,否则指向LDT。
  • 段选择子的索引部分用于指示GDT/LDT内的段描述符,或者IDT内的门描述符,它就是我们平时所用的段选择子段选择子的高13位
  • 有时候,错误代码可能全是0,这表示异常的产生并非由于引用了一个特定的段,也有可能是想要引用一个段,但是那个段的描述符是空的。

3、总结

本文主要学习通过中断发起的任务切换,以及学习以下错误代码的格式以及各个位代表的含义。

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

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

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

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

相关文章

GC是什么? 为什么要有GC?

答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc()Runtime.getRuntime().gc() 转载于:https://www.cnblogs.com/mianshi/archive/2011/01/05/192663…

【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

本文是以下几篇文章对应的主引导扇区代码汇编代码: 【OS学习笔记】三十四 保护模式十:中断和异常区别【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中…

过滤JSON中的特殊字符

过滤方法用的是Discuz中的过滤方法&#xff01; /// <summary>/// 加载事件/// </summary>/// <param name"sender"></param>/// <param name"e"></param>protected void Page_Load(object sender, EventArgs e){if(!…

【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

本文是以下几篇文章对应的微型内核代码汇编代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切换----中断…

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

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

【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

本文是以下几篇文章对应的动态加载的用户程序/任务一代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切…

WCF 第八章 安全 客户端认证

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

【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任…

JS调用后台方法大全

javascript函数中执行C#代码中的函数&#xff1a;方法一&#xff1a; 1、首先建立一个按钮&#xff0c;在后台将调用或处理的内容写入button_click中;    2、在前台写一个js函数&#xff0c;内容为document.getElementById("btn1").click();    3、在前台或后…

【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 本文是将个人的关于《X86汇编语言-从实模式…

C语言编译全过程剖析

内容摘要 C语言编译的整个过程是非常复杂的&#xff0c;里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的&#xff0c;深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的&#xff0c;希望大家可以多了解一些&#xff0c;在遇到问题时多思考、多实践。 一…

【剑指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…

母版事件中注册javascript脚本

母版事件中注册javascript脚本 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ Title :㈠母版等事件中注册javascript脚本 Description: version : 1.0 Date :8:46 2008-3-26 Author : Tia…

【剑指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】9、变态跳台阶

题目链接&#xff1a;变态跳台阶 文章目录1 题目描述2 题目分析3 代码3.1 动态规划算法3.11 Java代码3.12 C代码3.2 递归算法3.21 Java代码3.22 C代码3.3 直接求解 公式&#xff1a;f(n)2^(n-1)^3.31 Java代码3.32 C代码4 总结1 题目描述 一只青蛙一次可以跳上1级台阶&#xf…

在Linux上构建ASP.NET环境-asp.net关注

在Linux上安装mono,xsp,mod_mono后&#xff0c;可以构建一个ASP.NET环境&#xff0c;Mono项目是由Novell支持的。mono官网地址&#xff1a;mono下载页面&#xff1a;/mono-downloads/download.htmlXSP是一个轻量级的Web服务器&#xff0c;它是用100%的C#代码写成的纯.Net应用程…

【剑指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的小矩形横着或者竖着去覆盖更大的矩形…

C++ primer 笔记(二)

第9章 sequential container 顺序容器: vector 快速随机访问 list快速插入删除 deque双端&#xff0c;随机访问 C<T> c; C c(c2); C c(b,e); //迭代器,数组,指针&#xff0c;不要求两个容器类型相同 C<T> c(n,t); //只适用与顺序容器 C<T> c(n…

【剑指offer - C++/Java】11、二进制中1的个数

在线题目链接&#xff1a;二进制中1的个数 文章目录1 题目描述2 题目分析2.1 方法12.11 Java代码2.12 C代码2.2 方法22.21 Java代码2.22 C代码3 总结1 题目描述 输入一个整数&#xff0c;输出该数二进制表示中1的个数。其中负数用补码表示。 2 题目分析 2.1 方法1 这道题看起…