读书频道 > 系统 > windows > Windows内核原理与实现
6.2.4 对象生命周期管理
2013-05-18 16:41:18     我来说两句 
收藏    我要投稿   

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

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

前面两小节介绍了设备对象、驱动程序对象和文件对象的数据结构,以及它们的创建和初始化过程。由于它们都是对象管理器中的对象,所以,这些对象的生命周期都是通过引用计数来管理的。然而,在删除这些对象时,除了要删除它们本身占用的基本存储资源以外,还有些额外的事情要做,下面一一加以说明。

当一个设备对象的引用计数减到 0 时,设备对象类型的删除函数 IopDeleteDevice 被调用,它的代码位于 base\ntos\io\iomgr\objsup.c 文件的 823~873 行。由于已经没有任何客户再引用该设备对象了,所以,IopDeleteDevice 首先调用 IopDestroyDeviceNode 销毁掉相应的设备节点(关于设备节点,参见6.3.3 节),然后,若有必要,释放卷参数块(VPB )所占用的内存。最后,将对应驱动程序的引用计数也减1。这是因为,每个设备对象的存在正是驱动程序对象留在内存中的理由之一。所以,只要驱动程序对象还有一个设备对象存在,它就不会被删除。

另一个函数,IoDeleteDevice,也是设备对象的删除函数,但是,它被调用的场合有所不同:当设备驱动程序被卸载时;在驱动程序初始化失败时,要把刚刚创建的设备对象删除掉;或者当对应的设备被移除时。在这些情况下,设备对象的引用计数有可能仍然大于0,但是它的存在已经没有意义,因此,可调用IoDeleteDevice 函数来删除设备对象。

在对象管理器中注册的驱动程序对象的删除例程是IopDeleteDriver 。当驱动程序对象的引用计数减到0 时,对象管理器调用IopDeleteDriver 函数来清除该驱动程序对象。IopDeleteDriver 函数的代码位于 base\ntos\io\iomgr\objsup.c 文件的 737~821 行,其功能逻辑非常直截了当,只是将驱动程序对象所占用的资源释放掉,并调用MmUnloadSystemImage函数卸载驱动程序的映像文件。另一个函数,IoDeleteDriver,只是简单地调用ObDereferenceObject ,将删除驱动程序对象的任务交给对象管理器来完成。

文件对象的删除例程是IopDeleteFile 。这是当文件对象的引用计数减到 0 时被调用的函数,其代码位于 base\ntos\io\iomgr\objsup.c文件的434~735 行。它除了要清除文件对象本身所占用的资源以外,还要向与之关联的设备对象发送一个IRP_MJ_CLOSE类型的I/O请求。然后,若有必要,它会调用IopDecrementDeviceObjectRef 函数,使关联的设备对象以及文件系统的卷设备对象,引用计数减1。

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

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