精华内容
下载资源
问答
  • 中断 中断信号 中断

    千次阅读 2012-03-06 10:35:37
     什么是中断,简单地说就是CPU在忙着作自己的事情,这时候硬件(比如说键盘按了一下)触发了一个电信号,这个信号通过中断线到达中断控制器(cpu),控制器接受到这个信号,向CPU发送INT信号申请CPU来执行刚才的...
    中断概述: 
          什么是中断,简单地说就是CPU在忙着作自己的事情,这时候硬件(比如说键盘按了一下)触发了一个电信号,这个信号通过中断线到达中断控制器(cpu),控制器接受到这个信号,向CPU发送INT信号申请CPU来执行刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU就丢下自己正在做的事情,但不是随便丢到旁边而是保存了当前正在做的事情的相关资料,然后去处理这个申请,根据中断类型号找到它的中断向量(也就是中断程序在内存中的地址),然后去执行这段程序(这段程序是已经写好的,在内存中),执行完后再向控制器发送一个INTA信号表示我已经处理完你刚才的申请。这个时候CPU就可以继续做它刚才被打断做的事情了,这个时候刚才保存的相关信息就帮助CPU接着执行下面的程序,而不至于忘记自己刚才正在做什么。

    上面说了一大堆关键词有四个:
          中断源:这里的中断源是指打断CPU的事件,没有中断源中断无从谈起,它可以是硬件的也可以是软件的。
          CPU:不用说中断就是要来用CPU来处理一些事情的
          中断控制器:硬件中断源与CPU之间的桥梁,没有它中断就无法被CPU所知道。
          中断服务程序:你打断了CPU,CPU就得根据这个程序来为你办事
    中断的分类:
          硬件中断,总的来说可以将中断分为内部中断和外部中断,内部中断也叫软中断是由CPU产生的,当处理起执行时遇到了由于程序员编程而导致的错误指令时,如除数为0,这些就会产生内部中断,而外部中断(硬件中断)一般都是硬件所引起的中断比如说键盘等。
          中断号:
          这里所说的中断号是指外部中断即硬件中断的编号,系统为每个“中断请求线”分配了一个号,当CPU不能满足外设要求的中断时,就有了多个外设共享一个中断号。中断号是用来表明是那个设备产生了中断,比如作为时钟中断的IRQ0。这样CPU就可以知道是那个设备产生了中断从而去处理它。
          中断向量:
          前面所将的中断号与中断向量之间的关系是:中断号+32 = 中断向量。中断向量的作用将在下面介绍。
          中断描述符表(IDT):一个表,也叫中断向量表,每个表项叫做门描述符(gate descriptor)占8个字节,简单的说是用来存放中断处理程序入口函数地址,当然还包括了一些其他信息。其作用就是当一个中断发生时我们根据它的中断号确定其中断向量,然后在此表中找到它的入口函数从而执行它。这个表存放在内存中的一片区域中,那么我们如何找到这个表呢?这就需要一个系统寄存器中断描述符寄存器IDTR,在系统初始化时有一条汇编指令LIDT便可将中断描述符表的地址装进IDTR中,IDTR48位,在低字(低16位)中装的是界限,在高双字(高32位)中装的是基址
    展开全文
  • 中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。 在有些情况下,尽管产生了中断源和发出了中断请求,但CPU内部的处理器状态字PSW的中断允许位已被清除,...

    一,什么是中断?
    1.中断的基本概念
    中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。引起中断发生的事件被称为中断源。中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。

    在有些情况下,尽管产生了中断源和发出了中断请求,但CPU内部的处理器状态字PSW的中断允许位已被清除,从而不允许CPU响应中断。这种情况称为禁止中断。CPU禁止中断后只有等到PSW的中断允许位被重新设置后才能接收中断。禁止中断也称为关中断,PSW的中断允许位的设置也被称为开中断。开中断和关中断是为了保证某段程序执行的原子性。

    还有一个比较常用的概念是中断屏蔽。中断屏蔽是指在中断请求产生之后,系统有选择地封锁一部分中断而允许另一部分中断仍能得到响应。不过,有些中断请求是不能屏蔽甚至不能禁止的,也就是说,这些中断具有最高优先级,只要这些中断请求一旦提出,CPU必须立即响应。例如,电源掉电事件所引起的中断就是不可禁止和不可屏蔽的。

    2.中断的分类与优先级
    根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。

    根据中断源产生的条件,可把中断分为外中断和内中断。外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。

    内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。

    为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。例如在UNIX系统中,外中断和陷阱的优先级共分为8级。为了禁止中断或屏蔽中断,CPU的处理器状态字PSW中也设有相应的优先级。如果中断源的优先级高于PSW的优先级,则CPU响应该中断源的请求;反之,CPU屏蔽该中断源的中断请求。

    各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。

    除了在优先级的设置方面有区别之外,中断和陷阱还有如下主要区别:

    陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。

    CPU执行完一条指令之后,下一条指令开始之前响应中断,而在一条指令执行中也可以响应陷阱。例如执行指令非法时,尽管被执行的非法指令不能执行结束,但CPU仍可对其进行处理。

    3.软中断
    软中断的概念主要来源于UNIX系统。软中断是对应于硬中断而言的。通过硬件产生相应的中断请求,称为硬中断。而软中断则不然,它是在通信进程之间通过模拟硬中断而实现的一种通信方式。中断源发出软中断信号后,CPU或者接收进程在“适当的时机”进行中断处理或者完成软中断信号所对应的功能。这里“适当的时机”,表示接收软中断信号的进程须等到该接收进程得到处理器之后才能进行。如果该接收进程是占据处理器的,那么,该接收进程在接收到软中断信号后将立即转去执行该软中断信号所对应的功能。

    4.中断处理过程
    一旦CPU响应中断,转人中断处理程序,系统就开始进行中断处理。下面对中断处理过程进行详细说明:

    1)CPU检查响应中断的条件是否满足。CPU响应中断的条件是:有来自于中断源的中断请求、CPU允许中断。如果中断响应条件不满足,则中断处理无法进行。

    2)如果CPU响应中断,则CPU关中断,使其进入不可再次响应中断的状态。

    3)保存被中断进程现场。为了在中断处理结束后能使进程正确地返回到中断点,系统必须保存当前处理器状态字PSW和程序计数器PC等的值。这些值一般保存在特定堆栈或硬件寄存器中。

    4)分析中断原因,调用中断处理子程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。在系统中,为了处理上的方便,通常都是针对不同的中断源编制有不同的中断处理子程序(陷阱处理子程序)。这些子程序的人口地址(或陷阱指令的人口地址)存放在内存的特定单元中。再者,不同的中断源也对应着不同的处理器状态字PSW。这些不同的PSW被放在相应的内存单元中,与中断处理子程序人口地址一起构成中断向量。显然,根据中断或陷阱的种类,系统可由中断向量表迅速地找到该中断响应的优先级、中断处理子程序(或陷阱指令)的入口地址和对应的PSW。

    5)执行中断处理子程序。对陷阱来说,在有些系统中则是通过陷阱指令向当前执行进程发出软中断信号后调用对应的处理子程序执行。

    6)退出中断,恢复被中断进程的现场或调度新进程占据处理器。

    7)开中断,CPU继续执行。

    5.设备管理程序与中断方式
    处理器的高速和输入输出设备低速之间的矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中的CPU等待时间以及提高系统的并行工作效率,采用中断方式来控制输入输出设备和内存与CPU之间的数据传送,是很有必要的。

    在硬件结构上,这种方式要求CPU与输入输出设备(或控制器)之间有相应的中断请求线,而且在输入输出设备控制器的控制状态寄存器上有相应的中断允许位。

    二,什么是信号?
    1、信号及信号来源
    信号本质

    信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

    信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。

    信号来源

    信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

    2、信号的种类
    可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。在《Linux环境进程间通信(一):管道及有名管道》的附1中列出了系统所支持的所有信号。

    (一)、可靠信号与不可靠信号

    “不可靠信号”

    Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:

    进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
    信号可能丢失,后面将对此详细阐述。
    因此,早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。
    Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。

    “可靠信号”

    随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种Unix版本分别在这方面进行了研究,力图实现"可靠信号"。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。同时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。POSIX.4对可靠信号机制做了标准化。但是,POSIX只对可靠信号机制应具有的功能以及信号机制的对外接口做了标准化,对信号机制的实现没有作具体的规定。

    信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。

    注:不要有这样的误解:由sigqueue()发送、sigaction安装的信号就是可靠的。事实上,可靠信号是指后来添加的新信号(信号值位于SIGRTMIN及SIGRTMAX之间);不可靠信号是信号值小于SIGRTMIN的信号。信号的可靠与不可靠只与信号值有关,与信号的发送及安装函数无关。目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。同时,由signal()安装的实时信号支持排队,同样不会丢失。

    对于目前linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数(对所有信号这一点都成立),而经过signal安装的信号却不能向信号处理函数传递信息。对于信号发送函数来说也是一样的。

    (二)、实时信号与非实时信号

    早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。

    非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

    (三),信号名称

    查看linux所支持的信号可用:kill –l

    共64种:

    QQ截图20130714104059
    QQ截图20130714104217
    QQ截图20130714104231

    3、进程对信号的响应
    进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考[2]以及其它资料。注意,进程对实时信号的缺省反应是进程终止。

    linux交流裙:112–6743–406
    最后分享相关linux学习资料
    linux系统信号
    http://www.makeru.com.cn/live/5413_1936.html?s=156461

    展开全文
  • linux 中断信号

    2015-12-05 00:50:12
    一,什么是中断? 1.中断的基本概念 中断是指计算机在执行期间,系统内发生任何非寻常的或非...中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。

    一,什么是中断?

    1.中断的基本概念

    中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。引起中断发生的事件被称为中断源。中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。

    在有些情况下,尽管产生了中断源和发出了中断请求,但CPU内部的处理器状态字PSW的中断允许位已被清除,从而不允许CPU响应中断。这种情况称为禁止中断。CPU禁止中断后只有等到PSW的中断允许位被重新设置后才能接收中断。禁止中断也称为关中断,PSW的中断允许位的设置也被称为开中断。开中断和关中断是为了保证某段程序执行的原子性。

    还有一个比较常用的概念是中断屏蔽。中断屏蔽是指在中断请求产生之后,系统有选择地封锁一部分中断而允许另一部分中断仍能得到响应。不过,有些中断请求是不能屏蔽甚至不能禁止的,也就是说,这些中断具有最高优先级,只要这些中断请求一旦提出,CPU必须立即响应。例如,电源掉电事件所引起的中断就是不可禁止和不可屏蔽的。

    2.中断的分类与优先级

    根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。

    根据中断源产生的条件,可把中断分为外中断和内中断。外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。

    内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。

    为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。例如在UNIX系统中,外中断和陷阱的优先级共分为8级。为了禁止中断或屏蔽中断,CPU的处理器状态字PSW中也设有相应的优先级。如果中断源的优先级高于PSW的优先级,则CPU响应该中断源的请求;反之,CPU屏蔽该中断源的中断请求。

    各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。

    除了在优先级的设置方面有区别之外,中断和陷阱还有如下主要区别:

    陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。

    CPU执行完一条指令之后,下一条指令开始之前响应中断,而在一条指令执行中也可以响应陷阱。例如执行指令非法时,尽管被执行的非法指令不能执行结束,但CPU仍可对其进行处理。

    3.软中断

    软中断的概念主要来源于UNIX系统。软中断是对应于硬中断而言的。通过硬件产生相应的中断请求,称为硬中断。而软中断则不然,它是在通信进程之间通过模拟硬中断而实现的一种通信方式。中断源发出软中断信号后,CPU或者接收进程在“适当的时机”进行中断处理或者完成软中断信号所对应的功能。这里“适当的时机”,表示接收软中断信号的进程须等到该接收进程得到处理器之后才能进行。如果该接收进程是占据处理器的,那么,该接收进程在接收到软中断信号后将立即转去执行该软中断信号所对应的功能。

    4.中断处理过程

    一旦CPU响应中断,转人中断处理程序,系统就开始进行中断处理。下面对中断处理过程进行详细说明:

    1)CPU检查响应中断的条件是否满足。CPU响应中断的条件是:有来自于中断源的中断请求、CPU允许中断。如果中断响应条件不满足,则中断处理无法进行。

    2)如果CPU响应中断,则CPU关中断,使其进入不可再次响应中断的状态。

    3)保存被中断进程现场。为了在中断处理结束后能使进程正确地返回到中断点,系统必须保存当前处理器状态字PSW和程序计数器PC等的值。这些值一般保存在特定堆栈或硬件寄存器中。

    4)分析中断原因,调用中断处理子程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。在系统中,为了处理上的方便,通常都是针对不同的中断源编制有不同的中断处理子程序(陷阱处理子程序)。这些子程序的人口地址(或陷阱指令的人口地址)存放在内存的特定单元中。再者,不同的中断源也对应着不同的处理器状态字PSW。这些不同的PSW被放在相应的内存单元中,与中断处理子程序人口地址一起构成中断向量。显然,根据中断或陷阱的种类,系统可由中断向量表迅速地找到该中断响应的优先级、中断处理子程序(或陷阱指令)的入口地址和对应的PSW。

    5)执行中断处理子程序。对陷阱来说,在有些系统中则是通过陷阱指令向当前执行进程发出软中断信号后调用对应的处理子程序执行。

    6)退出中断,恢复被中断进程的现场或调度新进程占据处理器。

    7)开中断,CPU继续执行。

    5.设备管理程序与中断方式

    处理器的高速和输入输出设备低速之间的矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中的CPU等待时间以及提高系统的并行工作效率,采用中断方式来控制输入输出设备和内存与CPU之间的数据传送,是很有必要的。

    在硬件结构上,这种方式要求CPU与输入输出设备(或控制器)之间有相应的中断请求线,而且在输入输出设备控制器的控制状态寄存器上有相应的中断允许位。

    二,什么是信号?

    1、信号及信号来源

    信号本质

    信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

    信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。

    信号来源

    信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

    2、信号的种类

    可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。在《Linux环境进程间通信(一):管道及有名管道》的附1中列出了系统所支持的所有信号。

    (一)、可靠信号与不可靠信号

    "不可靠信号"

    Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:

    • 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
    • 信号可能丢失,后面将对此详细阐述。 
      因此,早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。

    Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。

    "可靠信号"

    随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种Unix版本分别在这方面进行了研究,力图实现"可靠信号"。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。同时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。POSIX.4对可靠信号机制做了标准化。但是,POSIX只对可靠信号机制应具有的功能以及信号机制的对外接口做了标准化,对信号机制的实现没有作具体的规定。

    信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。

    注:不要有这样的误解:由sigqueue()发送、sigaction安装的信号就是可靠的。事实上,可靠信号是指后来添加的新信号(信号值位于SIGRTMIN及SIGRTMAX之间);不可靠信号是信号值小于SIGRTMIN的信号。信号的可靠与不可靠只与信号值有关,与信号的发送及安装函数无关。目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。同时,由signal()安装的实时信号支持排队,同样不会丢失。

    对于目前linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数(对所有信号这一点都成立),而经过signal安装的信号却不能向信号处理函数传递信息。对于信号发送函数来说也是一样的。

    (二)、实时信号与非实时信号

    早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。

    非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

    (三),信号名称

    查看linux所支持的信号可用:kill –l

    共64种:

    QQ截图20130714104059

    QQ截图20130714104217

    QQ截图20130714104231

    3、进程对信号的响应

    进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考[2]以及其它资料。注意,进程对实时信号的缺省反应是进程终止。

    Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。

    展开全文
  • PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据。只是MSI-X中断机制为了支持更多的中断请求,在MSI-X Capablity结构中存放了一个指向...

    PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据。只是MSI-X中断机制为了支持更多的中断请求,在MSI-X Capablity结构中存放了一个指向一组Message Address Message Data字段的指针,从而一个PCIe设备可以支持的MSI-X中断请求数目大于32个,而且并不要求中断向量号连续。MSI-X机制使用的这组Message Address Message Data字段存放在PCIe设备的BAR空间中,而不是在PCIe设备的配置空间中,从而可以由用户决定使用MSI-X中断请求的数目。

    当系统软件初始化PCIe设备时,如果该PCIe设备使用MSI-X机制传递中断请求,需要对MSI-X Capability结构指向的Message AddressMessage Data字段进行设置,并使能MSI-X Enable位。x86处理器在此处的实现与PowerPC处理器有较大的不同。

    6.3.1 Message Address字段和Message Data字段的格式

    x86处理器系统中,PCIe设备也是通过向Message Address写入Message Data指定的数值实现MSI/MSI-X机制。在x86处理器系统中,PCIe设备使用的Message Adress字段和Message Data字段与PowerPC处理器不同。

    1 PCIe设备使用Message Adress字段

    x86处理器系统中,PCIe设备使用的Message Address字段仍然保存PCI总线域的地址,其格式如6?7所示。

    其中第31~20位,存放FSB Interrupts存储器空间的基地址,其值为0xFEE。当PCIe设备对0xFEEX-XXXX这段“PCI总线域”的地址空间进行写操作时,MCH/ICH将会首先进行“PCI总线域”到“存储器域”的地址转换,之后将这个写操作翻译为FSB总线的Interrupt Message总线事务,从而向CPU内核提交中断请求。

    x86处理器使用FSB Interrupt Message总线事务转发MSI/MSI-X中断请求。使用这种方法的优点是向CPU内核提交中断请求的同时,提交PCIe设备使用的中断向量,从而CPU不需要使用中断响应周期从寄存器中获得中断向量。FSB Interrupt Message总线事务的详细说明见下文。

    Message Address字段其他位的含义如下所示。

    • Destination ID字段保存目标CPUID号,目标CPUID与该字段相等时,目标CPU将接收这个Interrupt MessageFSB Interrupt Message总线事务可以向不同的CPU提交中断请求。
    • RH(Redirection Hint Indication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH1时,将使能中断转发功能。
    • DM(Destination Mode)位表示在传递优先权最低的中断请求时,Destination ID字段是否被翻译为Logical或者Physical APIC ID。在x86处理器中APIC ID有三种模式,分别为PhysicalLogicalCluster ID模式。
    • 如果RH位为1DM位为0时,Destination ID字段使用Physical模式;如果RH位为1DM位为1Destination ID字段使用Logical模式;如果RH位为0DM位将被忽略。

    以上这些字段的描述与x86处理器使用的APIC中断控制器相关。对APIC的详细说明超出了本书的范围,对此部分感兴趣的读者请参阅Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1

    2 Message Data字段

    Message Data字段的格式如6?8所示。

    Trigger Mode字段为0b0x时,PCIe设备使用边沿触发方式申请中断;为0b10时使用低电平触发方式;为0b11时使用高电平触发方式。MSI/MSI-X中断请求使用边沿触发方式,但是FSB Interrupt Message总线事务还支持Legacy INTx中断请求方式,因此在Message Data字段中仍然支持电平触发方式。但是对于PCIe设备而言,该字段为0b0x

    Vector字段表示这个中断请求使用的中断向量。FSB Interrupt Message总线事务在提交中断请求的同时,将中断向量也通知给处理器。因此使用FSB Interrupt Message总线事务时,处理器不需要使用中断响应周期通过读取中断控制器获得中断向量号。与PowerPC的传统方式相比,x86处理器的这种中断请求的效率较高[]

    值得注意的是,在x86处理器中,MSI机制使用的Message Data字段与MSI-X机制相同。但是当一个PCIe设备支持多个MSI中断请求时,其Message Data字段必须是连续的,因而其使用的Vector字段也必须是连续的,这也是在x86处理器系统中,PCIe设备支持多个MSI中断请求的问题所在,而使用MSI-X机制有效避免了该问题。

    Delivery Mode字段表示如何处理来自PCIe设备的中断请求。

    • 该字段为0b000时,表示使用“Fixed Mode”方式。此时这个中断请求将被Destination ID字段指定的CPU处理。
    • 该字段为0b001时,表示使用“Lowest Priority”方式。此时这个中断请求将被优先权最低的CPU处理。当使用“Fixed Mode”和“Lowest Priority”方式时,如果Vector字段有效,CPU接收到这个中断请求之后,将使用Vector字段指定的中断向量处理这些中断请求;而当Delivery Mode字段为其他值时,Message Data字段中所包含的Vector字段无效。
    • 该字段为0b010时,表示使用SMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段必须为0。这个中断请求将被Destination ID字段指定的CPU处理。
    • 该字段为0b100时,表示使用NMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。
    • 该字段为0b101时,表示使用INIT方式传递中断请求,Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。
    • 该字段为0b111时,表示使用INTR信号传递中断请求且使用边沿触发。此时MSI中断信息首先传递给中断控制器,然后中断控制器在通过INTR信号向CPU传递中断请求,之后CPU在通过中断响应周期获得中断向量。上文中PowerPC处理器使用的方法与此方法类似。而在x86处理器中多使用Interrupt Message总线事务进行MSI中断信息的传递,因此这种模式很少被使用。

    边沿触发和电平触发是中断请求常用的两种方式。其中电平触发指外部设备使用逻辑电平1(高电平触发)或者0(低电平触发),提交中断请求。使用电平或者边沿方式提交中断请求时,外部设备一般通过中断线(IRQ_PIN#)与中断控制器相连,其中多个外部设备可能通过相同的中断线与中断控制器相连(线与或者与门)

    外部设备在使用低电平触发,提交中断请求的过程中,首先需要将IRQ_PIN#信号驱动为低。当中断控制器将该中断请求提交给处理器,而且处理器将这个中断请求处理完毕后,处理器将通过写外部设备的某个寄存器来清除此中断源,此时外部设备将不再驱动IRQ_PIN#信号线,从而结束整个中断请求。

    IRQ_PIN#信号线可以被多个外部设备共享,在这种情况之下,只有所有外部设备都不驱动IRQ_PIN#信号线时,IRQ_PIN#信号才为高电平。采用电平触发方式进行中断请求的优点是不会丢失中断请求,而缺点是一个优先权较高的中断请求有可能会长期占用中断资源,从而使其他优先权较低的中断不能被及时提交。因为优先级别较高的中断源有可能会持续不断地驱动IRQ_PIN#信号。

    而边沿触发使用上升沿(01)或者下降沿(10)作为触发条件,但是中断控制器并不是使用这个“边沿”作为触发条件。中断控制器使用内部时钟对IRQ_PIN#信号进行采样,如果在前一个时钟周期,IRQ_PIN#信号为0,而后一个时钟周期,IRQ_PIN#信号为1,中断控制器认为外部设备提交了一个有效“上升沿”,中断控制器会锁定这个“上升沿”并向处理器发出中断请求。这也是外部设备至少需要将IRQ_PIN#信号保持一个时钟采样周期的原因,否则中断控制器可能无法识别本次边沿触发的中断请求,从而产生Spurious中断请求。

    外部设备使用“上升沿”进行中断申请时,不需要持续地将IRQ_PIN#信号驱动为1,而只需要保证中断控制器可以进行正确采样这些中断信号即可。在处理边沿触发中断请求时,处理器不需要清除中断源。

    使用边沿触发可以有效避免“优先级别”较高的中断源长期占用IRQ_PIN#信号的情况,使用“下降沿”触发进行中断请求与“上升沿”触发类似。

    但是外部设备使用边沿触发方式时,有可能会丢失一些中断请求。例如在一个处理器系统中,存在一个定时器,这个定时器使用上升沿触发方式向中断控制器定时提交中断。如果当处理器正在处理这个定时器的上一个中断请求时,将不会处理这个定时器发出的其他“边沿”中断请求,从而导致中断丢失。而使用电平触发方式不会出现这类问题,因为电平触发方式是一个“持续”过程,处理器只有处理完毕当前中断,并清除相应中断源之后,才会处理下一个中断源。

    MSI中断请求实际上和边沿触发方式非常类似,MSI中断请求通过存储器写TLP实现,这个写动作是一个瞬间的动作,并不是一个持续请求,因此在x86处理器中MSI中断请求使用边沿触发进行中断请求。

    还有一些外部设备可以通过I/O APIC进行中断请求[],这些I/O APIC接收的外部中断需要标明是使用边沿或者电平触发,I/O APIC使用FSB Interrupt Message总线事务将中断请求发向Local APIC,并由Local APIC向处理器提交中断请求。

    6.3.2 FSB Interrupt Message总线事务

    MPC8572处理器处理MSI中断请求不同,x86处理器使用FSBInterrupt Message总线事务,处理PCIe设备的MSI/MSI-X中断请求。由上文所示,MPC8572处理器处理MSI中断请求时,首先由MPIC中断控制器截获这个MSI中断请求,之后由MPIC中断控制器向CPU提交中断请求,而CPU通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。

    采用这种方式的主要问题是,当一个处理器中存在多个CPU时,这些CPU都需要通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。在一个中断较为密集的应用中,ACK寄存器很可能会成为系统瓶颈。而采用Interrupt Message总线事务可以有效地避免这种系统瓶颈,因为使用这种方式中断信息和中断向量将同时到达指定的CPU,而不需要使用中断响应周期获得中断向量。

    x86处理器也具有通过中断控制器提交MSI/MSI-X中断请求的方法,在I/O APIC具有一个 The IRQ Pin Assertion Register”寄存器,该寄存器地址为0xFEC00020[],其第4~0位存放IRQ Number。系统软件可以将PCIe设备的Message Address寄存器设置为0xFEC00020,将Meaasge Data寄存器设置为相应的IRQ Number

    PCIe设备需要提交MSI中断请求时,将向PCI总线域的0xFEC00020地址写入Message Data寄存器中的数据。此时这个存储器写请求将数据写入I/O APICThe IRQ Pin Assertion Register中,并由I/O APIC将这个MSI中断请求最终发向Local APIC,之后再由Local APIC通过INTR#信号向CPU提交中断请求。

    上述步骤与MPC8572处理器传递MSI中断的方法类似。在x86处理器中,这种方式基本上已被弃用。下文以6?9为例,说明x86处理器如何使用FSB总线的Interrupt Message总线事务,向CPU提交MSI/MSI-X中断请求。

    PCIe设备在发送MSI/MSI-X中断请求之前,系统软件需要合理设置PCIe设备MSI/MSI-X Capability寄存器,使Message Address寄存器的值为0xFEExx00y[],同时合理地设置Message Data寄存器Vector字段。

    PCIe设备提交MSI/MSI-X中断请求时,需要向0xFEExx00y地址写Message Data寄存器中包含的数据,并以存储器写TLP的形式发送到RC。如果ICH收到这个存储器写TLP时,将通过DMI接口将这个TLP提交到MCHMCH收到这个TLP后,发现这个TLP的目的地址在FSB Interrupts存储器空间中,则将PCIe总线的存储器写请求转换为Interrupt Message总线事务,并在FSB总线上广播。

    FSB总线上的CPU,根据APIC ID信息,选择是否接收这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断服务例程,而不需要从APIC中断控制器获得中断向量。与PowerPC处理器的MPIC中断控制器相比,这种方法更具优势。

    6.4 小结

    本章详细描述了MSI/MSI-X中断机制的原理,并以PowerPCx86两个处理器系统为例说明这两种中断机制实现机制。本章因为篇幅有限,并没有详细讲述这两个处理器使用的中断控制器。而理解这些中断控制器的实现机制是进一步理解MSI/MSI-X中断机制的要点。对此部分有兴趣的读者可以继续阅读MPIC中断控制器和APIC中断控制器的实现机制,以加深对MSI/MSI-X中断机制的理解。

    设备的中断处理是局部总线的设计难点和重要组成部分,而中断处理的效率直接决定了局部总线的数据传送效率。在一个处理器系统的设计与实现中,中断处理的优化贯彻始终。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    转载于:https://www.cnblogs.com/mao0504/p/4706962.html

    展开全文
  • linux中断--中断嵌套&中断请求丢失

    千次阅读 2014-04-14 20:06:04
    在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被...
  • 中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。 在有些情况下,尽管产生了中断源和发出了中断请求,但CPU内部的处理器状态字PSW的中断允许位已被清除,...
  • 1. 碎碎念 作为一个上学能忘记带书包,出门能忘记带钥匙的人。兴冲冲的去看书,发现自己木有带...对于中断信号、锁、信号量这几个操作系统课本里常见的概念,笔者始终是木有理解清楚过。大概率是因为我上学的时候...
  • linux中断--LINUX中断机制与信号

    千次阅读 2013-09-22 21:49:13
    在学习APUE时学习信号编程,很多地方不是理解,便查阅了网络上的相关资料,最常见的一句话就是“信号中断机制的一种模拟”,既然提到了中断,那就首先了解了一下中断的具体分类以及实现,最后再找出中断信号的...
  • 中断分类

    2008-12-07 16:20:33
    程序运行期间,遇到某些特殊情况,需要CPU暂停当前正在执行的程序,转去执行其它的专门...根据中断源的不同,中断分为: ☆硬中断(外部中断):是通过外部设备接口,向CPU的中断请求引脚INT和NMI发中断请求信号产...
  • LINUX中断机制与信号

    千次阅读 2013-04-16 08:46:17
    在学习APUE时学习信号编程,很多地方不是理解,便查阅了网络上的相关资料,最常见的一句话就是“信号中断机制的一种模拟”,既然提到了中断,那就首先了解了一下中断的具体分类以及实现,最后再找出中断信号的...
  • 中断分类(异常 与 中断

    千次阅读 2014-02-18 15:56:44
    中断分类中断可分为同步(synchronous)中断和异步...这里的同步是指中断请求信号与代码指令之间的同步执行,即只有在一条指令执行完毕后,而不是执行期间,CPU 才会发出中断。异步中断由其他硬件设备产生,又称为外部中断。
  • 文章目录第八章 中断系统8.1 中断的基本概念8.1.1 中断概念的引入及描述中断方式示意(以输入中断为例)**中断**的定义8.1.2 中断源及中断分类中断分类8.1.3 中断类型码中断类型码中断向量中断向量表中断向量表的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,351
精华内容 6,940
关键字:

中断请求信号分类