Windows的设备驱动框架中的上层与下层模块

在Windows的设备驱动框架中,下层模块向上层模块提供一个数据结构指针。但是,上层模块并不直接从这个数据结构获取具体的函数指针,更不直接使用这些函数指针调用下层模块中的函数;而是通过一些由内核提供的函数下达“I/O请求包”即IRP,间接地调用下层模块提供的函数,要求其执行某种操作。这就好像是向内核下一个定单,定单中告诉内核要由哪一个下层模块执行何种操作。另一方面,对于建立了形式“堆叠”的设备驱动,上层模块在运行中通常也没有如何“找到”下层模块的问题,甚至根本就不必知道其下一层是什么模块或什么设备,模块之间已在建立形式堆叠的时候固定连接好了。此时上层模块所获得的是哪一个下层模块的指针,取决于同一个堆叠中各个模块的装载次序,实际上取决于系统的配置,而相关的配置信息则最终来自相关的.inf文件,这些信息保存在集中的数据库“注册表(Registry)”中。这样就为通过系统配置改变具体设备驱动堆叠的结构提供了更大的灵活性,主要体现在:
    更容易在堆叠的下层实现“重定向”,即把上层模块嫁接到不同的下层模块上;
    更容易在堆叠内部插入以“过滤驱动对象(FiDO)”为代表的“过滤模块”。
最后,设备驱动模块不是在真空中运行,需要得到内核的支持,需要由内核为其构筑起一个运行环境,这个环境的主体就是内核导出函数,此外还有一些全局的变量和数据结构。这就是Windows的“设备驱动开发包”DDK中所定义(更准确地说是“声明”)的函数和变量。
    事物都是在发展的,Windows的设备驱动框架也不是一开始就这样,更不是永远这样。前面所讲的是为实现“即插即用”所必须要有的要素,主要就是模块的动态装载以及模块堆叠的形成。有了这些要素,包括即插即用在内的分层设备驱动就可以实现了,但是当然还可以有一些附加的要求。从Windows 98和Windows 2000开始,微软定义了一种(在当时是)新的设备驱动框架,称为WDM即“Windows设备驱动模型(Windows Driver Model)”。WDM要求设备驱动模块除满足PnP的需要外,还必须提供两方面的功能支持:
    对于WMI的支持。WMI是“Windows管理手段(Windows Management Instrumentation)”的缩写。WMI与“简单网络管理规程”SNMP相似,要求每台Windows主机都能应“管理器(Manager)”的要求提供包括设备驱动在内的各种状态和统计信息。这些信息从哪儿来呢?对于设备驱动,当然得要由相应的设备驱动模块提供。
    对于电源管理的支持。有些外设能耗不小,如果有一段较长的时间没有实际使用,就没有理由不将其转入某种“省电模式”。即使是能耗不大的外设,在节能成为一个环保问题的今天,也应该在不用时使其转入省电模式。这就是电源管理要达到的目的之一。所以,微软把支持电源管理列为WDM的要素之一。
    总之,“老式”的设备驱动(在形式上)是不分层、不堆叠的;如果形式上分层并堆叠,在微软的术语中就称为“PnP设备驱动”。而WDM设备驱动,则是至少在形式上满足了上述两项附加条件的PnP设备驱动。对WMI的支持和电源管理的重要性当然不容低估,但是对于我们理解Windows的设备驱动框架却并非技术关键,所以后面的叙述将集中在框架的构成与实现,而忽略这两个方面。正因为这样,我们将称之为“Windows设备驱动框架”而不是“WDM”,以免混淆。

Windows的设备驱动框架中的上层与下层模块相关推荐

  1. Windows的设备驱动框架

    Windows的设备驱动框架 Windows内核管理层的部件之一是I/O管理模块,有时候也称为I/O子系统.I/O管理模块所管理的对象与活动纵向贯穿管理层.核心层乃至HAL层,所以称之为子系统其实也有 ...

  2. linux内核的块设备驱动框架详解

    1.块设备和字符设备的差异 (1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位.大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作; (2)块设备对于 I/O 请求 ...

  3. linux pcie驱动框架_Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  4. windows linux 融合,Windows和Linux的设备驱动框架的对比融合研究

    摘要:把驱动框架分为三层,针对各层在Windows和Linux中的实现方法的不同,对Windows和Linux的设备驱动框架进行对比研究.从接口函数,应用程序访问驱动程序的路径,驱动程序具体实现及安装 ...

  5. Windows CE设备驱动开发之电源管理

    4.7电源管理 电源管理模块管理设备电源,从而全面改进操作系统的电源使用效率:它所有设备的电源使用,同时能与不支持电源管理的应用程序及驱动程序共存. 使用电源管理可以有效的减少目标设备的电源消耗,同时 ...

  6. RT-Thread I2C设备驱动框架的对接使用

    I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线.I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯.I2C协 ...

  7. Linux驱动框架之misc类设备驱动框架

    1.何为misc设备 (1)misc中文名就是杂项设备\杂散设备,因为现在的硬件设备多种多样,有好些设备不好对他们进行一个单独的分类,所以就将这些设备全部归属于 杂散设备,也就是misc设备,例如像a ...

  8. Linux之字符设备驱动框架

    目录 一.驱动介绍 1.内核模块 2.日志级别 3.模块符号的导出 4.内核模块参数 二.字符设备驱动(一) 1.模块加载 2.注册字符设备驱动 3.内存映射 三.字符设备驱动(二) 1.模块加载 2 ...

  9. Linux驱动开发 15 块设备驱动框架

    CAN         I.MX6ULL 带有两个 CAN 控制器: FlexCAN1 和 FlexCAN2 , NXP 官方的 EVK 开发板这两个 CAN 接口都用到了,因此 NXP 官方的设备树 ...

  10. Linux总线设备驱动框架的理解(非常棒的文章!)

    以下内容源于微信公众号:嵌入式企鹅圈.有格式内容上的修改,如有侵权,请告知删除. Linux的设备驱动框架,即某类设备对应的驱动的框架. 这里是"Linux总线设备驱动框架",应该 ...

最新文章

  1. 在指定的查找范围内获取DOM元素
  2. Linux之特殊权限(SUID/SGID/SBIT)
  3. linux字符设备驱动的 ioctl 幻数
  4. data后缀文件解码_Java语法进阶13-文件、IO流
  5. 9.关于Unicode字符集
  6. Java 计算两个日期相差的天数
  7. ESXi 6.7 的https服务挂掉处理方法 503 Service Unavailable (Failed to connect to endpoint: [N7Vmacore4Http16Loc
  8. c语言中6 2等于多少,概率中C62怎么算(6是下标,2标在上面)
  9. 每月碎碎念 | 2019.10
  10. windows和linux环境下的嵌入式开发区别
  11. 巅峰战舰正在连接服务器,人气冲天《巅峰战舰》火爆连续加开服务器
  12. 稳压二极管与TVS管
  13. word修订模式怎么彻底关闭_如何去掉word修订模式
  14. html圆形图片切换,jQuery和CSS3炫酷圆形图片切换特效
  15. Python Flask框架-开发简单博客-认证蓝图
  16. Git生成ssh ksy后进行项目管理
  17. 开关电源空载吱吱声_开关电源变压器工作时为什么出现吱吱声?
  18. 快应用开发1--编译官方的代码并在手机上运行rpk文件(Windows系统上)
  19. python 打开文件夹_python打开目录
  20. 多媒体——视频——使用摄像机录制视频

热门文章

  1. # 20162312 2017-2018 《程序设计与数据结构》第7周学习总结
  2. php操作mysqli(示例代码)
  3. php数组的概述及分类与声明
  4. 主键与主键索引的关系
  5. 深入Atlas系列:Web Sevices Access in Atlas示例(3) - 在Web Services方法中使用多态
  6. GoogleTest测试框架介绍(二)
  7. 面向对象编程 --- 反射
  8. Whl自助搜索下载器
  9. 和运营开会的知道的一些点
  10. 20172315 2017-2018-2 《程序设计与数据结构》实验三报告