第四章 中断和异常

中断通常被分为同步中断和异步中断,
同步中断是当指令执行时由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. jquery touch 移动端上下滑动加载

    var touchStart, touchEnd, touchDiff = 80; $(window).on({ 'touchstart': function (e) { touchStart = e ...

  2. Python3实现ICMP远控后门(中)之“嗅探”黑科技

    ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的pi ...

  3. VM虚拟机链接克隆及linux eth0网卡的快速设置方法

    对于后台开发者来说,在学习过程中必然接触众多中间件,在自己的虚拟机进行操作甚至搭建cluster是很常见的事情. 我在初学者时摸索出一套快速的克隆虚拟机方法.分享给大家. 产品VMware® Work ...

  4. Java中判断是否为空的方法

    1.判断字符串或者对象是否为空 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.ut ...

  5. 使用 Swoole 来加速你的 Laravel 应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...

  6. 非常适用的Sourceinsight插件,提高效率【强力推荐】

    转自:http://www.cnblogs.com/heiyue/p/6225975.html 一直使用sourceinsight编辑C/C++代码,sourceinsight是一个非常好用的编辑工具 ...

  7. Java线程池中submit() 和 execute()方法的区别

    两个方法都可以向线程池提交任务, execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorS ...

  8. SpringMVC, Spring和Mybatis整合案例一

    一  准备工作 包括:spring(包括springmvc).mybatis.mybatis-spring整合包.数据库驱动.第三方连接池. 二  整合思路 Dao层: 1.SqlMapConfig. ...

  9. springboot+mybatis+ehcache实现缓存数据

    一.springboot缓存简介 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓 ...

  10. 实现pc端信纸留言板

    效果如图: 我好像在哪里见过这样的形式,但却从来没有想过怎么实现,有种莫名的兴奋感.怎么控制什么时候换行,怎么控制中间的线条,这些视乎都是CSS无法实现的,我陷入了死局.寻找JS的做法,JS的挺复杂的 ...