第四章 中断和异常

中断通常被分为同步中断和异步中断,
同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断
异步中断是由其他硬件设备依照CPU时钟信号随机产生的。
分别称为异常和中断,用中断信号指两者。

中断或异常处理执行的代码不是一个进程,而是内核控制路径,
中断满足尽快处理完、允许中断嵌套、临界区禁止

Intel文挡把中断和异常分为以下几类:
中断:
可屏蔽中断
被送到微处理器的INTR引脚。通过清eflag寄存器的IF标志关闭中断。所有I/O设备发出的IRQ均可引起可屏蔽中断。
不可屏蔽中断
被送到微处理器的NMI引脚。通过清IF标志,中断不能关闭。只有几个危急的事件,例如硬件故障,才引起不可屏蔽中断。
异常:
处理器探测异常
当CPU执行一条指令时所探测到的一个反常条件所产生的异常。可以进一步分为三组,这取决于CPU控制单元产生异常时保存在内核态堆栈eip寄存器的值:
故障
保存在eip中的值是引起故障的指令地址,只要处理程序能纠正引起异常的反常条件,会重新执行那条指令。
陷阱
陷阱的主要用途是为了调试程序。保存在eip中的值是一一个指令地址,该指令在引起陷阱的指令地址之后。只有当没有必要重新执行已执行过的指令时,才触发陷阱。
异常结束
发生一一个严重的错误。控制单元出了麻烦,不能在eip寄存器中保存有意义的值。异常结束是由硬件故障或系统表中无效的值引起的。由控制单元发送的这个中断信号是紧急信号,用来把控制切换到相应的异常结束处理程序,这个异常结束处理程序会迫使受影响的进程终止。
编程异常
在编程者发出请求时发生,是由int或int3指令触发的;当into (检查溢出)和bound(检香地址出界)指令检查的条件不为真时,也引起编程异常。控制单元把编程异常作为陷阱来处理。编程异常通常也被叫做软中断( software interrupt)。这样的异常有两种常用的用途:执行系统调用,或给调试程序通报一个特定的事件。

IRQ:
每个能发中断请求的硬件设备控制器都有一个IRQ的谁出线,

每个中断或异常有一个0~255的数,称为中断向量。0-31是异常和不可屏蔽中断,32-47是可屏蔽中断(IRQ),其余为软中断,linux只用了0x80来实现系统调用,用户态一条0x80切换进内核态,执行system_call内核函数。
大约有20种异常,每个异常对应一个专门的处理程序

中断,陷阱及系统门----三种类型的中断描述符
中断
用户态的进程不能访问的Intel的中断门(门的DPL域为0)。所有的中断处理程序都由中断门激活,并全部限制在内核态。
系统门
用户态的进程可以访问的Intel的陷阱门(门的DPL域为3)。通过系统门来激活四个Linux异常处理程序,它们的向量是3, 4, 5及128,因此,在用户态下,叮以发布int3、into、 bound及int 0x80 四条汇编指令。
陷阱门
用户态的进程不能访问Intel的陷阱门(门的DPL域为0)。除了前一段所描述的四个Linux异常处理程序,其他所有的异常处理程字都通过陷阱门来激活。

下列函数用来给 IDT插人门:
set_ intr_ gate (n, addr)
在第n个IDT表项中,插入一个中断门。这个门中的段描述符被设置成内核代码段的选择符,偏移域设置成addr,adar是中断处理程序的地址。把DPL域设置成0.
set_ system_ gate (n, addr) ,
在第n个IDT项中,插人一个陷阱门。这个门中的段描述符被设置成内核代码段的选择符,偏移域设置成addr,addr是异常处理程序的地址。把DPL城设置成3。

set_ trap_ gate (n, addr)
与前面的函数相似,只不过DPL的域被设置成0.

中断后要执行的操作有三类:
紧急的(Critical)
这样的操作诸如:向PIC 应答一个中断,对PIC或设备控制器重编程,或者修改由设备和处理器同时访问的数据结构。这些都能被很快地执行,而之所以说它们是紧急的是因为它们]必须被尽快地执行。紧急操作要在一一个中断处理程序内立即执行,而且是在关中断的状态下。
非紧急的(Noncritical )
这样的操作如,修改那些只有处理器才会访问的数据结构(例如,按下一个键后,读扫描码)。这些操作也要很快地完成,因此,它们由中断处理程序立即执行,但在开中断的状态下。
非紧急可延迟的(Noncritical deferrable )
这样的操作如,把一个缓冲区的内容拷贝到--些进程的地址空间(例如,把键盘行缓冲区的内容发送到终端处理程序的进程)。这些操作可能被延迟较长的时间间隔而不影响内核操作,有兴趣的进程会等待需要的数据。非紧急可延迟的操作由一些被称为“下半部分(botom half)"的函数来执行。我们将在后面讨论“下半部分”。

下半部分是-一个低优先级的函数,通常与中断处理相关,也就是说,等待内核找到一个方便的时刻来运行它。下半部分-直会等到下面事件之--发生时才会被执行:
内核处理完-一个系统调用。
内核处理完一个异常.
内核终止do_ IRQ() 函数,即处理完一个中断。
内核执行schedule{)函数以选择-一个新进程在CPU上运行。
下半部分与软中断:LINUX2.4之后引入了软中断,类似于2.2的下半部分,下半部分会严格串行执行(在不同CPU上也不会同时执行),软中断则不会

从中断和异常的返回
从技术上说,完成所有这些事情的内核汇编语言代码并不是一个函数,因为控制权从不返回到调用它的函数。它只是一个代码片段,有三个不同的入口点,分别叫做ret_ from_ intr、ret_ .from sys_ call和ret_ from exception。然而为了简单,我们常常以函数的形式提到下面这三个入口点:
ret_ from_ intr()
终止中断处理程序。
ret_ from_ sYs_ .cal1 ()
终止系统调用,即由0x80异常引起的内核控制路径。
ret_ from_ exception{)
终止除了0x80的所有异常。

深入理解Linux内核 学习笔记(4)的更多相关文章

  1. 深入理解Linux内核 学习笔记(1)

    1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...

  2. 深入理解Linux内核 学习笔记(5)

    第五章  定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( Prog ...

  3. 深入理解Linux内核 学习笔记(3)

    第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...

  4. 深入理解Linux内核 学习笔记(2)

    第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放 ...

  5. 深入理解Linux内核 学习笔记(8)

    第八章 系统调用 API定义了一个给定的服务:系统调用是通过软中断向内核发出一个明确的请求. API可能不调用系统调用,也可能调用多个系统调用. Linux系统调用必须通过执行int 0x80,系统调 ...

  6. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  7. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  8. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  9. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

随机推荐

  1. HTML 标签小细节

    简书地址:https://www.jianshu.com/p/03a23aa28a34 今天重新学习了一下HTML中标签的用法,补充并记录一下自己新学到的知识. a中的href href Contai ...

  2. 一些遇到的Qt程序在Windows平台间移植问题整理

    今天尝试把Qt程序移植到各种虚拟机中测试,由于Qt的依赖库报告往往不能显示出全部依赖库.结果频频出现问题,好不容易全部解决了,这里给出一些套路. 首先对于Qt版本,我用过很多,最终表示现阶段推荐Min ...

  3. 如何使用 toml 配置 SpaceVim

    配置 SpaceVim 主要包括以下几个内容: 设置 SpaceVim 选项 启动/禁用模块 添加自定义插件 添加自定义按键映射以及插件配置 设置SpaceVim选项 原先,在 init.vim 文件 ...

  4. PAT1037:Magic Coupon

    1037. Magic Coupon (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The magi ...

  5. Spring Boot + Websocket + Thymeleaf + Lombok

    https://github.com/guillermoherrero/websocket 验证错误消息文件名字:是默认名ValidationMessages.properties,编译后存放在cla ...

  6. centos6.9 升级内核版本

    想在centos6.9上安装docket,不过因为内核版本是2.6的故而想升级到最新的内核版本 晚上有编译升级的比较麻烦,不过有助于理解内核升级,我使用的直接升级到最新版方法 1. 导入public ...

  7. spring security4.2.2的maven配置+spring-security配置详解+java源码+数据库设计

    最近项目需要添加权限拦截,经讨论决定采用spring security4.2.2!废话少说直接上干货! 若有不正之处,请谅解和批评指正,不胜感激!!!!! spring security 4.2.2文 ...

  8. 把List<string>集合,编程string,并以“,”号分割

    List<int> roleIdList = GetRoleIdList(user.ID); string roleIdsStr = ""; if (roleIdLis ...

  9. search_request.go

    package types type SearchRequest struct {     // 搜索的短语(必须是UTF-8格式),会被分词     // 当值为空字符串时关键词会从下面的Token ...

  10. Stackoverflow 最受关注的 10 个 Java 问题

    Stack Overflow 是一个大型的编程知识库.在 Stack Overflow 中已经有数以百万计的问题,并且很多答案有着很高的质量.这就是为什么 Stack Overflow 的答案经常位于 ...