两篇文章说异常和中断之二
一、基本概念
1.
|
产生的位置 | 发生的时刻 | 时序 |
中断 | CPU外部 | 随机 | 异步 |
异常 | CPU正在执行的程序 | 一条指令终止执行后 | 同步 |
2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行
中断处理程序与正在运行的程序无关
1.(1)尽可能快
(2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套
(3)尽可能地限制临界区,因为在临界区中,中断被禁止
2.大部分异常发生在用户态,缺页异常是唯一发生于内核态能触发的异常
缺页异常意味着进程切换,因此中断处理程序从不执行可以导致缺页的操作
3.中断处理程序运行于内核态
中断发生于用户态时,要把进程的用户空间堆栈切换到进程的系统空间堆栈,刚切换时,内核堆栈是空的
中断发生于内核态时, 不需要堆栈空间的切换
三、分类
1.中断的分类:可屏蔽中断、不可屏蔽中断
2.异常的分类:
分类 | 解决异常的方法 | 举例 |
故障
|
那条指令会被重新执行
|
缺页异常处理程序
|
陷阱
|
会从下一条指令开始执行
|
调试程序
|
异常中止
|
强制受影响的进程终止
|
发生了一个严重的错误 |
3.激活/禁止IRQ线 != 可屏蔽中断的 全局屏蔽/非屏蔽
五、中断描述符表IDT
1.基本概念
中断描述符表是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序入口地址。
在允许发生中断以前,必须适当地初始化IDT
TSS只能位于GDT中,IDT能位于内存的任何的地方
2.中断描述符
硬件提供的中断描述符:
(1)任务门:中断信号发生时,必须取代当前进程的那个进程的TSS选择符存放在任务门中
(2)中断门:包含段选择符和中断处理程序的段内偏移
(3)陷阱门:与中断门的唯一区别是,通过中断门进入服务程序后,自动关中断,而通过陷阱门进入服务程序不自动关中断
Linux中使用的中断描述符:
中断描述符的类型 | 用户态能否访问 | 用户态的访问方式 | 能激活的程序 |
中断门 | 否 |
|
所有的Linux中断处理程序 |
系统门 | 是 | into、bound、int $0x80 | 向量号为4,5,128的三个Linux异常处理程序 |
系统中断门 | 是 | int 3 | 与向量3相关的异常处理程序 |
陷阱门 | 否 |
|
大部分Linux异常处理程序 |
任务门 | 否 |
|
Linux对Double fault异常的处理程序 |
Linux中的系统门、系统中断门、陷阱门使用的都是硬件中的陷阱门
Linux利用中断门处理中断,利用陷阱门处理异常
Double fault是唯一用任务处理的异常
3.中断向量与中断和异常的关系
(1)每个中断和异常是由0-255之间的一个数来标识的,这个数就是1中的中断向量
(2)大约有20种异常,内核为每一个异常分配了一种中断/异常向量分别是0-19
(3)0x80是系统调用的中断向量
(4)32-255是内核为什么中断分配的中断向量。然而,224个中断向量显然不够,因此系统为每个中断向量设置一个队列,根据每个中断源所使用的中断向量,将其中断服务程序挂到相应的队列中。中断发生时,先执行与中断向量相对应的一段总服务程序,再根据具体的中断源设备号在其所属的队列找到特定的中断服务程序加以执行。
4.中断向量、与中断向量相对应的总服务程序、某个中断源的中断服务程序之间的关系如图所示:
(1)irq_desc是中断向量描述符队列(中断描述符是INT的一项,中断向量描述符是一个数据结构,用于描述与中断向量相关的服务程序)
(2)irq_desc_t是中断向量描述符的数据结构
(3)irqaction是挂在某个中断向量的具体的中断服务程序的描述符,组成一个队列
(4)hw_irq_controller是这个中断向量的总服务程序
六、IDT的初始化
1.两次初始化
|
运行模式 | 初始值 | 使用者 |
第一次 | 实模式 | 空处理程序 | BIOS例程 |
第二次 | 保护模式 | 有意义的中断处理程序或异常处理程序 | Linux系统 |
2.在IDT表的初始化完成之初,每个中断处理队列都是空的,此时即使打开中断并且某个外设中断真的发生了,也得不到实际的服务,因为没有执行具体的中断处理程序。
真正的中断服务要到具体设备的初始化程序将其中断处理程序ISR挂入某个中断请求队列后才会发生
3.在允许发生中断以前,必须适当地初始化IDT
七、激活中断或异常(以下内容都是由硬件自动完成)
1.确定与中断或异常相关的中断向量号
中断:硬件设备控制器通过IRQ向CPU发出信号,中断管制器把接受到的信号转换为中断向量号i
异常:对于软件指令发出或产生的异常,CPU会差别归类错误的类别,这个类别号就是中断向量
2.IDT第i项 -----> 段选择符 ----->段描述符 -----> 段基址
3.IDT第i项 -----> 偏移量
4.段基址 + 偏移量 -----> 中断处理程序第一条指令的地址
5.在栈中保存EFLAGS、CS、EIP的内容
6.如果异常产生了一个出错码,把它保存在栈中
7.装载CS、EIP,其值分别是2-段选择符和4-偏移量,由这两个寄存器可得到中断或异常处理程序第一条指令的地址
八、找到中断或异常处理程序的第一条指令后,跳转这到这一指令的过程
1.中断
(1)在当前进程的内核堆栈中保存IRQ的值,为什么与系统调用号区分,保存的是-n
(2)在当前进程的内核堆栈中保存寄存器的值:SAVE_ALL
EFLAGS、CS、EIP、SS、ESP不包括在内,因为它们由控制单元自动保存(见七-7)
(3)把栈顶的地址存放到EAX中
(4)把用户段的选择符装到DS和ES中
(5)调用do_IRQ(),地址保存在CS、EIP中(见七-7)
(6)为正在给IRQ线服务的PIC(中断控制器)一个应答,这将允许PIC进一步发出中断
(7)执行共享这个IRQ的所有设备的ISR(总服务程序称为IRQ,某个设备的具体的服务程序称为ISR)
(8)跳到ret_from_intr()的地址后终止
(6)(7)(8)都是在(5)中被调用的,见十
2.异常
(1)如果异常发生时,控制单元没有自己把一个出错码压出栈中(见七-6),则压入一个空值。
这个“凑数”的出错码不在正常的出错码应该在的位置,以下-步是为了把它调整到它应该在的位置
(3)把异常处理程序的地址压入栈中
(4)把异常处理程度可能用到的寄存器保存到栈中
(5)把栈中位于ESP+36处的硬件出错码拷贝到EDX中,给栈中这一位置存上-1
(6)把保存在栈中ESP+32位置的异常处理程序的地址装入EDI中,给栈中的这一位置写入ES的值
(7)把栈当栈顶拷贝到EAX中
(8)把用户段的选择符装到DS和ES中
(9)调用地址在EDI中的异常处理程序
九、从中断或异常处理程序返回的过程
1.跳转到用于返回的代码的入口点
(1)中断ret_from_intr()
(2)异常:ret_from_exception()
2.把当前线程描述符的地址装载到EBP
3.根据栈中的CS和EFLAGS确定要返回到用户态还是内核态
4.如果有进程调度请求则调度
5.通过执行iret指令结束控制,被中断的程序重新开始执行
十、总的中服务务程序IRQ
1.为正在给IRQ线服务的PIC(中断控制器)一个应答,这将允许PIC进一步发出中断
2.发生以下任何一种情况,则返回
(1)相应的IRQ线被禁止
(2)另一个CPU正常处理这类中断
(3)没有相关的ISR
3.
两篇文章说异常和中断之二相关推荐
- 对张子阳先生对委托和事件的两篇文章的读后思考(说得很透,内附故事一篇)...
第一篇 C#中的委托和事件 第二篇 C#中的委托和事件(续) 首先,张子阳先生的这是两篇关于委托和事件间关系的文章,是目前为止我读过的介绍委托和事件以及异步调用最简明清晰文章,作者通过非常有节奏的&q ...
- 关于微服务的两篇文章以及Eventuate
微服务相关的两篇文章,很多之前一知半解的概念与关系,看过之后,茅塞顿开! 微服务架构之事件驱动架构 http://m.blog.csdn.net/article/details?id=52537886 ...
- C++/JAVA 计算两篇文章的相似度
C++/JAVA 计算两篇文章的相似度 这位少侠,要不要进店瞧瞧? 实验介绍及思路 问题描述: 编写程序,计算任意两篇文章的相似度. 基本思路: 利用余弦相似度来计算其相似度. 完整代码 C++ 代码 ...
- python余弦定理_使用余弦定理计算两篇文章的相似性
使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码) ...
- 【读书笔记】NeurIPS2018的两篇文章:The Tradeoffs of Large Scale Learning和Neural Ordinary Differential Equations
今天看了 NeurIPS 2018 上的两篇文章,一篇是获得 best paper 的 Neural Ordinary Differential Equations (陈天奇的文章),一篇是获经典论文 ...
- 【python 走进NLP】simhash 算法计算两篇文章相似度
互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤.新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤.最简单的文本相似性计算方法可 ...
- [将小白进行到底] 如何比较两篇文章的相似度
其实这个题目已经有很多人写过了,数学之美里就有,最近阮一峰的博客里也写了,本文基本上遵循的就是他的思路,只是让其看起来再小白一点点.其实说白了就是用自己的话,再把同样一件事描述一下,顺便扩扩句,把其中 ...
- 比较两篇文章的相似性方法
对于这个题目,开始毫无头绪,后来经过查阅资料现在讲方法总结如下: 1.利用余弦定理 我们知道向量a,b之间的夹角可用余弦定理求得: 如果夹角的余弦值越小,那么 ...
- 目前需要开发出一个功能,对比查找并标注出两篇文章中类似的段落或者词句,有什么开源项目有这个功能吗? 其实有点像论文查重的功能,有论文查重的比较通用的开源项目推荐吗?...
是的,你可以使用论文查重的工具来对比查找并标注两篇文章之间的相似段落或词句. 你可以尝试使用这些开源项目: MOSS (Measure Of Software Similarity):这是一个用于检测 ...
最新文章
- 综述 | 森林微生物组:多样性,复杂性和动态变化(IF:11.3)
- window document树
- Amazon Go亮相:消费者无需结账即可完成店面购物
- .Net IOC框架入门之三 Autofac
- vba读取csv文件到excel_利用VBA打开顺序文件,并读取
- LeetCode 872叶子相似的树-简单
- python3.7界面_Python3.7+tkinter实现查询界面功能
- 重返数学史的黄金时代,由数学推动诞生的人工智能,一部人类智慧形成的历史...
- 列车时刻管理c语言程序设计,列车时刻表信息管理系统实践报告C语言源代码
- 《精通 ASP.NET MVC 3 框架(第三版)》----第1章 设计思路 1.1 Web开发简史
- jsonrpc-c编译
- 免费好用的节假日API
- html css 怎么画星形,使用CSS如何绘制五角星?(附代码)
- 【链环科技】微信公众号商城开发优势
- 神来之笔--图解JVM内存分配及对象存储
- 互联网日报 | 阿里拟280亿港元控股高鑫零售;小米首发80瓦无线秒充;国产特斯拉整车出口海外...
- [Win32]画笔和规则区域填充
- 参考文献格式要首行缩进吗_参考文献顶格写吗
- section怎么制造图框_cad中如何制作带属性块的图框
- 计算机网络脆弱性评估方法研究