windows陷阱分发机制
1、中断与异常是导致控制流转向的条件,硬件或软件可以检测这两种条件。
2、内核对待中断的态度是:中断是异步事件,与处理器当前执行的任务无关;异常是同步事件,是一个特殊指令执行的结果
3、异常和中断发生时,如果该线程在用户模式下执行,到该线程内核模式栈,在内核栈上创建一个陷阱帧,把线程的执行状态保存到该帧里。陷阱帧是线程完整执行环境的一个子集。
4、内核安装了前端陷阱处理函数,在内核将控制权转交给与该陷阱相关的函数前,由这些前端函数来执行一些常规的陷阱处理任务,通常是判断陷阱类型进行下一步的控制权转交工作。
5、中断分发,内核使用中断陷阱处理器来响应设备的中断。中断陷阱处理器或者将控制权给负责处理中断的外部例程(ISR),或者传递给一个响应该中断的内部内核例程。设备驱动程序提供了ISR来处理设备中断,内核为其他类型的中断提供了ISR
6、硬件中断处理。外部I/O中断进入到中断控制器的某一根线上,该控制器然后在一根线上中断处理器。一旦处理器被中断了,它询问控制器以获得此中断请求(IRQ)。控制器将IRQ转成一个中断号,做为中断分发表(IDT)中的索引,并将控制权传递给恰当的中断分发例程,每个处理器有单独的IDT。
==========
1、X86中断控制器
APIC为依赖于高级可编程中断控制器。由几个部件构成:
(1)专门接收设备中断的I/O APIC
(2)本地APIC
(3)一个与I8259A兼容的中断控制器
2、APIC在私有的APIC总线上接收到来I/OAPIC的中断,中断控制器负责把APIC输入转制成与PIC等价的信号
3、I/O APIC 负责中断传送算法
4、X64中断控制器
无法运行于不具有APIC的系统上
5、IA64中断控制器
依赖于SAPIC,中断不能过私有总线,通过I/O和系统总线传送
6、软件中断请求级别(IRQL)
X86用0到31,X64和IA64用0到15表示,数值大表示优先级高
7、X86中断请求级别从高到低:
高端、电源失败、处理器间中断、时钟、性能剖析、设备N,设备N-1。。。。设备1,DPC/DISPATCH,APC,被动
8、每个处理器有个可变化的可设置的IRQL值
9、访问PIC相对较慢,使用了PIC的HAL使用延迟IRQL,延迟写入处理器的IRQL值,当IRQL提升,HAL内部记录新的IRQL,不改变中断屏蔽值,如果一个更低的优先级中断接着发生,则HAL设置正确的IRQL值,并这个低优先级的中断延迟到IRQL被为止。
========
1、中断对象:内核提供了一种可移植的机制让设备驱动程序可以为它们的设备注册ISR,就是内核控制的中断对象
(1)它包含了供内核将一个设备的ISR与一个特定级别的中断关联起来而需要的信息,包括ISR地址、设备中断时所在的IRQL级别、以及内核中与该ISR关联的IDT项。
(2)当一个中断对象被初始化后,少量汇编语言代码指令被从一个中断处理模板中拷贝过来,保存在该对象中,这些代码调用了实际的中断分发器,并将指向该中断对象的指针传递给它。
2、当一个ISR与某个特定的中断级别关联起来,这一操作称为连接一个中断对象。将一个ISR与IDT项断开关联,则称为断开一个中断对象,这些操作通过调用内核函数IoConnectInterrupt和IoDisconnectInterrupt完成,使得设备驱动程序可以在加载到系统的时候打开一个ISR,如果驱动程序被卸载的话,可以关闭ISR
3、使用中断对象来注册一个ISR,可避免设备驱动程序直接操纵中断硬件,不必知道IDT的细节
4、中断对象使得内核很容易为任何一个中断级别调用多个ISR,如果多个设备驱动程序创建中断对象,可将它们连接到同一个ISR项上
=========
1、分发或延迟过程调用(DPC),当一线程不能继续运行的时候要求进行调度,内核请求分发操作,但将它推迟到完成了当前的行为后再进行。
2、当内核需要对共享数据结构的访问进行同步,它总是将处理器的IRQL提升到DPC/DISPATCH级别或更高,这禁止了另外的软件中断和线程分发动作,设备驱动程序利用DPC来完成I/O操作。
3、DPC是通过一个DPC对象来表示的,DPC对象是一种内核控制对象,它对于用户模式程序是不可见的,对于设备驱动程序和其他的系统代码是可见的。
4、正在等待执行的DPC例程被存储在由内核管理的队列中,每个处理器都有一个这样的队列,称为DPC队列。要想请求一个DPC,系统代码调用内核初始化一个DPC对象,然后把它放在一个DPC队列中。
5、内核按照DPC优先级把DPC对象放到队列的合适位置,高优先级在前。当处理器的IRQL降到DPC以下,内核开始处理DPC队列,直到队列为空,为了保证中间不受正常线程打扰,其IRQL一直保持在DPC状态。完成后,把IRQL降到DPC以下
============
1、异步过程调用中断(APC)提供在特定用户线程环境中执行用户程序和系统代码的途径。
2、APC由一个内核对象描述,称为APC对象。正在等待执行的APC驻留在一个由内核管理的APC队列中。DPC队列属于系统范围,而APC队列与特定线程相关,每个线程有它自己的APC队列,内核接收请求,将一个APC排除后,请求一个APC级别的软件中断,线程最终运行时,会执行此APC。
3、两种APC类型:用户模式和内核模式。用户模式需要获得用户线程的许可。内核模式的PAC不需要目标线程许可,就运行在该线程的环境中,可强行中断该线程并执行指定过程。内核模式PAC有普通和特殊两种,线程禁止普通的,调用KEENTERCRITICALREGION;将IRQL提升到APC_LEVEL禁止特殊和普通的
4、使用内核模式APC完成在特定线程的地址空间才能完成的操作系统任务
5、驱动程序也使用内核模式APC,I/O系统利用特定的APC将I/O操作结果手帕到包含等待纯种的进程地址空间的缓冲区
6、READFILEEX、WRITEFILEEX、QUEUEUSERAPC使用用户模式APC,READFILEEX、WRITEFILEEX允许调用者指定个完成例程,I/O完成机制通过在发起I/O的线程放一个APC。完成例程回调只在一个线程在可警告的等待状态时,用户模式APC才交付。
7、线程通过等待对象句柄如wiatformultipleobjectsex或直接测试是否有未处理的APC如sleepex。内核会中断正在等待的纯种将控制权给APC,当完成后再恢复线程运行。
8、APC交付可能会造成在对象的等待队列的重新排序,因为APC完成后,线程会被重新等待或重新执行。
============
1、异常是由当前正在运行的程序在执行过程中产生的条件。结构化异常处理使应用程序能在异常发生时获得控制,然后应用程序修正此条件,并返回到异常发生之处,将栈展开,或向系统报告,该异常不可识别。
2、X86平台,所有的异常都有预定义的中断号,这些中断号对应于IDT的表项,
0-除法错误
1-调试陷阱
2-NMI/NPX错误
3-断点
4-溢出
5-BOUND/打印屏幕
6-无效操作码
7-NPX不可用
8-双重异常
9-NPX段溢出
A-无效任务状态段
B-段不存在
C-栈错误
D-一般保护
E-页面错误
F-INTEL保留
10-符点
11-对齐检查
3、所有异常除了简单能通过陷阱处理器可以解决外,其余由异常分发器的内核模块服务。异常分发器必须找异常处理器。
4、环境子系统建立基于帧的异常处理器。将一个异常处理器与一个特定过程激活动作关联。当一过程被调用时,代表过程激活的栈帧压入栈,一个栈帧关联一个或多个异常处理器,每个异常处理器保护一块特定代码。出现异常,内核查找与栈帧关联的异常处理器,没有找到,找上一次栈帧的,直