第3-1章 系统机制_第1页
第3-1章 系统机制_第2页
第3-1章 系统机制_第3页
第3-1章 系统机制_第4页
第3-1章 系统机制_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章Windows系统机制3.1陷阱分发包括中断分发、延迟的过程调用DPC、异步过程调用APC,异常分发,系统服务分发。3.2执行体对象管理器3.3同步。自旋锁、内核分发器对象,等待实现。3.4系统辅助线程。3.5Windows全局标志。3.6本地过程调用3.7内核事件跟踪。3.8Wow64。13.1、陷阱分发中断InterruptCPU暂停当前程序,保留现场后自动转去处理相应事件,处理完后,到适当时候返回断点,继续完成被打断的程序。异常ExceptionCPU执行特殊指令,当前线程转入特殊处理代码,由它决定下一步的程序流向。陷阱trap当异常或者中断发生时,处理器捕获到一个执行线程,并且将控制权转移到操作系统中某个固定地址处。Windows中,处理器将控制权转给一个陷阱处理器。陷阱处理器traphandler指与某个特殊中断或异常关联的函数。2内核区别对待中断和异常。中断是一个异步事件,异常是一个同步条件。中断可以在任何时候发生,中断与处理器当前任务毫无关系,在同样条件下用同样数据运行程序,中断不会重现。异常是一个特殊指令执行的结果,同样条件下用同样数据再次运行程序可以重现异常。中断主要由I/O设备、处理器时钟或定时器产生,可以被允许、可以被禁止。异常例子有:内存访问违例、特定的调试器指令、除零错误。陷阱分发——中断与异常的区别

13陷阱分发1中断图3.1陷阱分发陷阱处理器中断服务例程系统服务调用系统服务硬件异常软件异常异常分发器(Exceptionframe)异常帧异常处理器虚拟地址异常虚拟内存管理器的换页器4陷阱分发相关概念

1陷阱帧trapframe是一个线程完整执行环境的一个子集,用dtnt!_ktrap_frame命令可查看陷阱帧的定义。中断服务例程ISR,interruptserviceroutine由设备驱动程序提供给中断设备的处理例程。硬件和软件都可产生中断和异常(总线错误异常、除零异常)。硬件异常或中断发生,处理器用内核栈记录机器状态信息供返回。若线程是用户模式,则Windows切换到该线程的内核模式栈,然后在被中断线程的内核栈创建一个陷阱帧以保存状态。多数情况,内核安装了前端陷阱处理函数用来执行常规陷阱处理任务。若陷阱条件是设备中断,则内核硬件中断陷阱处理器将控制权交给ISR;若陷阱条件是调用系统服务引发,则通用系统服务陷阱处理器将控制权交给执行体中指定的系统服务函数。陷阱处理器,通常执行系统函数KeBugCheckEx,当内核检测到可能导致数据破坏的问题行为或不正确行为时,停止计算机。5中断分发

1硬件中断往往是由I/O设备激发中断驱动的设备使得操作系统可交替进行中心处理和I/O操作,最大限度发挥处理器能力。比如:定点设备、打印机、键盘、磁盘驱动器和网卡。系统软件可能产生中断内核可激发一个软件中断来触发一个线程分发,同时以异步方式打断一个线程的执行。内核可禁止中断,从而处理器不会被中断,只有在个别情况关键时候——如处理器正在处理一个中断,或正在分发一个异常。中断陷阱处理器InterruptTrapHandler内核安装中断陷阱处理器来响应设备的中断。ITH将控制权或者传递给一个负责处理该中断的外部例程(ISR),或者传递给一个响应该中断的内部内核例程。设备驱动程序提供了ISR来处理设备中断;内核为其它类型的中断提供中断处理例程。6硬件中断处理

1_1中断请求IRQ、中断分发表IDT、中断控制器IC外部I/O中断进入中断控制器的某一根线,该中断控制器IC在一根线上中断处理器。处理器被中断时,将询问控制器以获取中断请求(IRQ,Interruptrequest)。IC将该IRQ转译为一个中断号,用此号码作为中断分发表(IDT,interruptdispatchtable)的索引,且将控制权传递给恰当的中断分发例程。系统引导时,Windows会填充IDT,IDT包含了指向内核中负责处理每个中断和异常的例程的指针。内核调试命令!IDT可以查看IDT的内容Windows将硬件IRQ映射到IDT中的中断号上,也用IDT来为异常配置陷阱处理器。例如IDT中0xe这项指向系统的页面错误处理器。Windows最多支持256个IDT项,具体数目由主机的中断控制器决定。每个处理器有单独的IDT,可运行不同的ISR。在多处理器系统中,所有处理器都接收时钟中断,只有一个处理器的中断响应将更新系统时钟。一个线程的时限quantum结束时,通过该中断发起重新调度过程。7中断控制器

1_1x86中断控制器绝大多数x86系统,或者用i8259A可编程中断控制器(PIC),或者用i82489高级可编程中断控制器(APIC)。PIC只能用于单处理器,有15条中断线;APIC和SAPIC可用于多处理器,有256条中断线。APIC可兼容单处理器系统。APIC构成:一个专门接收设备中断的I/OAPIC,一些本地APIC,和一个与i8259A兼容的中断控制器。I/OAPIC中断转送算法由HAL来选择。x64中断控制器x64体系结构与x86兼容,但Windows64版本必须使用APIC。IA64中断控制器IA64体系结构依赖于改进的高级可编程中断控制器(SAPIC)。I/OAPIC使用一条私有APIC总线递交中断给本地APIC;SAPIC系统,中断通过I/O和系统总线实现更快速递交。内核调试器命令!pic、!apic、!ioapic查看配置。8软件中断请求级别(IRQL)

1_1中断请求级别(IRQL,interruptrequestlevel)。x86系统使用0至31;x64和IA64使用0至15。数值越大优先级越高。高端电源失败处理器间的中断时钟性能剖析设备n┇设备1DPC/dispatchAPC被动3130292827263210硬件中断软件中断普通线程在这一级别运行图3.3x86中断请求级别(IRQL)高端/性能剖析处理器间的中断/电源时钟同步(Server2003版本)设备n┇设备1Dispatch/DPCAPC被动/低端151413121143210高端/性能剖析/电源处理器间的中断时钟同步(仅限多处理器版本)设备n┇设备1可纠正的机器检查Dispatch/DPC&同步APC被动/低端x64IA64图3.4x64和IA64中断请求级别(IRQL)9软件中断请求级别(IRQL)

1_1中断按照优先级处理,高优先级中断会抢占执行权。高优先级中断发生,处理器保存被中断线程状态,并调用该中断关联的陷阱分发器,该分发器提升IRQL并调用该中断的服务例程。服务例程完成后,中断分发器再降低处理器的IRQL,回到中断发生之前的级别,然后装入被保存的机器状态,被中断线程恢复运行。当内核降低了IRQL,被屏蔽的低优先级中断可能出现。调度优先级是线程的一个属性,而IRQL是中断源(如键盘和鼠标)的一个属性。每个处理器有一个随操作系统代码执行而变化的IRQL设置,IRQL设置决定了可以接收哪些中断。内核模式线程,通过调用KeRaiseIrql和KeLowerIrql函数的直接方式,或者通过调用那些获取内核同步对象的函数的间接方式,提升或降低处理器的IRQL。若中断源的IRQL等于或低于处理器当前的级别,则中断被屏蔽(mask),直到有一个执行线程降低IRQL级别为止。10软件中断请求级别(IRQL)

1_1延迟IRQL。 因访问PIC较慢,故使用PIC的HAL实现了性能优化(延迟IRQL),避免访问PIC。当IRQL被提升,HAL内部记录新IRQL,中断屏蔽值不变。若随后发生更低优先级中断,则HAL将中断屏蔽值设置来适合第一个中断,并使更低优先级中断延迟至IRQL降低下来。若IRQL提升时无更低优先级中断,则HAL不需要修改PIC。升降IRQL。 内核模式线程根据需要来提升或降低所在处理器的IRQL。当中断发生,陷阱处理器(或处理器本身)将该处理器的IRQL提升至中断源的IRQL,暂时屏蔽同一处理器上非更高优先级中断。被屏蔽中断或者被其它处理器处理,或者保留至当前处理器的IRQL降下来。查看IRQL。 !irqlkd>!irqlDebuggersavedIRQLforprocessor0x0--0(LOW_LEVEL)11中断映射(IRQL)

1_1PCR和PRCB。 处理器控制区(PCR,processorcontrolregion)和(扩展)处理器控制块(PRCB,processorcontrolblock)有一个IRQL域。两个数据结构包含每个处理器状态信息:当前IRQL、指向硬件IDT指针、当前线程、下一个将运行的线程。内核和HAL利用处理器状态信息来执行与体系结构或与机器相关的动作。详细信息见DDK文档Ntddk.h。用户模式线程对应的IRQL。 用户模式线程不能改变处理器的IRQL,此时IRQL总是被动级别。只有处理器执行内核模式代码时,处理器的IRQL才可能更高。将中断映射到IRQL。 IRQL级别与中断控制器定义的中断请求IRQ不同。Windows通过HAL决定各中断分配的IRQL。总线型驱动程序负责确定总线(PCI、USB等)有哪些设备,哪些中断可分配给某设备,并将此信息汇报给即插即用管理器。即插即用管理器考虑所有设备可接受的中断分配方案后,确定每个设备分配哪个中断,然后调用HAL函数HalpGetSystemInterruptVector,将中断映射到对应的IRQL。12中断分配算法

1_1中断分配算法。 单处理器x86系统HAL直接翻译:用27减去中断向量值,就是它的IRQL。例如设备的中断向量值为5,则它的ISR在IRQL22上执行。

x86多处理器系统,APIC支持不止200个中断向量,没有足够IRQL来一一对应,因此HAL按照循环方式,在设备IRQL范围内,将IRQL分配给中断向量。

x64和IA64系统HAL将IRQ对应的中断向量除以16的余数作为其IRQL。13预定义IRQL

1_1只有内核在KeBugCheckEx中停止了系统并屏蔽了所有中断,内核才会使用高级别的IRQL。电源失败级别。 最初出现在WindowsNT原始设计文档,指定系统电源失败代码行为,但从未被真正用到。处理器间中断级别。 被用于向另一个处理器请求执行一个动作。如将一个dispatch_level中断排到队列中,以便调度特定线程执行其任务、更新处理器地址转换快查缓冲区(TLB,translationlook-asidebuffer)的高速缓存、系统关闭或者系统崩溃。时钟级别。 主要用于系统的时钟,内核利用该中断级别来跟踪具体的时刻,为线程测量或分配CPU时间。14预定义IRQL

1_1性能剖析profile级别。 当内核性能剖析功能被打开,系统的实时时钟就会用到性能剖析级别。内核虚拟剖析陷阱处理器会记录中断发生时被执行代码地址。随时间推移,将建立一张地址采样表,供有关工具提取相应信息进行分析。可从/whdc/system/sysperf/krview.mspx下载一个内核虚拟剖析工具kernrate,来配置和查看性能的统计量。设备IRQL。 被用来对设备中断进行优先级区分(将硬件中断映射到IRQL,参见前面第12面)。DPC/Dispatch级别和APC级别。 由内核和设备驱动程序产生的软件中断(后面将详细解释)。被动级别。 最低的IRQL,实际上根本不是一个中断级别;它是普通线程运行时的设置,此时所有中断都允许发生。15高级代码的限制

1_1 运行在DPC/Dispatch级别或更高级别上的代码,一个重要限制是它不能等待一个对象。 另一个限制是,在DPC/Dispatch级别或更高级别的IRQL上,只能访问非换页的内存。原因在于调度器在DPC/Dispatch级别上和它的数据结构同步,因此它不能被调用来执行重新调度的操作。如果违反这两个限制,系统就会崩溃,其崩溃代码为IRQL_NOT_LESS_OR_EQUAL。在设备驱动程序中,违反这些限制是一种常见错误(Windows驱动程序检验器有一个选项,设置该选项后可以帮助找到这种特定类型的错误)。16中断对象

1_1 内核提供一种可移植机制使得设备驱动程序可以为设备注册ISR,此即中断对象——内核控制对象。中断对象包含所有“供内核将一个设备的ISR与一个特定级别中断关联所需”的信息,包括该ISR地址、该设备中断时所在的IRQL级别,以及内核中与该ISR关联的IDT项。 一个中断对象初始化时,少量的汇编语言代码指令(称为分发代码)被从一个中断处理模板KiInterruptTemplate中拷贝来,保存在该对象中。中断发生时,这些代码将被执行。这份驻留于中断对象的代码调用了实际的中断分发器,通常为KiInterruptDispatch或KiChainedDispatch例程,并将指向该中断对象的指针传递给它。前者只适用于仅注册一个中断对象的中断向量,后者则在多个中断对象之间共享中断向量。中断对象包含信息使得分发器例程能找到并正确调用设备驱动程序的ISR,同时包含与该中断关联的IRQL,故上述两个例程调用ISR之前将IRQL提升级别,在ISR返回之后再降低IRQL。多处理器系统,内核为每个CPU分配一个中断对象并初始化,使该CPU上的本地APIC能够接受特定的中断。17中断控制流

1_1 中断控制流外围设备控制器CPU中断控制器CPU中断分发表012nISR地址自旋锁分发代码——————————提升IRQL抓住自旋锁—————放掉自旋锁降低IRQL———————————————从设备读取数据—————确认中断请求DPC——————————中断对象KiInterruptDispatch驱动程序的ISR图3.6 典型的中断控制流18检查中断内部

1_1首先,用命令!idt查看中断分发表。31:8a39dc3ci8042prt!I8042KeyboardInterruptService(KINTERRUPT8a39dc00)检查该中断关联的中断对象内容,执行dtnt!_kinterrupt命令kd>dtnt!_kinterrupt8a39dc00nt!_KINTERRUPT +0x000 Type :22 +0x002 Size :484 … +0x028 Irql :0x1a‘‘ …此例,Windows分配给该中断的IRQL是0x1a(十进制26)。19连接和断开中断对象

1_1

将一个ISR与某个特定中断级别关联起来,此操作称为连接一个中断对象。将一个ISR与IDT项断开关联,则称为断开一个中断对象。这些都是通过调用内核函数IoConnectInterrupt和IoDisconnectInterrupt来完成,正是这两个操作,使得设备驱动程序可在加载到系统中时“打开”一个ISR;在卸载驱动程序时,可以“关闭”该ISR。中断对象好处使用中断对象注册一个ISR,可避免设备驱动程序直接操纵中断硬件,可不必知道该IDT细节。该内核特性利于创建可移植的设备驱动程序(无需汇编编码、无需反映处理器差异)。通过使用中断对象,内核可将该ISR的执行过程与设备驱动程序中其它可能与ISR共享数据的部分同步起来。中断对象使得内核很容易为任何一个中断级别调用多个ISR。若多个设备驱动程序创建中断对象,并将它们连接到同一个IDT项,则指定中断线发生中断时,中断分发器会调用每个例程。如果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论