zoukankan      html  css  js  c++  java
  • 深入理解Linux内核 学习笔记(4)

    第四章 中断和异常

    中断通常被分为同步中断和异步中断,
    同步中断是当指令执行时由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的所有异常。

  • 相关阅读:
    Cocos2d-x场景生命周期函数介绍
    一致性hash算法在memcached中的使用
    linux操作系统下查看某rpm包是32bit 还是x64bit的命令
    JavaScript与Java通信
    DevExpress2011控件教程)编辑控件(comboBox,AspxCheckBox) 范例1
    Tips:javascript 图片放大和取得尺寸
    Eclipse颜色主题插件-Eclipse Color Theme
    Android Fragment 详解(一)
    《火球——UML大战需求分析》(第1章 大话UML)——1.4 如何学好UML?
    java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案
  • 原文地址:https://www.cnblogs.com/61355ing/p/10719588.html
Copyright © 2011-2022 走看看