深入解析Windows操作系统——系统机制——陷阱分发
陷阱分发
中断和异常是导致处理器转向正常控制流之外代码的两种操作系统条件。术语“陷阱”指的是:当异常或者中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一固定地址处的机制。在Windows中处理器将控制权转给一个陷阱处理器(指与某个特殊的中断或异常相关联的一个函数)。
内核对待中断和异常是有区别的。
中断:是一个异步事件(可以在任何时间发生),并且与处理器当前正在执行的任务毫无关系;主要是由I/O设备、处理器时钟或者定时器产生的;中断可以被允许(打开),也可以被禁止(关闭)。
异常:一个同步条件,它是一个特殊指令执行的结果;在同样的条件下用同样的数据第二次运行一个程序可以重现原来的异常。
Windows会在被中断的线程的内核栈上创建一个陷阱帧,并且把线程的执行状态保存到陷阱帧里。陷阱帧是一个线程的完整执行环境的一个子集,在内核调试器中输入dt nt!"_ktrap_frame可查看陷阱帧的定义。
中断分发
硬件的中断往往是由I/O设备激发的,当设备需要服务时以中断的方式通知处理器。
系统软件的中断
内核的中断陷阱处理器响应设备的中断。
硬件中断处理
在Windows支持的硬件上,外部I/O中断进入到中断控制器的某一根线上,一旦处理器被中断了,会询问控制器以便获取中断请求(IRQ),接着中断控制器将该IRQ转译成一个中断号,利用该号码作为在中断分发表中的索引,并将控制权传递给恰当的中断分发例程。
利用**!dt**可以查看IDT的内容,其中包含有关Windows为每个中断(包括异常和IRQ)所分配的陷阱处理器的信息,!dt若不带任何标志,则会显示出每个中断被映射至了Ntoskrnl.exe之外的其他模块中的相应地址。
Windows所支持的硬件体系结构允许最多可达256个IDT项,但一台特定机器所能支持的IRQ的数量则是由该机器所用的中断控制器的具体设计所决定的。每个处理器都有单独的IDT,因此若合适的话不同的处理器可以运行不同的ISR。(在一个多处理器系统中每个处理器都接收时钟中断,但只有一个处理器在响应该中断时更新系统时钟)。
X86中断控制器
X64中断控制器
IA64中断控制器
软件中断请求级别(IRQL)
Windows使用的是它自己的中断优先级方案,称为中断请求级别(IRQL),x86系统(0-31),x64和IA64(0-15),数值越大,中断的优先级越高。
中断是按照优先级处理的,高优先级的中断会抢占低优先级中断的执行权。
“提升IRQL会阻塞同一级别或者更低级别中断”这一规则有一个例外跟APC_LEVEL中断有关。若一个线程将IRQL提升至APC_LEVEL,接着又被重新调度,则系统有可能将一个APC_LEVEL的中断递交给新被调度的线程。因此APC_LEVEL可看做是线程局部的IRQL而不是处理器范围内的IRQL。
在一个被称为处理器控制区(PCR)的数据结构以及它的扩展结构PRCP(处理器控制块)中有一个称为IRQL的域。这两个数据结构包含了系统中每个处理器的状态信息,内核和HAL利用这些信息来执行各种与体系结构相关或者与机器相关的动作。可使用**!pcr**查看PCR内容。
因为改变一个处理器的IRQL对于系统操作有如此重要的影响,因此这种改变只能在内核模式中进行(用户模式线程不能改变处理器的IRQL)。意味着当一个处理器正在执行用户模式代码时它的IRQL总是在被动级别上。只有当处理器正在内核模式代码时它的IRQL才有可能更高。
分发或者延迟过程调用(DPC)
当内核需要对共享的内核数据结构的访问进行同步时,总是将处理器的IRQL提升到DPC/Dispatch级别或者更高。这就禁止了另外的软件中断和线程分发动作。
DPC是完成某一项系统任务的一个函数——完成这一系统的时间不像完成当前任务那样紧迫,因此称为延迟的,它们可能不会立即执行。
DPC给了操作系统这样的能力:产生一个中断并且在内核模式下执行一个系统函数。内核利用DPC处理定时器到期,以及当一个线程的时限到期以后重新调度处理器。
Windows在设备驱动程序的配合下企图将IRQL保持在低于设备IRQL级别之下:让设备驱动程序ISR执行最少最必要的工作来响应它们的设备,将易变的中断状态保存起来,并且将数据传输或者其他并非时间紧迫的中断处理活动推迟到一个位于DPC/Dispatch IRQL级别上的DPC中再执行。
DPC:通过一个DPC对象表示。是一种内核控制对象,对于用户模式程序是不可见的,但是对于设备驱动程序和其他的系统代码则是可见的。DPC对象包含的重要信息有:当内核处理该DPC中断时将要调用的那个系统函数的地址。
DPC队列:正在等待执行的DPC例程被存储在由内核管理的队列中,每个处理器都有的这样的一个队列。
异步过程调用(APC)中断:提供了一种在特定用户线程环境中执行用户程序和系统代码的途径。APC是经过排队的,以便在特定线程的环境中执行,并且运行在低于DPC/Dispatch级别的IRQL上。
APC对象:正在等待执行的APC驻留在一个由内核管理的APC队列中,DPC队列是系统范围的,不同的是APC队列是与特定线程相关的,每个线程有它自己的APC队列。
APC类型:内核模式和用户模式。内核模式的APC并不要求从目标线程获得“许可”就可以运行在该线程的环境中,而用户模式的APC必须先获得许可才行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!