您的位置 首页 发布

Linux中的中止处理剖析

前两天一直在思考一个问题,在PCI-Express总线引入Linux之后,Linux的中断处理部分会有什么变化呢?要回答这个问题首先需要分析一下Linux系统是如何调用

前两天一直在考虑一个问题,在PCI-Express总线引进Linux之后,Linux的中止处理部分会有什么改变呢?要回答这个问题首要需求剖析一下Linux体系是怎么调用中止服务程序的。其实,正因为Linux对中止处理部分杰出的封装性,使得PCI总线向PCI-Express过渡时没有触及到结构性的改变。

其实, 几年前第一次剖析Linux中止处理函数的时分就觉得十分古怪,Linux将一切的中止处理都需求经过一个do_IRQ的函数完结。也便是说,Linux没有充分使用不同处理器体系架构在中止处理方面的不同,没有充分使用中止向量表的效果。在X86处理器上,咱们都知道不同的中止号对应不同的中止向量,当一个中止产生的时分,处理器会直接跳转到对应中止向量表的方位,然后履行中止向量表处的对应函数。明显Linux没有充分使用中止向量表,一旦进入中止之后,不论是什么中止,Linux会经过中止向量表履行do_IRQ这样一个公共函数。然后在这个公共函数中再经过中止号查找对应的中止服务程序。这样的处理明显增加了中止服务程序的调用推迟。Linux的中止处理函数do_IRQ调用进程示例代码如下所示:

IRQn_interrupt: pushl $n-256 jmp common_interrupt common_interrupt: SAVE_ALL call do_IRQ jmp ret_from_intr

在do_IRQ函数中,Linux会经过事前存储的中止号(push $n-256)在irq_desc[]数组中找到对应的中止服务程序集。因为许多外部设备都是同享中止的,特别是传统的PCI设备是同享中止号的,因而,Linux会顺次履行这些中止服务程序集。在中止服务程序中,首要需求读取对应设备的中止状况寄存器,来判别这个中止是否是自己的,假如是自己的,那么招领这个中止,履行中止上半部的操作,不然,将这个中止履行的时机让给其他的服务程序。Linux中的irq_desc[]和irq_action是中止处理进程中的要害结构,设备驱动程序这册中止操作也便是将中止服务程序注册到这些结构中,这两个结构的联系咱们能够表明如下:

经过上述剖析,我觉得Linux的这种处理不是最佳处理的,长处是关于不同体系结构的处理器具有普适性。经过do_IRQ函数能够将一切处理器在中止处理机制方面的差异给屏蔽掉,可是,确实丢失了中止处理的实时性。在ARM处理器中,为了进步中止处理实时性,将中止处理分为向量中止(vector interrupt)和快速中止(fast interrupt)两类。在一般的ARM编程中,咱们会对应的中止服务程序注册到一个中止向量上,当这个中止被触发的时分,ARM处理器会主动加载中止服务程序地址到一个寄存器中,该寄存器的地址会被填写到中向量表中,因而,ARM会直接调用履行中止服务程序。中止服务程序只需保存寄存器现场即可。关于快速中止,ARM的处理愈加直接直接,并且硬件会主动保存寄存器现场,节省了中止服务程序调用时钟周期,进步了体系的呼应才能。假如选用Linux的机制,那么硬件供给的一些优势悉数付之一炬,可是换回的是可移植性。关于实时体系而言,这个当地是需求修正的。

传统的PCI总线选用的是同享中止的方法,带来的问题便是中止处理实时性不行,每次产生PCI中止的时分,注册在相同中止向量上的服务程序都需求查询自己的中止状况寄存器,以此来判别该中止是否归于自己。为了处理这个问题,PCI在演进进程中提出了SMI中止的内容,PCI设备向CPU宣布中止请求时,直接向总线发送SMI音讯,Root Complex中的APIC在接收到这个音讯之后,有两种方法将这个中止业务上报给处理器:第一种方法是在Root Complex中的APIC上界说一个寄存器,在这个寄存器中能够存储PCI设备提交的中止向量号,当APIC接收到中止业务之后,会向处理器提交中止请求(INTX),CPU进入中止服务程序之后,会查询APIC中的寄存器得到中止向量,然后调用该中止向量对应的中止服务程序;第二种方法是APIC在接收到中止业务之后,向处理器发送一个FSB中止业务,CPU接收到这个FSB的中止业务后,会进入中止状况,并且从该业务中取得中止向量号,然后直接调用对应的中止服务程序。明显,第一种方法需求额定的寄存器拜访推迟,而第二种方法选用FSB的中止业务直接将中止向量号告知处理器,这种方法的功率会更高。

关于PCI设备端,需求完成SMI中止机制,需求使用额定的中止装备空间。在设备驱动加载的时分,会给每个PCI设备分配SMI音讯发送给地址,以及对应的中止向量号,驱动程序 会将这些信息写入PCI设备装备空间。在PCI设备发送中止请求的时分,直接将分配的中止向量号经过PCI写业务写入分配的地址即可。

经过上述剖析,PCI-Express的SMI中止会将中止向量号提交给CPU,不论是处理器查询AP%&&&&&%寄存器仍是经过FSB中止业务告知给处理器,终究,在处理器进入中止之后能够得到对应设备的中止向量号,因而,能够直接调用现有的do_IRQ来履行中止服务程序。并且,PCI-Express设备没有必要同享中止向量号,因而,中止服务程序处理的功率确实高了不少。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/298271.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部