第四章 中断和异常

中断通常被分为同步中断和异步中断,
同步中断是当指令执行时由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. CSS基础知识01

    一.CSS基础知识介绍 1.css是cascading style sheet层叠式样式表的简写 2.css小用法 加粗:font-weight:bold;             正常用:norma ...

  2. invalid bound statement (not found)

    invalid bound statement (not found) mybatis 错误: 一般是Mapepr.xml文件中文nameapce没有和mapper接口发生映射,导致mybatis绑定 ...

  3. 5月2日——iOS11定位失效问题

    所存在的问题: (1)定位不能正常使用 (2)首次安装APP 时 "是否允许使用定位信息"  系统提示框不显示 iOS定位失效原因: 因为苹果现在增加了一项新的隐私保护功能 NSL ...

  4. .NET开发设计模式-单例模式

    解释:单例模式主要特点:确保一个类只有一个实例,并提供一个访问它的全局访问点 意思就是说:在多线程的情况下:A先进行创建了该实例.B再进来访问时就不需要再创建了. using System; usin ...

  5. python_code list_3

    >>> seq=['foo','x41','?','***']>>> def func(x): return x.isalnum() >>> li ...

  6. 什么是分布式锁及正确使用redis实现分布式锁

    分布式锁 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性. 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁 ...

  7. 令状态寄存器访问指令(MRS,MSR)

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下图: 分成了4部分: 1,条件标志位 N(Negative) ...

  8. Python基本类常用方法

    数学函数 abs(x) 返回数字的绝对值,如abs(-10) 返回 10 ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5 cmp(x, y)如果 x < y 返回 ...

  9. logrotate 进行nginx日志分割

    http://www.williamsang.com/archives/1254.html 日志分割常用方法: 自己写脚本分割 使用linux自带的logrotate 前者灵活,可以应对各种需求,自定 ...

  10. python之12306自动查票

      一.导读 本篇文章所采用的技术仅用于学习.研究,任何其他用途请自行承担后果. 12306自动查票使用到的python库主要是splinter,同时也涉及到查票的城市编码,具体的城市编码请在网络上搜 ...