WindowsLinux中断、异常处理机制分析

上传人:s9****2 文档编号:507509024 上传时间:2023-07-22 格式:DOC 页数:9 大小:132.50KB
返回 下载 相关 举报
WindowsLinux中断、异常处理机制分析_第1页
第1页 / 共9页
WindowsLinux中断、异常处理机制分析_第2页
第2页 / 共9页
WindowsLinux中断、异常处理机制分析_第3页
第3页 / 共9页
WindowsLinux中断、异常处理机制分析_第4页
第4页 / 共9页
WindowsLinux中断、异常处理机制分析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《WindowsLinux中断、异常处理机制分析》由会员分享,可在线阅读,更多相关《WindowsLinux中断、异常处理机制分析(9页珍藏版)》请在金锄头文库上搜索。

1、一、引言处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。既然硬件的响应这么慢,那么内核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对它进行处理。想要实现这种功能,轮询(polling)可能会是一种解决办法。可以让内核定期对设备的状态进行查询,然后做出相应的处理。不过这种方法很可能会让内核做不少无用功,因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,轮询总会周期性地重复执行。更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信号(变内核主动为硬件主动),这就是

2、中断机制。众所周知,在C+中有着较为完善的异常处理机制,同样在C语言中也有很不错的异常处理机制来支持,另外在其它许多现代编程语言中,也都有各自的异常处理编程机制,如Ada语言等。但我们更应该知道这些编程语言所提供的异常处理机制的实现,都是建立在操作系统中所提供的异常处理机制之上,如Windows平台上的VC编译器所实现的C+异常处理模型,它就是建立在SEH机制之上的。如果没有采用这种方式,比如Linux操作系统上的gcc就没有采用到操作系统中所提供的异常处理机制,这样就会有一个很大的缺点,那就是对于应用程序的开发者而言,它不能够很好在自己的应用程序中,来有效控制操作系统中所出现的一些意外的系统

3、异常,例如程序执行过程中可能出现的段错误,被零除等计算异常,以及其它许多不同类型的系统异常等。所以Linux操作系统上的gcc编译的程序中,它只能捕获程序中,曾经被自己显式地抛出来的异常,而对于系统异常,catch block则毫无办法。因此,操作系统平台中所提供的中断、异常处理机制是非常有必要的。它除了能够帮助开发人员发现和解决软件中的错误外,还被广泛应用于软件保护技术、软件漏洞利用等方面。因此,深入研究中断、异常处理机制的原理和实现以扩展其应用的范围是有必要的。二、中断处理方式、WINDOWS系统的中断处理方式Windows内核对于中断使用了陷阱派发机制,它使用中断陷阱处理器来响应设备的中

4、断,中断陷阱处理器或者将控制权给负责处理中断的外部例程(中断服务程序,ISR),或者传递给一个响应该中断的内部内核例程。设备驱动程序提供了ISR来处理设备中断,内核为其他类型的中断提供了ISR。Windows的中断主要有硬件中断和软件中断,通过Windows核心我们可以禁止软件中断和硬件中断。软件中断主要引发对线程的调度以及以异步方式打断一个线程执行的机制。而硬件中断主要是为了实现处理器和设备并行工作。对于硬件中断,Windows 将硬件中断转化为能够触发执行的驻留在不同虚拟机中的ISR(中断服务程序)事件,这是一个较好的中断处理方法。下面我们来讨论一下Windows系统的硬件终端处理机制。在

5、Windows系统下,处理器可以在不同的状态(V86、实模式和保护模式)下运行。当DOS运行时,则处理器运行V86模式。当Windows 执行时或当DOS VM已经切换进保护模式时,处理器则运行Ring3保护模式。当VMM(虚拟机管理器)或VXD(虚拟设备驱动程序)执行时,处理器则运行在Ring0 保护模式。在Windows系统环境中,Windows将所有的IDT入口指向VMM 中的一个函数。VMM会判断出来自IDT入口项的调用是作为异常被调用还是作为中断被调用。VMM本身负责处理异常而将所有硬件中断交给一个名为VPICD(虚拟可编程中断控制器设备)的VXD。如果某个VXD 已经为某个硬件中断

6、注册了中断处理函数,那么VPICD 就将中断传递给该VXD。如果没有,VPICD 将把某个中断传递给某个VM,这一过程被称作“中断反射”。VXD通过调用VPICD的VPICD_Viutualize_IRQL 服务函数为特定的硬件中断注册并将回调函数传递给VPICD。一旦VXD 已经为中断注册,它将作为一个真正的中断处理器,为中断设备进行中断服务,同时VXD 可能使用另一个VPICD 服务函数VPICD_Set_Int_Request来把中断映射到VM,让VM 的中断处理函数来提供服务。从IDT 到VXD 中断处理函数的途径在使用中断服务时,我们也要对下列情况进行注意。1、中断响应时间:为了实现

7、实时操作,一般要求中断响应时间尽可能的短。由于硬件中断的响应过程比较复杂,中断响应时间通常在1ms 以上。为了使中断响应时间最短,硬件中断的处理应在VXD 中进行。但即使在VXD 中进行,VXD 也不能保证对硬件中断的实时响应。原因在于ring 转换以及VMM 和VPICD之间存在多个层次的联系。2、中断结束处理(EOI):在编写中断处理函数时,常见的错误是忘记EOI,导致一个硬件中断仅被调用一次。虽然设备本身能产生更多的中断,但是PIC(可编程中断控制器)不让这些中断到达处理器,并会一直持续到PIC 接受到EOI 为止。Windows 使用与DOS 不同的中断控制器的EOI机制。VPICD

8、是被中断通知的第一个VXD,然后VPICD 立即发送“特定EOI” 到控制器。然后VPICD 屏蔽控制器上的中断级别。这两个操作使得其他的中断级别可以被识别,包括那些比正在中断的级别低的优先权。当VXD 在退出中断处理函数前调用VPICD_Phys_EOI 服务函数时,VPICD 将清除相同级别上的中断的屏蔽。3、内存管理:处理硬件中断的驱动程序对所有分配的内存有严格的要求。所有在中断期间要访问的代码和数据都必须是固定的、页码锁定的和不可废弃的。这包括中断处理函数本身的代码以及在中断处理过程中要用到的驱动程序代码段、任何动态分配的缓冲区和应用程序分配的要传递给驱动程序的缓冲区。内存要求必须是固

9、定的。因为内存管理器把中断处理函数要用到的数据段移动了,在一些字节被拷贝后,硬件中断发生,这时硬件中断处理函数被执行。硬件中断处理函数会更新正在移动的数据段中的一些内容,当处理函数结束运行之后,内存管理器接着移动数据段,而这时的数据段已经被处理函数更改过了。内存管理器并不知道处理函数已经改变了数据。而使用该数据段的应用程序就得不到希望得到的数据。同时内存又要求必须是页面锁定的。假设硬件中断发生了,而内存管理器是在可废弃的代码中,那么就会发生段不在内存中的警告,在此种情况下就有可能发生重入DOS 的情况,而DOS 代码是不可重入的,所以代码段是不可废弃的。、LINUX系统的中断处理方式当一个中断

10、发生时,并不是所有的操作都具有相同的急迫性。事实上,把所有的操作都放进中断处理程序本身并不合适。需要时间长的、非重要的操作应该推后,因为当一个中断处理程序正在运行时,相应的IRQ 中断线上再发出的信号就会被忽略。另外中断处理程序不能执行任何阻塞过程,如I/O 设备操作。因此,Linux 把一个中断要执行的操作分为下面的三类:1、紧急的(Critical)这样的操作诸如:中断到来时中断控制器做出应答,对中断控制器或设备控制器重新编程,或者对设备和处理器同时访问的数据结构进行修改。这些操作都是紧急的,应该被很快地执行,也就是说,紧急操作应该在一个中断处理程序内立即执行,而且是在禁用中断的状态下。2

11、、非紧急的(Noncritical)这样的操作诸如:修改那些只有处理器才会访问的数据结构(例如,按下一个键后,读扫描码)。这些操作也要很快地完成,因此,它们由中断处理程序立即执行,但在启用中断的状态下。3、非紧急可延迟的(Noncritical deferrable)这样的操作诸如:把一个缓冲区的内容拷贝到一些进程的地址空间(例如,把键盘行缓冲区的内容发送到终端处理程序的进程)。这些操作可能被延迟较长的时间间隔而不影响内核操作,有兴趣的进程会等待需要的数据。尽管分为上述的三种,但所有的中断处理程序都执行四个基本的操作:1、在内核栈中保存IRQ 的值和寄存器的内容;2、给与IRQ 中断线相连的中

12、断控制器发送一个应答,这将允许在这条中断线上进一步发出中断请求;3、执行共享这个IRQ 的所有设备的中断服务例程(ISR);4、跳到ret_to_usr( )的地址后终止。Linux系统的中断主要有3种组织形式:1、IRQ 描述符irq_desc:对于每个IRQ 中断线,Linux 都用一个irq_desc_t 数据结构来描述,我们把它叫做IRQ 描述符,NR_IRQS 个IRQ 形成一个全局数组irq_desc,其定义在/include/linux/irq.h 中。2、中断控制器描述符irq_chip:由于CPU 不同,故每个处理器对于中断的处理方式不一样。Linux 为了实现统一的中断处理

13、,提供了底层的中断处理抽象接口,对于每个平台都需要实现底层的接口函数。这样对于上层的中断通用处理程序就无需任何改动。3、中断服务例程描述符irqaction:在IRQ 描述符中我们看到指针action 的结构为irqaction,它是为多个设备能共享一条中断线而设置的一个数据结构,代表了每个注册中断对应的信息,其在include/linux/interrupt.h 中定义。下面我们来具体讨论一下中断过程。当外设的驱动程序都已完成了初始化工作,并且已把相应的中断服务例程挂入到特定的中断请求队列,同时当前进程正在用户空间运行(随时可以接受中断),且外设已产生了一次中断请求,CPU 就在执行完当前指

14、令后来响应该中断。中断处理系统在 Linux 中的实现是非常依赖于体系结构的,实现依赖于处理器、所使用的中断控制器的类型、体系结构的设计及机器本身。设备产生中断,通过总线把电信号发送给中断控制器。如果中断线是激活的,那么中断控制器就会把中断发往处理器。在大多数体系结构中,这个工作就是通过电信号给处理器的特定管脚发送一个信号。除非在处理器上禁止该中断,否则,处理器会立即停止它正在做的事,关闭中断系统,然后跳到内存中预定义的位置开始执行那里的代码。这个预定义的位置是由内核设置的,是中断处理程序的入口点。对于 ARM 系统来说,有个专用的IRQ 运行模式,有一个统一的入口地址。假定中断发生时CPU

15、运行在用户空间,而中断处理程序属于内核空间,因此,要进行堆栈的切换。也就是说,CPU 从TSS 中取出内核栈指针,并切换到内核栈(此时栈还为空)。对于在Linux系统,如果当前处于内核空间时,对于 ARM 系统来说是处于SVC 模式,此时产生中断,中断处理完毕后,若是可剥夺内核,则检查是否需要进行进程调度,否则直接返回到被中断的内核空间;若需要进行进程调度,则svc_preempt,进程切换。如果当前处于用户空间时,对于 ARM 系统来说是处于USR 模式,此时产生中断,中断处理完毕后,无论是否是可剥夺内核,都调转到统一的用户模式出口ret_to_user,其检查是否需要进行进程调度,若需要进

16、行进程调度,则进程切换,否则直接返回到被中断的用户空间。三、异常处理方式、WINDOWS系统的异常处理方式目前Windows 平台下实现和使用的异常处理机制主要有4 种:筛选器异常处理,结构化异常处理(Structure Exception Handler, SEH),向量化异常处理(Vectored Exception Handler,VEH),C+异常处理(C+ Exception Handler, C+EH)。前3 种是由Windows 操作系统实现的异常处理机制,C+EH 是由C+编译器实现的异常处理机制,但它们在其内部实现机理和调用底层函数方面是十分相似的。1、筛选器异常处理筛选器异常处理方式,它采用的是在进程范围内注册一个异常处理回调函数,并返回前一个注册的异常处理回调函数的句柄。注册函数如下:LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExce

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号