31-中断和异常

在经过了大量的学习和实践后,今天终于可以抛出这个沉重的话题了。不少操作系统相关的书籍喜欢很早就在书上给什么是中断,什么是异常下了一个让人抓狂的定义,可是这对初学者来讲真的不适合。

1. 中断

1.1 中断的概念

看到这个标题,你肯定联想到之前我们学习过的中断门、中断描述表这些概念。如果把中断门玩溜了,肯定也知道int N这条汇编指令。不过我想告诉你的是,通过int N指令完成的中断,并不叫中断,相反,它属于异常范畴。到这里请不要慌,接下来请认真阅读,什么才是中断。

  1. 首先,中断由 CPU 外部的输入输出设备(硬件)发起,通常这被称为中断请求。
  2. 中断请求的目的是希望或者建议 CPU 能够暂停正在执行的指令,转而去执行中断处理程序(安装在中断描述符表中)。

如此一来,你应该能想明白int N指令不是中断了,因为这条指令引起的中断来源于 CPU 内部,这很重要。

而你所熟知的时钟中断,那就是名副其实的中断请求了。

1.2 可屏蔽中断与不可屏蔽中断

80x86有两条中断请求线:

  • 非屏蔽中断线,称为NMI(NonMaskable Interrupt)

  • 可屏蔽中断线,称为INTR(Interrupt Require)

1.2.1 可屏蔽中断

之前讲过,中断请求的目的是 希望或者建议 CPU去处理相应的例程,当然 CPU 也完全可以不用理会这些建议。这种完全可以被 CPU 忽视掉的中断称为可屏蔽中断。具体做法就是修改 CPU 中的 EFLAGS 寄存器中的 IF 位。

当 IF 位为 1 的时候,表示 CPU 当前可以接受中断请求并进行处理,当 IF 位为 0 的时候,任何中断请求都将会被 CPU 忽略。

可以通过指令 cli 来忽略中断请求,即置 IF = 0. 可以通过指令 sti 来响应中断请求,即置 IF = 1.

在硬件级,可屏蔽中断是由一块专门的芯片来管理的,通常称为中断控制器。它负责分配中断资源和管理各个中断源发出的中断请求。为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request) 后面加上数字来表示不同的中断.

比如:在Windows中 时钟中断的IRQ编号为0 也就是:IRQ0


这里写图片描述

既然时钟中断是外部请求,那么它一定也是可以屏蔽的啦。在单核模式下运行多线程程序时,可以关闭中断请求,从而不响应时钟中断,这种方法可以实现原子操作。不过多核的话这种方法就失效了,需要采取其它手段。

1.2.1 不可屏蔽中断

不可屏蔽中断的中断号在windows中安装在IDT表的2号位置。它不会受 IF 位的影响。当这种中断发生时,无论如何 CPU 都要去处理。

断电就是一种不可屏蔽中断。还有没有其它的不可屏蔽中断,我也表示不知道。

2. 异常

异常通常是CPU在执行指令时检测到的某些错误,比如除0、访问无效页面等。不同于中断,异常来源于 CPU 内部,它是 CPU 主动产生的。

中断与异常的区别:

  • 中断来自于外部设备,是中断源(比如键盘)发起的,CPU是被动的.

  • 异常来自于CPU本身,是CPU主动产生的.

  • INT N虽然被称为“软件中断”,但其本质是异常。EFLAG的IF位对INT N无效。

3. 总结

无论是中断还是异常,它们的处理程序都安装在了 IDT 表中,而中断和异常的最本质区别就是来源问题,中断是CPU外部产生,而异常是CPU主动产生。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使万维网成为更美丽的地方 版本9.3,2019年8月11日 非一般用途。 仅在极少数精选的个人中使用,以协助某人的残障。 为特定的恐惧症过滤互联网,掩盖恐惧的实体。 有一个计数器和一个与用户的漫游配置文件同步的日志。 自2018年11月26日首次发布市场以来,经过29次修订,似乎我终于可以拥有这项权利。 此代码仅适用于患有仇视心理的个人的朋友和家人。 它仅是为了公开发布所提供的所有便利而在Google的Chrome扩展程序市场上公开列出,但是主要是这样,不必在每次创建新帐户或更多家庭成员时向每个朋友和家人发送链接和朋友开始使用扩展程序。 尽管此扩展程序(I)的开发人员不是专业的软件开发人员,并且对软件开发的了解非常有限,但是由于数个可自定义的内容过滤器出现故障而导致了这一努力。 许多人未能尽快或完全注射。 有些无法过滤某些帧(最著名的是iframe)。 许多人没有过滤图像。 有些没有过滤链接。 许多网站没有监控DOM突变-在大多数网站提供动态内容的现代浏览中,这是绝对必要的。 7.0版似乎代表了一项突破。 它看起来非常稳定且非常有效(时间会证明一切)。 此外,与发布7.0之前的许多修订不同,发布7.0不会显着降低浏览体验,也不会“破坏”任何页面-一个示例为视频控件,另一个示例为参差不齐的引用。 截至2019年2月21日星期二。我将删除详细的修订历史记录。 2019年6月5日,星期三:更改注入样式表并显示,希望在大多数(如果不是全部)网站上提高注入速度,同时保留YouTube内的播放控件。 2019年6月22日星期六:更改了图标并添加了更多异常处理。 还添加了半透明的背景警告。 2019年7月4日,星期四:i)添加了浏览器图标的弹出窗口。 ii)增加了对服务器端脚本的主动控制能力,以响应嵌入式javascript,这些JavaScript试图检测客户端对预期渲染的干扰。 iii)添加了图像和锚点(链接)的图标替换。 2019年7月11日,星期四:发现我的突变观察者并未观察到所有突变。 这样,检查DOM的主动循环就显得没有必要,并且性能不佳的ios也得到了极大的改善。 考虑汇总统计信息... 2019年7月12日,星期五:修复了一些错误,一个与突变观察者有关,另一个与条件样式有关。 2019年7月21日,星期日:彻底重新设计内部方法。 远离XPath,偏爱递归功能。 速度稍慢,但看起来更可靠。 同时搜索所有属性。 2019年7月23日,星期二:轻微更正。 2019年7月25日,星期四:V8.0主要重写。 2019年7月26日,星期五:V8.1已修复带有命中计数器的小错误。 最终解决了在以下链接上重置过滤器的问题。 2019年7月28日,星期日:V8.2仍显着改进; 减少更少的网站(如果有); 于2019年7月28日星期日修复了命中计数器(8.0版中的命中计数器):V8.3对反向逻辑进行了较小的更正。 2019年7月28日,星期日:V8.4添加了一个省略的异常处理程序。 2019年7月29日星期一:V8.5解决了命中计数器的另一个错误。 2019年7月29日星期一:V8.6解决了对一些网站渲染的影响。 2019年7月30日,星期二:V8.7清理代码。 这可能是一个主要版本。 我希望这代表了基本功能上非常成熟和稳定的状态。 我希望很快添加一个设置页面,并可能选择加入集中式服务器上的POST(共享)数据(例如,命中数与时间的关系,可能包括URL,或者可能仅限于站点)。 我想添加一下能够尽快发送“崩溃报告”的功能。 现在,我需要暂停对此的开发。 这似乎是以后接载的好地方。 2019年7月30日星期二:V8.8添加了广告屏蔽功能。 目前,使用大量的系统资来阻止广告是非常激进的。 我希望回来以提高此新添加项的效率。 2019年7月31日星期三:V8.9 2019年8月4日星期日:主要版本v9.0新新鲜气味。 似乎是一个真正的人群喜悦。 在提供可靠保护的同时,似乎破坏了很少的站点。 2019年8月4日,星期日:v9.1上传v9.0之后的较小修正时间。 2019年8月6日星期二:v9.2 2019年8月11日星期日:v9.3 i)修复了点击计数器日志,ii)一项相当重大的更改:现在,当找到匹配时,我将禁用脚本。 这会中断许多页面,尤其是具有大量动态内容的页面。 iii)在该网站受到点击后,离开该网站或在该网站内浏览时,我增加了该网站的Cookie,历史记录和缓存的清除。 支持语言:English (United States)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值