WDM 驱动程序设计.ppt
《WDM 驱动程序设计.ppt》由会员分享,可在线阅读,更多相关《WDM 驱动程序设计.ppt(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、WDM驱动程序设计内核模式下的内存管理内核模式地址空间Windows支持虚拟内存管理,不同的进程有不同的虚拟地址空间。从一个进程的当前线程切换到另一个进程的某个线程时,与进程相对应的虚拟地址空间也被更换。Windows将操作系统的核心代码和驱动程序映射到每个进程的虚拟地址空间的0 x80000000 0 xFFFFFFFF区间上,使其服务和数据被所有进程共享。这一部分地址空间称为内核模式地址空间内核模式地址空间。不能简单地使用属于用户模式地址空间中的虚拟地址,因为当我们的驱动在运行时用户线程上下文也可能在切换。我们没有办法知道用户程序传来的指针是否还指向当初那块物理内存。不要轻易直接引用用户模
2、式的内存地址不要轻易直接引用用户模式的内存地址。内核模式地址空间分页内存和非分页内存虚拟内存系统的特征就是能使软件有一个比物理内存大得多的虚拟内存空间。为了做到这一点,内存管理器需要在物理内存和磁盘文件间交换页帧。操作系统的某些部分是不能被分页的。最明显的例子就是,用于处理页故障的代码和数据结构必须常驻内存。Windows 把内核模式地址空间分成分页内存池分页内存池和非分页内非分页内存池存池。必须时刻驻留的代码和数据放在非分页池;不必常驻的代码和数据放在分页池中。用户模式地址空间总是分页的。Windows 为决定代码和数据是否要驻留非分页池提供了一个简单规则:执行在高于或等于执行在高于或等于D
3、ISPATCH_LEVEL级的级的代码不可以引发页故障代码不可以引发页故障,因此它们必须驻留于非分页池。因此它们必须驻留于非分页池。中断请求级(IRQL)Windows 为每个硬件中断和少数软件事件赋予了一个优先级,即中断请求级中断请求级。一个确定的CPU上的活动仅能被拥有更高IRQL的活动抢先。中断请求级所有用户模式程序都执行在PASSIVE_LEVEL级上,能被任何执行在高于该IRQL上的活动抢先。设备驱动程序提供的大部分回调例程也执行在PASSIVE_ LEVEL上。前面讨论的DriverEntry和AddDevice例程就属于这类,大部分IRP处理函数也属于这类。Windows内核线程
4、调度程序运行在DISPATCH_LEVEL级驱动程序的一部分回调例程执行在DISPATCH_LEVEL级上,这些例程包括StartIo例程,DPC(推迟过程调用)例程等。它们都不受线程调度例程、IRP派遣例程的干扰,也不会互相干扰。系统在APC级处理页故障。在DISPATCH_LEVEL和PROFILE_LEVEL级之间是各种硬件中断级。通常把设备中断级称为设备IRQL,或DIRQL如何控制分页能力有时驱动程序的某些部分必须常驻内存而另外的部分可以被分页。控制代码和数据是否分页有两种办法:通过指导编译器的段分配过程将不同的代码和数据放在不同的段中。在运行时,装入器通过检查驱动程序中的各个段的段
5、名把段放到你指定类型的内存池中。利用一些内核服务函数在运行时动态调整驱动程序的分页布局。在编译时控制分页能力Win32可执行文件(PE文件),包括内核模式驱动程序,在内部都是由一个或多个段组合而成。段可以包含代码或数据,通常还会有诸如可读性、可写性、共享性、执行性,等等附加属性。段是指定分页能力的最小单元。当装载一个驱动程序映像时,操作系统把以“PAGE”或“.EDA(.EDATA)”为段名开头的段放到分页池中,而其他段并放到非分页内存池中段名为“INIT”的段被装载器装入分页内存中,但是当该段中的代码执行完毕之后,该段即被卸载掉。因此DriverEntry等初始化代码适合放在INIT段中注意
6、,装载器对段名是大小写敏感的。编译时控制代码的布置 方法1:使用alloc_text编译指示可以将驱动程序的某单独例程放到特定段中。/把两个函数的代码放到分页池中#pragma alloc_text(PAGE,Wdm1AddDevice)#pragma alloc_text(PAGE,Wdm1DispatchPnp).该编译指示必须放在函数声明后面并且在函数定义的前面,必须和函数定义在一个模块内。该编译指示仅能用于有C连接形式的函数。即,它不能用于类成员函数或C+源文件中未用extern C声明的函数。编译时控制代码的布置方法2:用code_seg编译指示。该指示之后的代码都被放到了code_
7、seg定义的同一个段中,直到碰到下一个指示。#pragma code_seg(PAGE)NTSTATUS AddDevice(.).NTSTATUS DispatchPnp(.).#pragma code_seg()/恢复到默认的代码段设置安排如果强制DriverEntry函数进入INIT段,当函数返回后,系统将释放掉它占用的内存。这样可以节省内存。编译时控制静态数据的布置用data_seg编译指示使所有在其后声明的静态数据变量进入分页池。一个分页段可以从#pragma data_seg(PAGE)出现的地方开始到#pragma data_seg()出现的地方结束。#pragma data_s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WDM 驱动程序设计 驱动程序 设计
限制150内