读书频道 > 系统 > windows > Windows内核原理与实现
6.3.3 设备列举与设备树
2013-05-20 08:07:41     我来说两句 
收藏    我要投稿   

本文所属图书 > Windows内核原理与实现

本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本...  立即去当当网订购

设备列举是在I/O 系统初始化过程中进行的,I/O 系统创建的第一个设备对象是由驱动程序“\Driver\PnpManager ”实现的一个无名设备对象。该设备对象是列举的起始点。HAL本身也被认为是一个总线设备,在支持 ACPI的系统中,通过 HAL设备,可以进一步列举到ACPI。然后进一步列举到PCI 总线上的各种设备,包括通过PCI-ISA 桥连接的设备。如此进行下去,所有具有总线能力的设备都以递归的方式列举它们的设备,直至所有的设备都被列举出来。

 在列举过程中,每个节点都是通过一个类型为DEVICE_NODE 的对象来描述的。随着列举过程的进行,一棵以全局变量 IopRootDeviceNode 为根节点的树被建立起来。根节点代表了驱动程序“\Driver\PnpManager ”在列举开始时创建的无名设备对象。每一个总线设备所列举到的设备都挂到该总线设备所在节点的下方,作为它的子节点。显然,DEVICE_NODE 数据结构维护了树的连接信息,以及指向相应设备对象的指针。图6.9是在虚拟机环境下一个ACPI兼容的Windows Server 2003 SP1系统的设备树,它并没有显示出所有的设备节点,这里显示的大多数节点都与驱动程序相对应。因此,对照表6.1,我们基本上可以理解这些设备节点的含义和用途。从图中我们可以看出,在该系统中,支持即插即用的设备都是通过PCI 总线和PCI-ISA 总线列举出来的。另外有两点值得说明:第一,如果在一台物理机器的系统上显示设备树,那么,在ACPI节点下面,除了pci节点,我们往往还可以看到有关电源、风扇或处理器等设备节点;第二,对于那些不支持即插即用的设备,它们的设备节点直接挂在根节点下。


 

硬件总线设备有能力列举其从属的设备,这是设备列举的关键所在,此外,注册表中的信息也起到了重要的作用。例如,根节点作为一个虚拟设备节点,利用注册表中的信息来构造它的子节点。这些信息保存在 HKLM\SYSTEM\CurrentControlSet\Enum\Root键下面的子键中。在列举过程中,根节点驱动程序对每个子键都会创建一个设备对象和设备节点。注册表中的信息是如何来的呢?这是在安装操作系统时由安装程序提供的,或者在安装某些驱动程序时加入进来的。

结合注册表中的信息,即插即用管理器在列举设备的过程中,不仅会建立起一棵完整的设备树,而且也会把相关的驱动程序加载到系统中并执行初始化。正如6.2.1节所介绍,I/O 系统在初始化时,首先加载并初始化“引导- 启动”类型的驱动程序,这是由IopInitializeBootDrivers 函数针对每个这种类型的驱动程序调用 IopInitializeBuiltinDriver 函数来实现的。IopInitializeBootDrivers 同时也针对每个驱动程序的设备执行列举操作。类似地,当 I/O 系统在加载并初始化“系统-启动”的驱动程序时,它也会执行设备列举操作,这发生在IopInitializeSystemDrivers 函数中。由此可见,I/O 系统在初始化过程中已经建立了设备树。

当有设备变化,比如检测到新的设备等情况发生时,驱动程序可以调用I/O 系统提供的一些函数重新列举设备或者分配资源,这样的 I/O API 函数包括IoInvalidate- DeviceRelations 、IoSynchronousInvalidateDeviceRelations 、IoReportDetectedDevice 和IoInvalidateDeviceState 等。

设备树中的每个设备节点都有一个名称,称为实例路径(InstancePath),其形式为< Enumerator >\<DeviceID >\<InstanceID > ,这里Enumerator 是总线驱动程序的名称,DeviceID 是设备的唯一标识,而 InstanceID 则唯一标识了一个硬件设备的实例。注册表键HKLM\SYSTEM\CurrentControlSet\Enum 下面正好以 InstancePath 的形式存放了一个设备节点的信息,这也正是通过HKLM\SYSTEM\CurrentControlSet\Enum\Root 键可以列举出根节点下面的所有子节点的原因。

在每个设备节点上都必定有一个设备对象,称为 PDO(Physical Device Object),这是在列举过程中由总线驱动程序创建的设备对象。为了管理该设备,即插即用管理器加载一个功能驱动程序,并调用它的AddDevice 例程,同时将PDO传递给该例程。此AddDevice例程通常会创建一个功能设备对象(FDO ,Functional Device Object),并让该 FDO附载在PDO之上,因此,这两个对象构成了一个基本的设备栈,如6.2.2节所述。

对于一个设备而言,PDO 相当于它的物理接口,而 FDO则相当于它的逻辑接口。应用程序或内核向一个设备发送的I/O 请求,首先到达FDO,如果FDO的驱动程序能够直接处理,则不必传递给PDO;否则,I/O 管理器将此请求传递给PDO。另外值得一提的是,在设备节点的设备栈中,除了 PDO和FDO ,可能还会包含一个或多个起过滤作用的设备对象,它们是由过滤驱动程序创建的,本章6.5.5节将介绍过滤驱动程序的工作机理。 以上介绍了即插即用管理器的设备列举和设备树。即插即用管理器在设备列举过程中需要为设备加载驱动程序,它如何找到对应的驱动程序,以及驱动程序在安装时应提供哪些信息,关于这些问题,本书不再进一步介绍,读者可参考相关资料[WIN-INTERNALS]。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.3.2 Windows中驱动程序的即插即用支持
下一篇:6.5 设备驱动程序
相关文章
图文推荐
3.4.4 进程生命期管
3.4.2 Windows应用商
3.4.1 Windows应用商
3.4 进程生命期管理
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站