第二章,系统架构——客户端和服务器版本的区别
第二章,系统架构——环境子系统和子系统DLL

第二章,系统架构——检查版,系统核心组件

打狗棒 posted @ 2012年5月17日 21:31 in Windows.Internals.6th , 1949 阅读

检查版

有一个windows的特殊版本叫检查版(checked build,订阅了MSDN操作系统才可使用)。它是加入了调试标签“DBG”的一个重新编译版本 (加入了编译运行时,传统调试和源码跟踪)。为了帮助我们更容易地理解机器码,windows没有做任何代码优化,所以执行效率并不高。(参阅windows调试工具“调试性能优化代码”相关段落)

检查版主要是给驱动开发人员提供帮助的,因为它在驱动或者其他系统代码调用内核函数的时候执行更严格的错误检查。例如,一个驱动程序(或者其他内核模式代码)被检测出属于非法调用(比如错误的中断级别占用自旋锁)的时候,系统会停止运行,而不是采用正常策略:某些数据结构被修改以至于系统不得不随后才引起崩溃。

实验:确定是否运行在检查版下

没有一种这样的工具来查看是运行在检查版还是零售版。该信息可以在WMI中的Win32_OperatingSystem类的“Debug”字段查看。下面一段简单的VB脚本输出该属性。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
("SELECT * FROM Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
Wscript.Echo "Caption: " & objOperatingSystem.Caption
Wscript.Echo "Debug: " & objOperatingSystem.Debug
Wscript.Echo "Version: " & objOperatingSystem.Version
Next

保存上述代码并执行。得到下面的输出:

C:\>cscript osversion.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
Caption: Microsoft Windows Server 2008 R2 Enterprise
Debug: False
Version: 6.1.7600

这个系统不是检查版,Debug标志位是False。

检查版的很多额外代码都是因为打开了ASSERT和/或者NT_ASSERT宏,此宏在WDK的Wdm.h文件中有定义,WDK文档中也有说明。这个宏会做一个条件检测(比如数据结果或者参数是否非法),如表达为为假,就会调用内核模式函数RtlAssert,该函数又调用DbgPrintEX发送调试信息到调试缓冲区。如果有内核调试器捕获,这条信息就会被自动提示给用户解决(下断点,忽略,终结进程,或者终结线程)。如果系统不是被内核调试器启动的(在启动配置库BCD中设置调试选项)而且没有内核调试器捕获异常,ASSERT检测失败就会挂起系统。有关内核支持的ASSERT列表,参阅WDK文档“Checked Build ASSERTs”。

检查版提供的有关某些组件的详细信息对于系统管理员也很有用。(更多细节参阅温软知识库文章编号314743,标题HOWTO: Enable Verbose Debug Tracing inVarious Drivers and Subsystems)。这些信息被DbgPrintEX函数输出在内部的调试信息缓冲区中。要查看这些信息,可以让一个内核调试器附加在目标主机上(需要目标主机启动的时候开启调试模式)然后用!dbgprint命令查看,或者用Dbgview.exe工具(下载地址http://www.microsoft.com/technet/sysinternals)。

你不必安装整个检查版,仅仅复制检查版的内核镜像(Ntoskrnl.exe)和HAL(Hal.dll)到一个正常的零售版中即可。这样做的好处是驱动和其他内核代码得到了严格的检查,而系统的速度又不至于因为全部执行检查而变得过慢。更多有关这种方式的信息,参见WDK文档中“Installing Just the Checked Operating System and HAL”。

最后,检查版也对于用户模式的测试人员同样有用。因为系统中运行时间的不同。(这是因为内核中的这些额外检查部分,实际上这些组件并没有被优化编译)通常多线程同步的bug都是因为时间问题。在检查版上(或者至少内核与HAL是检查版的)运行你的测试程序,整个系统中各部分运行时间的不同可能会引起bug。这在正常的零售版中不会引起。

系统核心组件

现在,我们已经看过了windows系统比较上层的架构,该进入系统结构的内部,看看各个核心组件都在扮演什么角色。图2-3展示了系统核心架构和组件的更多更完整细节。注意,这张表仍然没有全部展示所有的系统组件(如第七章中提及的网络)。

后面的章节中阐述了图表中的主要成员。第三章解释了系统采用的主要控制机制(如对象管理,中断,第四章也是如此)。本书的第二部分第十三章“启动和关机”描述了开关机时候的进程情况。第四章详述了管理机制例如注册表,服务进程和WMI。其他的章节解释了系统内部结构和核心区域比如进程与线程,内存管理,安全,I/O管理,存储管理,cache管理,windows文件系统和网络。

图2-3 windows架构 点击看大图


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter