Presentation is loading. Please wait.

Presentation is loading. Please wait.

深入理解Windows 2000 陈香兰 2006年9月.

Similar presentations


Presentation on theme: "深入理解Windows 2000 陈香兰 2006年9月."— Presentation transcript:

1 深入理解Windows 2000 陈香兰 2006年9月

2 上次课内容回顾 第一讲:基本概念 第二讲:Windows 2000体系结构

3

4 第三讲:系统机制(一)

5 主要内容 介绍executive、内核以及设备驱动程序等内核组件所依赖的一些低层的基本机制: Trap dispatching 对象管理器
同步机制 系统工作者线程 本机过程调用LPC 等等 本讲的内容

6 3.1 Trap dispatching 陷阱调度机制中涉及的内容包括: 中断 异常 系统服务调度

7 为什么会有中断? 操作系统的一个主要功能就是处理外设的I/O操作 另外,如果处理器执行过程中发现错误,怎么办? 处理器速度一般比外设快很多
轮询?中断? 另外,如果处理器执行过程中发现错误,怎么办?

8 广义的中断 中断会改变处理器执行指令的顺序 中断通常与CPU芯片内部或外部硬件电路产生的电信号相对应
将处理器转移到正常控制流以外的代码上执行 中断通常与CPU芯片内部或外部硬件电路产生的电信号相对应 根据信号是异步产生的还是同步产生的,中断(广义)进一步分为: 中断(狭义)和异常

9 中断(狭义) 中断(狭义)是异步的 由硬件随机产生,在程序执行的任何时候可能出现 与处理器当前正在执行的内容无关
主要是由I/O设备、处理器时钟或定时器引发,处理器可以选择是否响应(某个)中断

10 异常 异常是同步的 在(特殊的或出错的)指令执行时由CPU控制单元产生 一般可再现 典型的异常如:越界访问、一些调试命令、除0错、缺页等等

11 “陷阱” 陷阱是处理器的一种运行机制: 在Windows 2000中,处理器将转向陷阱处理程序(trap handler)
当中断或异常发生时,处理器从正在执行的线程那里获得控制权,并转去操作系统中固定的执行位置进行(中断/异常)处理 在Windows 2000中,处理器将转向陷阱处理程序(trap handler) 陷阱处理程序与特定的中断/异常相关

12 停止,然后继续 停止 继续 HOW? 中断/异常产生时,当前执行的线程必须停下来,处理器进行中断/异常处理
当中断/异常处理完时,原先被中断的线程恢复执行,就像中断/异常没有发生过 HOW?

13 陷阱帧(trap frame) 处理器必须记录足够的状态以便能够返回被中断的执行点 陷阱帧: 由内核在被中断线程的内核栈中创建
保存线程的执行状态 通常是线程上下文的一个子集

14 前端陷阱处理函数 用于完成一般化的陷阱处理任务 与陷阱处理函数之间的关系为: Func{ … call xxx } XXX{ … }
中断/异常有关 前端陷阱处理函数 陷阱处理函数

15 Windows 2000中的陷阱调度 interrupt dispatching exception dispatching
System service dispatching

16 一、interrupt dispatching
I/O的控制方式有哪些? 轮询、中断、DMA 中断驱动的设备 中断驱动的设备允许操作系统通过CPU与I/O操作重叠而最大限度的使用处理器 下图显示了一个大概的时序图

17 CPU与I/O操作的重叠

18 上图中: 典型的中断驱动设备有: 线程启动从/到某个设备的I/O传输 在I/O传输过程中,处理器执行其他一些有效的工作
当设备传输结束,就引发中断 典型的中断驱动设备有: 定点设备、打印机、键盘、磁盘驱动器、网卡

19 Windows 2000的中断处理 要点: 硬件中断处理 中断请求级别 软件中断

20 1、硬件中断处理 以x86体系为例,中断分为: 可屏蔽中断(Maskable interrupt)
I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断。 可屏蔽中断可以处于两种状态:屏蔽的(masked)和非屏蔽的(unmasked) 非屏蔽中断(Nonmaskable interrupt) 只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电

21 可屏蔽中断的产生 每个能够发出中断请求的硬件设备控制器都有一条称为IRQ(Interrupt ReQuest)的输出线。
所有的IRQ线都与一个中断控制器(例如i8259A)的输入引脚相连 中断控制器与CPU的INTR引脚相连 设备 设备 控制器 中断 控制器 CPU IRQ INTR

22 中断控制器 可编程中断控制器 典型的中断控制器 APIC,高级可编程中断控制器
PIC,Programmable Interrupt Controlor 典型的中断控制器 i8259A APIC,高级可编程中断控制器

23 传统的中断控制器:i8259A 传统的中断控制器使用两片i8259A以“级联”的方式连接在一起 每个芯片可以处理最多8个不同的IRQ线
OS CPU 8259 M device 8259 S

24 中断控制器执行下列动作: 1,监视IRQ线,对引发信号检查 2,如果一个引发信号出现在IRQ线上 3,返回到第一步
a,把此信号转换成对应的中断向量 b,把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读这个向量 c,把引发信号发送到处理器的INTR引脚,即产生一个中断 d,等待,直到CPU应答这个信号;收到应答后,清INTR引脚 3,返回到第一步

25 IRQ号和中断向量号 中断控制器对输入的IRQ线从0开始顺序编号
Intel给中断控制器分配的中断向量号从32开始,上述IRQ线对应的中断向量依次是 32+0、32+1、… 可以对中断控制器编程: 修改起始中断向量的值,或 有选择的屏蔽/激活每条IRQ线 屏蔽≠丢失

26 有选择的屏蔽/激活IRQ线 ≠全局屏蔽/激活
屏蔽的中断不会丢失 一旦被激活,中断控制器又会将它们发送到CPU 有选择的屏蔽/激活IRQ线 ≠全局屏蔽/激活 前者通过对中断控制器编程实现 后者通过特定的指令操作CPU中的状态字

27 I386:开中断和关中断 CPU可以将屏蔽所有的可屏蔽终端 Eflags中的IF标志: 0=关中断; 1=开中断。
操作系统内核中使用cli和sti指令分别清除和设置该标志

28 中断描述符表 IDT(Interrupt Description Table) 中断描述符表是一个系统表,它与每一个中断或者异常向量相联系
每个向量在表中有相应的中断或者异常处理程序的入口地址。

29 Windows 2000的硬件中断处理 Windows 2000在系统启动时填写IDT表

30 APIC高级可编程中断控制器 PIC,可编程中断控制器 APIC 前面介绍过的i8259A,用于单处理器系统 用于多处理器系统

31 2、中断请求级别(IRQL) 尽管中断控制器提供中断优先级方案,但是Windows 2000有其自身的(软件级别的)中断优先方案
数字越大,优先级越高 内核为软件中断定义了标准的IRQL集,而HAL将硬件中断号映射成IRQL

32 X86体系中定义的IRQL 无源

33 IRQL处理机制 中断按照IRQL级别获得服务
高优先级的中断优先获得服务 高优先级的中断请求发生时,处理器保存被中断的线程的状态,并调用相关的trap dispatcher 1,提升IRQL 2,调用ISR 3,降低IRQL 4,恢复被中断的线程

34 中断的屏蔽 当IRQL处于较高的级别时,低优先级的中断请求将会被阻塞

35 IRQL操作的限制 由于改变处理器的IRQL对系统操作影响较大,只能在内核态更改IRQL
用户态代码运行时,必然处于无源级别 只有内核态代码执行时,IRQL会处于较高级别 为保证设备驱动程序能够及时对中断进行响应,系统的所有组件都试图将IRQL保持在无源级别

36 如何将IRQL分配给设备中断? 在Windows 2000中 总线设备驱动程序,确定存在的设备及相应的中断
即插即用管理器,检查并最终决定每个设备的中断,然后 调用HAL中的HalpGetSystemInterruptVector把中断映射到IRQL

37 以单处理机系统为例 HAL进行如下转换: 若一个设备的中断向量为5,那么IRQL为22,即此中断的ISR在IRQL为22时执行

38 预定义的IRQL IRQL=31: 只有当内核在KeBugCheckEx中终止系统并屏蔽所有中断时,才使用

39 IRQL=28: 系统时钟中断,tick来自于此
IRQL=27: profiling,内核抽样性能测试机制 IRQL=26~3: 设备中断

40 IRQL=2:DPC中断 IRQL=1:APC中断 IRQL=0:无中断源,线程正常运行 软件中断

41 中断对象 Windows 2000为中断处理提供了一种可移植的机制:中断对象 中断对象允许设备驱动程序为设备注册ISR
ISR地址、设备中断的IRQL、内核的IDT中与ISR相关的项

42 3、软件中断 软件中断 例如: 软件引起的、在正常处理流程之外的事件 触发线程调度 非紧急的中断处理 定时器到期处理
在特定的线程上下文中异步执行 支持异步I/O操作

43 Windows 2000的软件中断级别 DPC中断(IRQL=2) APC中断(IRQL=1)
Dispatch or deferred procedure call APC中断(IRQL=1) Asynchronous procedure call

44 1)DPC中断 场景1: 场景2: 当线程不能继续执行时,例如已经执行完毕或者进入等待状态 此时,内核可以直接进行线程调度并进行上下文切换
有时,内核正陷于深层次的代码调用中,此时检测到需要进行调度

45 解决方法 请求调度,但是延迟直到内核完成当前作业 即使用DPC软件中断 当内核将IRQL提升到2或更高级别时,其他的软件中断和线程调度被禁止
当IRQL降低到低于DPC级别时,这个中断被触发(激活),从而调度得到处理

46 延迟过程调用 原因: 尽可能减少在较高IRQL(设备IRQL)级别停留的时间,提高硬件中断的响应速度 不需要被立即执行的一些系统任务
内核利用DPC处理定时器过期 时钟中断相关 设备驱动程序利用DPC完成I/O请求 设备中断相关

47 DPC对象 DPC使用DPC对象表示, DPC对象的最重要信息: 这是一种内核控制对象 对用户态不可见 但对设备驱动程序和其他系统代码可见
被延迟的操作(函数)地址

48 DPC队列 每个处理器都有一个DPC队列,用来存放被延迟执行的各个DPC对象 DPC对象的优先级: 高(插入队列头部,以便得到尽快处理)
中(尾部) 低(尾部)

49 DPC队列的处理时机 当处理器的IRQL从DPC级别或更高级别下降到更低的级别(APC或无源级别)时,内核处理DPC,直到DPC队列为空

50

51 DPC的限制 由于DPC例程在执行时与当前线程无关,因此DPC例程不能假定当前的进程地址空间 因此,只能调用内核函数 不能 调用系统服务
产生页面错误 等等

52 DPC的使用情况 DPC是为设备驱动程序提供的 内核也使用
设备驱动程序ISR使用DPC的方式完成应答设备、保存易变中断状态、延迟数据传输以及其他非紧急的中断处理活动 内核也使用 例如:处理时间片过期(前面提到的线程调度延迟处理)

53 2)APC中断 异步过程调用允许用户程序和系统代码在特定用户线程的上下文中运行 因此,APC是运行在特定的进程地址空间中的
APC不具有DPC那样的限制

54 APC对象 APC由APC对象描述 与系统范围内的DPC队列不同,APC队列是线程范围内的 也是内核控制对象 每个线程都有自己的APC队列

55 APC的种类 两种APC 内核态APC在线程中运行,不需要请求线程的许可 用户态的APC需要请求 内核态APC可以直接中断线程执行

56 APC的使用 Executive利用内核态APC完成必须在特定线程的地址空间完成的系统任务
POSIX子系统利用内核模式APC模拟POSIX信号机制 设备驱动程序也利用内核模式APC (异步)I/O完成时,需要到相关的线程中执行某些操作

57 很多Win32 API使用用户模式的APC 例如文件相关的I/O操作,在I/O完成后希望能够执行指定的completion例程 等等

58 二、异常调度 异常只能由当前程序的执行引起,而不是在任何时候都可能出现
Win32提供结构化异常处理功能,允许应用程序在异常发生时取得控制,进行处理

59 语言扩展 Win32的异常处理可以通过语言扩展(如VC++)访问 使用Windows 2000异常处理的例子
Java异常 尽管如此:异常处理是一种系统机制,不是语言相关的

60 X86体系结构的异常 在x86上,所有的异常在IDT表中都对应一个中断向量,这里保存处理对应异常的陷阱处理程序

61 Opcode7NPX Not Available Invalid Task State Segment (TSS)
Interrupt Number Exception Divide Error 1 DEBUG TRAP 2 NMI/NPX Error 3 Breakpoint 4 Overflow 5 BOUND/Print Screen 6 Invalid Opcode 7 Opcode7NPX Not Available 8 Double Exception X86的异常 及其中断号 9 NPX Segment Overrun A Invalid Task State Segment (TSS) B Segment Not Present C Stack Fault D DGeneral Protection E EPage Fault F Intel Reserved 10 Floating Point 11 Alignment Check

62 Windows 2000中异常的处理 除了一些能被trap handler简单处理的简单异常外,所有异常都由Exception dispatcher模块提供服务 该模块的功能就是查找能够处理异常的异常处理程序

63 异常的处理过程 CPU 调试相关 基于帧的异常 处理程序 环境子系统 缺省

64 内核态的异常 对于内核态的异常,exception dispatcher仅仅调用例程查找处理异常的基于帧的异常处理程序
如果无法找到,则发生了致命错误 因此可以认为总能处理内核态异常

65 用户态的异常 对于用户态的异常,处理起来比较复杂 Win32 子系统中使用调试程序端口和异常端口来接收Win32进程的用户态异常的通知
内核默认使用这种方式

66 三、system service dispatch
在x86体系中,system service dispatch是通过执行指令 int 0x2e 触发的 例如曾经见过的NtWriteFile: mov eax,0x0E; mov ebx,esp; int 0x2E; ret 0x2C;

67 0x2e对应于IDT表中的第46项,因此Windows 2000在这里填入的内容指向system service dispatch程序

68 mov eax,0x0E; mov ebx,esp; int 0x2E; ret 0x2C;
NtWriteFile: mov eax,0x0E; mov ebx,esp; int 0x2E; ret 0x2C; 可以看出,x86体系 通过寄存器eax将系统服务号传递给system service dispatch 通过寄存器ebx将调用参数传递给系统服务

69 System service dispatch
将ebx代表的参数传递 给系统服务 根据eax的值定位系统服务

70 System service dispatcher
KiSystemService 参数校验 将调用参数从线程用户态堆栈复制到内核堆栈 防止在执行过程中用户篡改参数 执行系统服务

71 关于堆栈的切换 到目前为止一直没有谈到的一个关键问题是堆栈的切换 用户态:用户堆栈 内核态:内核堆栈 使用堆栈传参时,必须拷贝参数
这是进行参数复制的强制性理由

72 关于参数的拷贝 如果传递给系统服务的参数是一个指针 这个指针必然指向用户空间的缓存区 同样的,必须将这个缓存区的内容拷贝到内核空间中
注意:在拷贝之前要检查这个缓冲区,例如 调用者是否具有访问权限 等等

73 关于系统服务号

74 关于Table Index 在Windows 2000里有两个内建的系统服务表
缺省系统服务表:KeServiceDescriptorTable 另一个:KeServiceDescriptorTableShadow 前者仅仅定义了在Ntosrknl.exe中实现的执行程序系统服务 后者还包括了Win32k.sys实现的Win32 USER和GDI服务

75 系统服务号中有两个bit表示Table Index,因此最多可以有4个系统服务表
每个线程都有一个指向系统服务表的指针 缺省指向前者 当Win32线程第一次调用Win32 USER或GDI服务,就改为指向后者 系统服务号中有两个bit表示Table Index,因此最多可以有4个系统服务表 Windows 2000使用了第三个表来实现其他服务,给第三方保留了一个表

76 System service dispatching

77 3.2 对象管理器 Windows 2000为了能够一致而安全地访问在executive中实现的各种内部服务而实现了对象模型 对象管理器负责
创建、删除和跟踪对象 对象管理器也是作为一个executive component 实现

78 对象管理器的作用: 使得资源的控制操作集中在对象管理器中 而不是分散在整个操作系统中

79 Winobj 对象浏览器 可以遍历对象管理器维护的名字空间

80 对象管理器的设计需求 1、提供公共的、统一的系统资源使用机制 2、在操作系统的某个位置隔离对象保护以便能实现C2安全一致性
3、提供机制来控制进程使用对象以便系统管理员可以设置使用系统资源的限制 4、建立对象-名字方案以便能有准备地合成现有对象,如设备、文件以及文件系统目录或对象的其他独立集合

81 5、支持不同操作系统环境的要求 6、建立对象保留的统一规则 如进程继承父进程资源的能力(Win32和POSIX需要)
即保持对象可用,直到所有进程不再使用它

82 Windows 2000内部的两种对象 Executive对象 内核对象
各种executive component(例如进程管理器、内存管理器和I/O子系统)实现的对象 内核对象 Windows 2000内核中实现的原语对象 对用户态代码不可见

83 内核对象提供了一些基本功能,例如同步 因此,很多执行对象含有一个或多个内核对象,如图所示

84 包含内核对象的executive对象

85 一、executive对象 Executive对象及其服务是环境子系统用来构建它们自身的对象版本和其他资源的基础。
环境子系统通过它们为应用程序营造不同的操作系统映像

86 Executive对象通常在下列情况下被创建
由环境子系统代表用户应用程序创建 由操作系统的各个组件创建

87 文件的创建过程举例 CreateFile Win32子系统DLL NtCreateFile 创建executive文件对象
Kernel32.dll Win32子系统DLL NtCreateFile Ntdll.dll User mode int 0x2e Kernel mode Ntoskrnl.exe 创建executive文件对象

88 环境子系统提供的对象集 环境子系统提供给其应用程序的对象集可能大于也可能小于executive提供的对象集
Win32子系统的对象集有很多是直接对应于executive对象的,例如 Win32互斥锁和信号量 Win32子系统还提供了名字管道和邮箱以及基于executive文件对象的资源

89 而POSIX系统根本不支持对象 它利用executive对象及其服务作为向POSIX应用提供POSIX风格进程、管道以及其他资源的基础

90 下表列出了Win32 API可以访问的executive对象
Windows 2000的executive实现了27个对象类型,其中很多仅由相应的executive component使用,而不能由Win32 API直接访问,例如 驱动程序、设备、事件对 下表列出了Win32 API可以访问的executive对象

91 提供给Win32的executive对象 Symbolic link Process Thread Job Memory Section
File Access tocken Event Semaphore 符号链接 进程 线程 作业 内存区域 文件 访问令牌 事件 信号量 mutex Timer IoCompletion (registry) key WindowStation Desktop 互斥锁 定时器 I/O结束

92 本讲回顾 Trap dispatching 中断 硬件中断 IRQL和软件中断(DPC、APC) 异常 系统服务 对象管理器(部分)


Download ppt "深入理解Windows 2000 陈香兰 2006年9月."

Similar presentations


Ads by Google