设备的中断处理函数由设备驱动程序提供,在当前版本的实现中,Hello China提供了完善的中断连接机制,可以通过ConnectInterrupt调用把特定的中断处理函数与相应的中断向量进行连接。
一般情况下,这个连接是在DriverEntry函数内完成的,在设备初始化的时候,就已经确定了设备所使用的中断号(系统分配,或设备驱动程序自己检测),中断号确定之后,就可以直接调用ConnectInterrupt函数,连接中断处理程序和中断向量了。在当前版本的实现中,对于设备的中断处理程序(中断处理函数),其原型必须符合下列形式:
其中,第二个参数为传递给中断处理程序的特定参数,第一个参数则是中断程序发生之后堆栈框架的指针,中断处理程序通过该参数(lpEsp),可以访问到中断发生之后的系统堆栈框架。
一般情况下,中断处理程序在开始的时候需要先判断该中断是不是自己的,因为在许多硬件设计环境中,可能多个设备共同使用一个中断向量(即多个设备连接到中断控制器的同一条输入引脚上),在Hello China当前版本的实现中,对于共同使用一个中断向量的中断处理函数,使用链表的方式连接在一起(串连在一起),每当中断发生的时候,操作系统从链表的头部开始,依次调用中断处理程序,根据中断处理程序的返回(TRUE或FALSE),来判断中断是否得到了处理。如果调用的中断处理程序返回了FALSE,则说明该中断不是由刚刚调用的中断处理程序来处理,于是会继续调用下一个中断处理程序,直到有一个中断处理程序返回TRUE,或到达链表的末尾。(www.xing528.com)
因此,在编写设备的中断处理程序的时候,在函数的开始处,建议马上采用简单的代码来判断该中断是不是针对自己的。如果是,则进一步处理,否则,马上返回FALSE,以便系统尽快把中断调度到正确的处理程序上。
那么,中断处理程序如何才能知道该中断是不是针对自己的呢?一般情况下,设备驱动程序可以通过读取设备的寄存器得到,或者通过设备相关的一些特定操作来确定。例如,假设IDE硬盘和网络通信控制器(NIC)连接到同一条中断线上,那么当中断发生的时候,网卡驱动程序就可以读取网卡的状态寄存器,来判断是否有报文到达。如果是,则说明该中断是由网卡发起的,就进行进一步处理,并返回TRUE(表示中断得到了正确的处理)。否则,直接返回FALSE。对于IDE接口的硬盘驱动器,则可以采用内部状态来确定是不是自己的中断。因为正常情况下,必须由设备驱动程序发起请求,比如一个读取操作,当操作结束时,设备才会发生中断,所以,这种情况下,驱动程序会保持一个未完成的操作事务,当收到中断的时候,驱动程序就可以结合事务的状态,读取适当的状态寄存器,来判断是不是IDE硬盘发起的中断。当然,不同的设备有不同的判断方式,需要结合具体的设备特征来考虑。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。