920 likes | 1.1k Views
深入理解 Windows 2000. 陈香兰 2006 年 9 月. 上次课内容回顾. 第一讲:基本概念 第二讲: Windows 2000 体系结构. 第三讲:系统机制(一). 主要内容. 介绍 executive 、内核以及设备驱动程序等内核组件所依赖的一些低层的基本机制: Trap dispatching 对象管理器 同步机制 系统工作者线程 本机过程调用 LPC 等等. 本讲的内容. 3.1 Trap dispatching. 陷阱调度机制中涉及的内容包括: 中断 异常 系统服务调度. 为什么会有中断?.
E N D
深入理解Windows 2000 陈香兰 2006年9月
上次课内容回顾 • 第一讲:基本概念 • 第二讲:Windows 2000体系结构
主要内容 • 介绍executive、内核以及设备驱动程序等内核组件所依赖的一些低层的基本机制: • Trap dispatching • 对象管理器 • 同步机制 • 系统工作者线程 • 本机过程调用LPC • 等等 本讲的内容
3.1 Trap dispatching • 陷阱调度机制中涉及的内容包括: • 中断 • 异常 • 系统服务调度
为什么会有中断? • 操作系统的一个主要功能就是处理外设的I/O操作 • 处理器速度一般比外设快很多 • 轮询?中断? • 另外,如果处理器执行过程中发现错误,怎么办?
广义的中断 • 中断会改变处理器执行指令的顺序 • 将处理器转移到正常控制流以外的代码上执行 • 中断通常与CPU芯片内部或外部硬件电路产生的电信号相对应 • 根据信号是异步产生的还是同步产生的,中断(广义)进一步分为: • 中断(狭义)和异常
中断(狭义) • 中断(狭义)是异步的 • 由硬件随机产生,在程序执行的任何时候可能出现 • 与处理器当前正在执行的内容无关 • 主要是由I/O设备、处理器时钟或定时器引发,处理器可以选择是否响应(某个)中断
异常 • 异常是同步的 • 在(特殊的或出错的)指令执行时由CPU控制单元产生 • 一般可再现 • 典型的异常如:越界访问、一些调试命令、除0错、缺页等等
“陷阱” • 陷阱是处理器的一种运行机制: • 当中断或异常发生时,处理器从正在执行的线程那里获得控制权,并转去操作系统中固定的执行位置进行(中断/异常)处理 • 在Windows 2000中,处理器将转向陷阱处理程序(trap handler) • 陷阱处理程序与特定的中断/异常相关
停止,然后继续 • 停止 • 中断/异常产生时,当前执行的线程必须停下来,处理器进行中断/异常处理 • 继续 • 当中断/异常处理完时,原先被中断的线程恢复执行,就像中断/异常没有发生过 • HOW?
陷阱帧(trap frame) • 处理器必须记录足够的状态以便能够返回被中断的执行点 • 陷阱帧: • 由内核在被中断线程的内核栈中创建 • 保存线程的执行状态 • 通常是线程上下文的一个子集
前端陷阱处理函数 • 用于完成一般化的陷阱处理任务 • 与陷阱处理函数之间的关系为: Func{ … call xxx … } XXX{ … … … } XXX与特定的 中断/异常有关 前端陷阱处理函数 陷阱处理函数
Windows 2000中的陷阱调度 • interrupt dispatching • exception dispatching • System service dispatching
一、interrupt dispatching • I/O的控制方式有哪些? • 轮询、中断、DMA • 中断驱动的设备 • 中断驱动的设备允许操作系统通过CPU与I/O操作重叠而最大限度的使用处理器 • 下图显示了一个大概的时序图
上图中: • 线程启动从/到某个设备的I/O传输 • 在I/O传输过程中,处理器执行其他一些有效的工作 • 当设备传输结束,就引发中断 • 典型的中断驱动设备有: • 定点设备、打印机、键盘、磁盘驱动器、网卡
Windows 2000的中断处理 • 要点: • 硬件中断处理 • 中断请求级别 • 软件中断
1、硬件中断处理 以x86体系为例,中断分为: • 可屏蔽中断(Maskable interrupt) • I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断。 • 可屏蔽中断可以处于两种状态:屏蔽的(masked)和非屏蔽的(unmasked) • 非屏蔽中断(Nonmaskable interrupt) • 只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电
可屏蔽中断的产生 • 每个能够发出中断请求的硬件设备控制器都有一条称为IRQ(Interrupt ReQuest)的输出线。 • 所有的IRQ线都与一个中断控制器(例如i8259A)的输入引脚相连 • 中断控制器与CPU的INTR引脚相连 设备 设备 控制器 中断 控制器 CPU INTR IRQ
中断控制器 • 可编程中断控制器 • PIC,Programmable Interrupt Controlor • 典型的中断控制器 • i8259A • APIC,高级可编程中断控制器
传统的中断控制器:i8259A • 传统的中断控制器使用两片i8259A以“级联”的方式连接在一起 • 每个芯片可以处理最多8个不同的IRQ线 • 主从两片i8259A的连接: • 从主的IRQ2引脚 • 因此,一共可以处理最多15个不同的IRQ线 OS CPU 8259 M device 8259 S
中断控制器执行下列动作: 1,监视IRQ线,对引发信号检查 2,如果一个引发信号出现在IRQ线上 a,把此信号转换成对应的中断向量 b,把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读这个向量 c,把引发信号发送到处理器的INTR引脚,即产生一个中断 d,等待,直到CPU应答这个信号;收到应答后,清INTR引脚 3,返回到第一步
IRQ号和中断向量号 • 中断控制器对输入的IRQ线从0开始顺序编号 • IRQ0,IRQ1,… • Intel给中断控制器分配的中断向量号从32开始,上述IRQ线对应的中断向量依次是 • 32+0、32+1、… • 可以对中断控制器编程: • 修改起始中断向量的值,或 • 有选择的屏蔽/激活每条IRQ线 屏蔽≠丢失
屏蔽的中断不会丢失 • 一旦被激活,中断控制器又会将它们发送到CPU • 有选择的屏蔽/激活IRQ线≠全局屏蔽/激活 • 前者通过对中断控制器编程实现 • 后者通过特定的指令操作CPU中的状态字
I386:开中断和关中断 • CPU可以将屏蔽所有的可屏蔽终端 • Eflags中的IF标志:0=关中断;1=开中断。 • 关中断时,CPU不响应中断控制器发布的任何中断请求 • 操作系统内核中使用cli和sti指令分别清除和设置该标志
中断描述符表 • IDT(Interrupt Description Table) • 中断描述符表是一个系统表,它与每一个中断或者异常向量相联系 • 每个向量在表中有相应的中断或者异常处理程序的入口地址。
Windows 2000的硬件中断处理 • Windows 2000在系统启动时填写IDT表 • 当中断发生时,处理器将会根据IDT将控制转移给适当的中断/异常处理例程
APIC高级可编程中断控制器 • PIC,可编程中断控制器 • 前面介绍过的i8259A,用于单处理器系统 • APIC • 用于多处理器系统 • 现在多数计算机都含有APIC • 提供PIC兼容
2、中断请求级别(IRQL) • 尽管中断控制器提供中断优先级方案,但是Windows 2000有其自身的(软件级别的)中断优先方案 • 中断请求级别IRQL(0~31) • 数字越大,优先级越高 • 内核为软件中断定义了标准的IRQL集,而HAL将硬件中断号映射成IRQL
IRQL处理机制 • 中断按照IRQL级别获得服务 • 高优先级的中断优先获得服务 • 高优先级的中断请求发生时,处理器保存被中断的线程的状态,并调用相关的trap dispatcher • 1,提升IRQL • 2,调用ISR • 3,降低IRQL • 4,恢复被中断的线程
中断的屏蔽 • 当IRQL处于较高的级别时,低优先级的中断请求将会被阻塞 • 当IRQL降低后,被屏蔽的低优先级中断可能触发,此时内核重复上述处理过程
IRQL操作的限制 • 由于改变处理器的IRQL对系统操作影响较大,只能在内核态更改IRQL • 用户态代码运行时,必然处于无源级别 • 只有内核态代码执行时,IRQL会处于较高级别 • 为保证设备驱动程序能够及时对中断进行响应,系统的所有组件都试图将IRQL保持在无源级别
如何将IRQL分配给设备中断? • 在Windows 2000中 • 总线设备驱动程序,确定存在的设备及相应的中断 • 即插即用管理器,检查并最终决定每个设备的中断,然后 • 调用HAL中的HalpGetSystemInterruptVector把中断映射到IRQL
以单处理机系统为例 • HAL进行如下转换: • 27-中断向量=IRQL • 若一个设备的中断向量为5,那么IRQL为22,即此中断的ISR在IRQL为22时执行
预定义的IRQL • IRQL=31:只有当内核在KeBugCheckEx中终止系统并屏蔽所有中断时,才使用 • IRQL=30:电源失败级别,从未使用过 • IRQL=29:处理器间中断
IRQL=28:系统时钟中断,tick来自于此 • IRQL=27:profiling,内核抽样性能测试机制 • IRQL=26~3:设备中断
IRQL=2:DPC中断 • IRQL=1:APC中断 • IRQL=0:无中断源,线程正常运行 软件中断
中断对象 • Windows 2000为中断处理提供了一种可移植的机制:中断对象 • 中断对象允许设备驱动程序为设备注册ISR • 中断对象中包含一切内核用来将设备ISR与中断级联系在一起的信息 • ISR地址、设备中断的IRQL、内核的IDT中与ISR相关的项
3、软件中断 • 软件中断 • 软件引起的、在正常处理流程之外的事件 • 例如: • 触发线程调度 • 非紧急的中断处理 • 定时器到期处理 • 在特定的线程上下文中异步执行 • 支持异步I/O操作
Windows 2000的软件中断级别 • DPC中断(IRQL=2) • Dispatch or deferred procedure call • APC中断(IRQL=1) • Asynchronous procedure call
1)DPC中断 • 场景1: • 当线程不能继续执行时,例如已经执行完毕或者进入等待状态 • 此时,内核可以直接进行线程调度并进行上下文切换 • 场景2: • 有时,内核正陷于深层次的代码调用中,此时检测到需要进行调度
解决方法 • 请求调度,但是延迟直到内核完成当前作业 • 即使用DPC软件中断 • 当内核将IRQL提升到2或更高级别时,其他的软件中断和线程调度被禁止 • 当内核检测到需要调度时,就请求一个DPC级的调度中断 • 根据IRQL的处理,这个中断被屏蔽 • 当IRQL降低到低于DPC级别时,这个中断被触发(激活),从而调度得到处理
延迟过程调用 • 原因:尽可能减少在较高IRQL(设备IRQL)级别停留的时间,提高硬件中断的响应速度 • 不需要被立即执行的一些系统任务 • 内核利用DPC处理定时器过期 • 时钟中断相关 • 设备驱动程序利用DPC完成I/O请求 • 设备中断相关
DPC对象 • DPC使用DPC对象表示, • 这是一种内核控制对象 • 对用户态不可见 • 但对设备驱动程序和其他系统代码可见 • DPC对象的最重要信息: • 被延迟的操作(函数)地址
DPC队列 • 每个处理器都有一个DPC队列,用来存放被延迟执行的各个DPC对象 • DPC对象的优先级: • 高(插入队列头部,以便得到尽快处理) • 中(尾部) • 低(尾部)
DPC队列的处理时机 • 当处理器的IRQL从DPC级别或更高级别下降到更低的级别(APC或无源级别)时,内核处理DPC,直到DPC队列为空