- -
一、引言
处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果核采取让处理器向硬件发出一个请求,然后专门等待回应的方法,显然差强人意。既然硬件的响应这么慢,那么核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对它进展处理。想要实现这种功能,轮询(polling)可能会是一种解决方法。可以让核定期对设备的状态进展查询,然后做出相应的处理。不过这种方法很可能会让核做不少无用功,因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,轮询总会周期性地重复执行。更好的方法是由我们来提供一种机制,让硬件在需要的时候再向核发出信号(变核主动为硬件主动),这就是中断机制。
众所周知,在C++中有着较为完善的异常处理机制,同样在C语言中也有很不错的异常处理机制来支持,另外在其它许多现代编程语言中,也都有各自的异常处理编程机制,如Ada语言等。但我们更应该知道这些编程语言所提供的异常处理机制的实现,都是建立在操作系统中所提供的异常处理机制之上,如Windows平台上的VC编译器所实现的C++异常处理模型,它就是建立在SEH机制之上的。如果没有采用这种方式,比方Linux操作系统上的gcc就没有采用到操作系统中所提供的异常处理机制,这样就会有一个很大的缺点,那就是对于应用程序的开发者而言,它不能够很好在自己的应用程序中,来有效控制操作系统中所出现的一些意外的系统异常,例如程序执行过程中可能出现的段错误,被零除等计算异常,以及其它许多不同类型的系统异常等。所以Linux操作系统上的gcc编译的程序中,它只能捕获程序中,曾经被自己显式地抛出来的异常,而对于系统异常,catch block那么毫无方法。
. -可修编-
- -
因此,操作系统平台中所提供的中断、异常处理机制是非常有必要的。它除了能够帮助开发人员发现和解决软件中的错误外,还被广泛应用于软件保护技术、软件漏洞利用等方面。因此,深入研究中断、异常处理机制的原理和实现以扩展其应用的围是有必要的。
二、中断处理方式
Ⅰ、WINDOWS系统的中断处理方式
Windows核对于中断使用了陷阱派发机制,它使用中断陷阱处理器来响应设备的中断,中断陷阱处理器或者将控制权给负责处理中断的外部例程〔中断效劳程序,ISR〕,或者传递给一个响应该中断的部核例程。设备驱动程序提供了ISR来处理设备中断,核为其他类型的中断提供了ISR。
Windows的中断主要有硬件中断和软件中断,通过Windows核心我们可以制止软件中断和硬件中断。软件中断主要引发对线程的调度以及以异步方式打断一个线程执行的机制。而硬件中断主要是为了实现处理器和设备并行工作。对于硬件中断,Windows 将硬件中断转化为能够触发执行的驻留在不同虚拟机中的ISR〔中断效劳程序〕事件,这是一个较好的中断处理方法。下面我们来讨论一下Windows系统的硬件终端处理机制。
在Windows系统下,处理器可以在不同的状态〔V86、实模式和保护模式〕下运行。当DOS运行时,那么处理器运行V86模式。当Windows 执行时或当DOS VM已经切换进保护模式时,处理器那么运行Ring3保护模式。当VMM〔虚拟机管理器〕或VXD〔虚拟设备驱动程序〕执行时,处理器那么运行在Ring0 保护模式。在Windows系统环境中,Windows将所有的IDT入口指向VMM 中的一个函数。VMM
. -可修编-
- -
会判断出来自IDT入口项的调用是作为异常被调用还是作为中断被调用。VMM本身负责处理异常而将所有硬件中断交给一个名为VPICD〔虚拟可编程中断控制器设备〕的VXD。如果某个VXD 已经为某个硬件中断注册了中断处理函数,那么VPICD 就将中断传递给该VXD。如果没有,VPICD 将把某个中断传递给某个VM,这一过程被称作“中断反射〞。
VXD通过调用VPICD的VPICD_Viutualize_IRQL 效劳函数为特定的硬件中断注册并将回调函数传递给VPICD。一旦VXD 已经为中断注册,它将作为一个真正的中断处理器,为中断设备进展中断效劳,同时VXD 可能使用另一个VPICD 效劳函数VPICD_Set_Int_Request来把中断映射到VM,让VM 的中断处理函数来提供效劳。
从IDT 到VXD 中断处理函数的途径
在使用中断效劳时,我们也要对以下情况进展注意。
1、中断响应时间:为了实现实时操作,一般要求中断响应时间尽可能的短。
由于硬件中断的响应过程比拟复杂,中断响应时间通常在1ms 以上。为了使中断响应时间最短,硬件中断的处理应在VXD 中进展。但即使在VXD 中进展,VXD 也不能保证对硬件中断的实时响应。原因在于ring 转换以及VMM 和VPICD之间存在多个层次的联系。
2、中断完毕处理〔EOI〕:在编写中断处理函数时,常见的错误是忘记EOI,
. -可修编-