分节阅读 1(1 / 1)

黑客技术大宝库 佚名 5035 字 4个月前

声明:本书为txt图书下载网(bookshuku.com)的用户上传至其在本站的存储空间,本站只提供txt全集电子书存储服务以及免费下载服务,以下作品内容之版权与本站无任何关系。

---------------------------用户上传之内容开始--------------------------------

理解windows 2000 和 nt4 系统及进程活动

本讲座编号为tnq 400-02,我是david solomon,在接下来的两个小时中我们将讨论如何透过外表去观察windows 2000和windows nt 4.0,以便理解其内部运行机制以及如何在系统级别中实现这些机制,同时还将理解在系统中运行的进程。这个讲座的目的在于:当你感觉在nt系统中从性能的立场或从行为的立场上某些事情好像出错时给予你帮助;使你能够更近一些的观察系统外壳之下的部分并且理解cpu时间如何进行分配。如果系统运行速度慢,告诉你什么正在运行、为什么以及如何从应用程序执行中分离操作系统时间。

这个讲座假设你已经熟悉基本的操作系统概念,如进程的概念、多任务的概念、虚拟内存、分页等等;并且你是一个有经验的nt用户——不必是一名系统管理员,但至少应是一个权威的nt用户。

这个讲座结束后,你将能够使用一系列不同的工具来观察进程内部的活动,以便发现哪个文件被打开、io操作的来源和目标、哪些动态连接库(dll)正在由一个进程使用以及它们是从磁盘上的何处装入的、有关进程安全性的一些细节。

像我提到的那样,本讲座的目的之一是能够解释cpu时间。因此,如果cpu正在运行,那么它正在做什么并且为什么这样做呢?时间花费在那里以及如何被占用:是由操作系统、设备驱动程序、执行体还是应用程序所使用呢?理解nt操作系统上运行内容的另一个方面,是知道存在哪些系统进程。因此,如果某事务正在运行并且它不是由你所运行的,那么它是nt的一部分。正在运行的进程的作用是什么,并且你如何能够追踪到其占用cpu时间的可能原因呢?其中一个方面是由windows nt 系统进程组成的windows nt 服务,有时,正在运行的服务进程向后映射到哪些管理员通过管理界面可以看到的服务并不是非常清楚。

最后,我们来密切关注存在于系统进程这一非常特殊的进程中的粒度水平,该系统进程包含特殊种类的驱动程序线程运行片段和nt片段,而且,由于这种特殊进程的存在,促使我们务必深入钻研以理解进程中的哪些片段正在运行及其原因。

这有为本次讲座准备的路线图。首先我将对有关工具及其来源进行简明概述。这将是一堂高度依赖工具的讲座,而我将在此使用支持工具包、资源工具箱及internet上获取的部分工具。接着,我们将从三个角度来观察nt系统活动:首先是进程和线程,接下来是中断时间及其在nt中的服务与解释机理,最后,再对系统进程树进行遍历。

最后的题目是一种我们不希望发生、却又经常遇到的进程活动,即当进程死亡时看到dr. watson信息时的情况。我们将看到是什么导致了dr. watson,你能进一步得到哪些信息,以及你应如何应对这些输出。

首先让我们先看一看工具。这是一个关于本次讲座所使用到工具的总概括。性能监视器——它理所当然地在对nt系统活动的观察中发挥关键性作用。我们还将看到一些注册表键。注册表是nt用来对其自身进行配置的系统数据库,因此,它包括了有助于理解程序在何处运行、来自何处,以及将服务名称映射到映像名称上的信息。接下来,我们将探究两个来自于支持工具包中的进程观察工具……对于初次接触windows 2000的人而言,该支持工具包在nt 4.0中并不存在。曾经有一个nt 4.0资源工具包的有限子集,它与service pack 4.0相捆绑并称作windows nt资源工具箱支持工具,该工具包在windows 2000中已经更名为windows 2000支持工具,以此来消除在它与资源工具之间存在的混淆概念。它是每个windows nt和windows 2000销售版本的组成部分。它存在于支持工具文件夹中。它使用一个适当的安装程序来安装。它包括了40至50种集成在资源工具包中的工具,但该工具包对windows 2000用户而言是至关重要、不可或缺的。我将使用来自资源工具包的两个工具。它们是资源工具包所含200多种工具中的一分子,而我将强力推荐,如果你还未曾对资源工具包中的工具进行过浏览的话,这两个工具是支持工具的一套重要附件,通过它们,你将能够洞悉nt系统并理解其内部活动。

接下来列出的4个工具来自sysinternals.com网站。你也许已对该网站十分熟悉。它过去称为nt internals。在此我将进入其主页以使你们看到该网站的面貌。sysinternals是自由软件网站,这里有所有可免费下载的工具。这些工具中的大多数源代码也是公开的,这些工具被设计用来透过支持界面获取有关nt的信息,而这些信息往往是通过标准microsoft工具所不能访问到的。大多数nt管理员对此十分熟悉,你们将在讲座期间看到其中两个工具的使用情况。

那么,让我们从最基本水平上的进程与线程活动开始,在开始之前,先来定义一下有关术语。进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(nodepad)时,你就创建了一个用来容纳组成notepad.exe的代码及其所需调用动态链接库的进程。nt中的每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。我这里以沙箱为例进行阐述。

一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。这就是nt中强大的内存保护模型的形成机制,正是由于这种机理,才使nt明显区别于windows 3.1、windows 95及windows 98。

在windows nt和windows 2000中,程序、程序实例或者进程对其它进程的执行情况或内存空间施加影响是不可能的。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。

nt运行线程。换言之,线程运行而进程不运行。每个进程包含单一线程,因此,当你运行记事本时,就生成相应的进程沙箱用来容纳代码和数据,而一个线程则被创建用以在指向记事本程序的主要入口起点处开始执行过程。一旦该线程在运行,它就可以创建额外的线程,一个进程的多个线程并行进行调度,这使多线程编程非常复杂,每个线程均共享其所处进程中的专用内存空间。因此,在本张幻灯片的阐述中,进程中所示的三个线程(都具有同时运行的潜在能力)均对进程中的专用数据或地址空间享有同等的访问权限,这样一来,三个线程就必须彼此同步。

那么,为什么要有多线程呢?为什么程序员选择将程序分割成多个线程呢?有两个原因:1)它产生了更佳响应性的幻觉。以microsoft word为例。当你进行文件打印时,你就已默认选择了后台打印方式,打印处理会在你继续编辑文档的同时异步进行。这是如何发生的呢?word已创建了独立的线程来进行打印处理,并将打印线程的优先级设定低于处理用户输入的线程,由此,给用户提供了一种幻觉,即应用程序通过将相对优先级指定给不同线程的方式来对用户做出响应。但是,你在win 98和windows 95中无法得到,而在windows 2000与windows nt 4.0中能够得到的最大好处还在于,如果你工作在多处理器系统中,并且如果有多个线程要运行,这些线程事实上将能够在可用的处理器上同时运行。换言之,多线程应用程序能够自动地运行于可用处理器上,只要:a)该应用程序有一个以上的线程需要同时运行;b)这些线程的优先级支持该应用程序的运行。换言之,如果有具备更高优先级的线程存在于另一个cpu上……尽管你的应用程序有两个需要运行的线程,而因为在别的cpu上正执行着更为重要的任务,那么,也只能一次运行一个线程。

技巧问题。添加第二个处理器能使单一线程应用程序更快地运行吗?让我们设想你有一个非常简单的计算密集型、单一线程应用程序。它除了做计算工作之外还是做计算工作。添加一个处理器会使该应用程序更快地运行吗?好吧,你的第一反应是不,但答案却是肯定的,因为nt也有自身几个片段作为线程运行。如大多数操作系统一样,nt也拥有后台内务管理工作。因此,添加第二个处理器就意味着,当主要的计算密集型应用程序在无须短暂中断以执行后台操作系统内务处理活动的情况下仍能持续运行时,这类后台内务处理工作将会发生。

以上就是对进程和线程的简要描述。当考虑沙箱的规划时,nt和windows 2000是一个32位的操作系统。如果算一下就会知道,32位意味着4gb。默认情况下,nt将这4gb地址空间分割为两个2gb的地址空间,其中一个分配给用户进程,另一个则分配给操作系统。换言之,每个进程均提供了一个假想,即该进程拥有一个最大为2gb、且可以加载代码或数据的虚拟内存空间。当然,在一部128兆的膝上型电脑上,如果你运行5个将其自身扩展至2gb大小的应用程序,显然,这些内存空间的一个子集在任何时候都存在于物理内存中。上述情况都是透明且在后台执行的。这便是虚拟内存无处不在的表现。就象任何使用虚拟内存技术的操作系统一样,windows 2000仅将那些被进程占用的内存空间片段按其所需地引入物理内存之中。再次以记事本为例,当你运行notepad.exe时,nt并不是在程序开始时就将notepad.exe全部读入。它仅将碰巧被主线程执行途径所参考的可执行程序映像片段读入。同理,被记事本调用的动态链接库也不是在其被调用时即被从磁盘读入,而只有当这些动态链接库中的子例程被实际调用时,那些包含所需引用代码并存在于磁盘上的动态链接库片段才会按需求读入。

在屏幕的下半部分,2gb的系统沙箱因nt没有提供介于操作组件和驱动程序之间的保护而显得颇为引人注目。我相信,你们中许多从事nt系统管理的人都经历过因程序错误和第三方驱动程序而导致的蓝屏现象, nt也常因这些现象而受到指责,事实上,这是来自于第三方设备驱动程序中的错误所导致的,而nt遭受上述指责的原因之一便是因为nt的全部和所有的设备驱动程序都处在同一个沙箱之中。然而,每个进程都运行在其自身专用且受保护的沙箱之中,并不能影响其它的进程,同理,这些进程也不能影响操作系统,操作系统与驱动程序均存活在同一个沙箱中,而且,在驱动程序与操作系统之间并没有保护机制。现在,你也许会问,这是为什么?答案是性能。这就是每个事实上成功的32位操作系统的体制。必须将地址空间在驱动程序或操作之间进行切换也许会有很大的性能损失,但这里应强调注意的是,当添加驱动程序时,这种切换存在的原因之一就是让所有为驱动程序登记和windows文件保护而对windows 2000所进行的扩展均能够避免或限制管理员在未经全面验证和测试的情况下向系统沙箱中添加代码的偶然机会。

操作系统进程本质上并不存在。下面我们将会看到一种称作“系统”的进程。但那并不是指操作系统。在这些进程中,有一些操作系统的片段正在运行,但也有若干执行后台内务处理活动的进程同时存在。当记事本打开一个文件时,它产生一个系统调用来打开磁盘上的文件。这一打开磁盘文件的工作被产生该请求的记事本线程的上下文完成。在这种意义上,操作系统运行于记事本进程的内部,而由于操作系统恰恰是一个由那些产生诸如打开文件、读取文件、分配虚拟内存及创建进程等用户线程调用的大的子例程库,故而它也同样运行于其它每一个进程之中。

windows 2000添加了允许将多个进程群集为