Windows内核原理与实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

《Windows内核原理与实现》是一本讲述Windows内核机理,并配合Windows的源代码来解释其实现细节的学习用书。全书从操作系统原理的角度来组织内容。本书适合于已经有了操作系统基本概念的读者进一步理解Windows操作系统。通过学习本书的内容,读者不仅可以掌握Windows的核心机制,也可以理解像Windows这样的现代操作系统是如何构建起来的。因此,这是一本Windows操作系统内核学习用书,而不是一本指导在Windows平台上进行软件开发的书。

对于绝大多数IT从业人员及高校学生来说,Windows已经是一个熟悉得不能再熟悉的操作系统了,而且也有相当多的人能够熟练地开发各种类型的Windows应用程序,然而,真正熟悉Windows内部机理的人却少而又少。究其根源,很多人将这归咎于Windows是一个闭源操作系统,也就是说,除了Microsoft内部的员工以外,人们接触不到Windows的源代码。这样的解释只能说是部分正确的,因为从历史发展来看,UNIX类操作系统确实有广泛的群众基础,很多人得益于阅读各种UNIX版本的源代码(包括Linux和FreeBSD)。但对于Windows操作系统,这似乎并非一个合理的解释,因为事实上,有相当多的人在过去三四年间已经获得了Windows的源代码,但是在代码阐释和核心深入理解方面却并未表现出拥有源代码而带来的优势。反倒是在过去几年间基于逆向工程而获得的Windows核心知识要深刻得多。

这么说并非指Windows源代码没有帮助,而是间接地揭示了一个事实:Windows的源代码不是那么容易读的,Windows的核心也不是那么好理解的。本书作者在过去几年间,与国内高校的操作系统课程的老师和学生有着广泛的接触和了解,真切地感受到,要想在操作系统课程中完全融入Windows的内容,迫切需要一本按照操作系统基本概念和理论来阐释Windows实现机理的书籍。基于这样的动机,本书力图让学习操作系统的读者能够理解Windows中的核心机制,并且可以近距离地观察到Windows内核中的实现细节。

本书针对的读者

对Windows内核有好奇心的读者,无论您是操作系统课程的学生,或是正在从事系统软件开发的软件工程师,或是有技术背景的Windows系统管理员,都可以从本书中找到很多问题的答案。虽然本书中描述的大多数细节是以WRK(Windows Research Kernel)的代码为基础,但是,对于各种核心机制的介绍却是通用的,并不限于WRK内核,甚至适用于各种版本的Windows,包括最新的Windows Vista、Windows Server 2008和Windows 7。

对于有资格获得WRK的读者(包括高校老师和学生),本书可以是配套的学习参考用书。本书正文部分列出了WRK中一些关键的数据结构定义,而在介绍各种核心机制时,明确地指出了源代码中的函数调用关系、关键数据的含义和用途,甚至在有些地方指明了WRK中对应的代码片段。因此,配合WRK代码来阅读本书是最理想的阅读方式,就如同本书作者在写作过程中经常查看WRK代码一样。

然而,对于因某些原因而无法获得WRK的读者,本书仍然有指导意义。首先,本书在讲解Windows内核的核心机制时,几乎都以文字或图形的方式描述了这些机制的总体结构,并指出了关键的数据结构或函数。即使没有WRK代码的参照,读者也可以想象出这些函数的功能实现。其次,如果读者善用windbg,并设置Microsoft提供的公共符号服务(参考本书附录A),则可以在内核调试环境中查看到很多实现细节。书中描述的绝大多数核心机制不仅适用于Windows Server 2003 SP1(即WRK内核适用的系统),也适用于其他的Windows版本,包括Windows XP、Windows Vista、Windows Server 2008和Windows 7。

本书不是一本轻松的入门书籍,无论读者是否拥有WRK,都最好在阅读以前先有操作系统的基本知识,以及较为熟练的编程能力,起码要能够轻松地阅读C代码。硬件系统结构、汇编语言和编译原理等知识虽然不是必要的,但是有了这些知识,可以让您更加深入地理解各种系统机制。

本书内容组织

本书的内容并没有覆盖Windows内核的方方面面,而是从现代操作系统的概念模型出发,重点讨论了进程、线程和内存管理的基本概念以及在Windows中的实现细节,也讨论了Windows中的并发性和同步处理机制。作为一个对各种硬件设备有广泛兼容性的桌面操作系统,Windows的I/O模型是提供这种兼容能力的基础,因此,Windows中的I/O处理也是本书重点讨论的内容之一。在此基础上,本书还讲述了Windows的存储体系结构,它把Windows系统中众多的内核组件,包括缓存管理器、文件系统、磁盘管理驱动程序等,纳入到了一个统一的框架中。

这些内容构成了本书的主体。然而,仅仅这些还不足以形成一个完整的操作系统,Windows内核中还有其他一些不可或缺的机制,比如内核中的对象管理、配置管理(即注册表服务)、系统内核日志、安全性管理、系统服务分发、LPC(Local Procedure Call,本地过程调用),以及网络和Windows子系统等,本书对此也给出了足够详尽的描述,以使读者能够透彻地理解Windows操作系统的全貌。另外,Windows内核的初始化过程也在本书的覆盖范围之中。

在描述以上这些内核机制时,本书以WRK为主要的参照系统。WRK支持AMD64和Intel x86两种体系结构,本书选择以Intel x86作为目标平台,而完全忽略在其他体系结构上的差异。Windows XP(x64)和Windows Server 2003 SP1(x86)分别代表了客户端操作系统和服务器端操作系统,它们使用了同一套内核源代码,所以,虽然本书讨论的内容以Windows Server 2003 SP1为基准系统,但同样适用于客户端操作系统。

本书讲述的内容显然超越了WRK中源代码的范围,对于在WRK中未提供源代码的话题,比如即插即用管理器、Windows子系统和网络等,本书参考了Microsoft提供的各种文档,以及通过其他途径提供的源代码,例如Windows DDK文档和例子驱动程序。此外,Mark Russinovich和David Solomon合著的《Windows Internals》(第4、5版,中文版书名为《深入解析Windows操作系统》)也是重要的参考材料。本书在讲解各个话题时注明了所引用资料的出处,对于Microsoft提供的参考资料,包括Windows DDK文档,本书在参考资料引用条目中注明了这些内容在MSDN网站上的链接。

本书内容简介

本书共包括9章正文内容和两个附录。内容介绍如下:

第1章介绍了操作系统的基础概念、Windows操作系统的发展历史、Windows内核的发展,以及学习操作系统的一些前提知识,最后还介绍了操作系统的研究进展。

第2章从总体上介绍了Windows操作系统。首先讨论现代操作系统的基本模型,以及一些重要部件的职责;然后讨论Windows的总体结构,以及有关WRK和相应源代码的一些说明。为了让读者对Windows内核有一个初步的认识,这一章还介绍了内核中的一些基本概念,包括进程、线程、内存管理、中断、异常、同步等,然后细致地讨论了Windows内核中的公共管理设施,包括对象管理器、配置管理器、事件追踪(ETW)和安全性管理。之所以在这一章中介绍这些公共设施,是为了让读者在学习本书后面章节中的核心概念和机制时,可以方便地直接引用这些管理设施中的功能。这一章的最后还介绍了Windows引导过程,包括内核初始化和用户会话建立过程。

第3章讨论了Windows中的进程和线程管理。首先讨论了进程和线程的基本概念,然后描述了Windows中有关进程和线程的重要数据结构,列出了这些数据结构的定义并解释了其中域的含义。接下来介绍了Windows进程中的句柄表结构、进程和线程的创建过程和结束处理,以及系统的初始进程和线程。这一章后面还介绍了Windows中的线程调度,包括时限管理、环境切换、线程状态转移等内容。

第4章介绍了Windows中的内存管理。首先介绍了一般性的内存管理知识,包括页式内存管理和段式内存管理。然后介绍了Windows的系统内存管理,涉及系统地址空间初始化、换页内存池和非换页内存池的管理算法,以及系统PTE区域的管理算法。紧接着介绍了进程地址空间的内存管理,包括地址空间的创建和初始化、虚拟内存的管理数据结构,以及内存区对象(section object)。然后讨论了Windows的页面交换机制和物理内存管理。最后讨论了Windows的工作集(working set)管理。

第5章讨论了Windows中的并发和同步机制。这一章首先介绍了有关进程和线程同步的基础知识,然后介绍了Windows中的中断和异常处理机制,包括IRQL(中断请求级别)、中断对象、DPC(延迟过程调用)、定时器管理、APC(异步过程调用),以及异常分发过程。接下来分别介绍了两种类型的同步机制:高IRQL时的同步处理,以及基于线程调度的同步机制。Windows支持大量的同步语义,而且很多同步语义被导出成系统服务,可供应用程序使用。

第6章讲述了Windows的I/O模型。首先讨论了Windows I/O系统的三个重要部件:I/O管理器、即插即用管理器和电源管理器,介绍了设备驱动程序的初始化,驱动程序对象、设备对象和文件对象的数据结构,设备的列举过程,以及Windows中电源I/O请求的处理过程。在此基础上,详细讨论了设备驱动程序,包括驱动程序分类、驱动程序结构模型,并通过一个例子(toaster)说明了驱动程序设备栈结构。最后,介绍了I/O处理,包括IRP(I/O请求包)的定义、I/O请求的处理过程以及I/O完成处理。

第7章讨论了Windows的存储管理。这一章分别讨论了Windows的缓存管理器、卷的管理以及文件系统。缓存管理器将文件系统和内存管理器有机地结合起来;而文件系统和卷管理驱动程序以及磁盘管理驱动程序联合起来形成了一个存储栈,为Windows提供外部存储服务。还讨论了文件系统的过滤机制,以及三个文件系统的实现:RAW(由内核模块提供)、FAT和NTFS。

第8章讨论了Windows的系统服务。这一章首先描述了Windows用户模式代码调用内核模式系统服务的详细过程,然后介绍了Windows的系统服务分发机制。随后,还介绍了三个重要的跨进程通信系统服务:LPC(Local Procedure Call)、命名管道(Named Pipe)和邮件槽(Mailslot)。

第9章介绍了一些高级话题,重点讨论了Windows中的网络结构、Windows子系统,以及Windows的内核日志。最后介绍了Windows最新版本(Windows Vista、Windows Server 2008和Windows 7)中的一些重要变化。

本书正文之后是两个附录。附录A讲述了如何编译WRK,以及在虚拟机环境中运行和调试WRK。附录B介绍了一个基于WRK的学生实习项目:KInjectToolKit,KInjectToolKit允许把一段用户模式代码插入到内核模式下运行,从而提供了在响应内核模式事件时执行用户指定代码的能力。

本书内容与Windows系统的版本

本书中介绍的Windows核心机制的实现细节以Windows Server 2003 SP1为准。由于Windows体系结构在不同版本之间基本上没有变化,内核机制的变化也非常微小,所以,本书绝大多数内容适用于自Windows 2000以来的各个Windows版本,包括Windows Vista、Windows Server 2008和Windows 7。此外,在本书讲解过程中,有些地方特别指出了Windows Vista及以后系统的内核变化。

本书的配套工具

为了配合本书中的内容讲解,本书也特别提供了一组工具,读者可以通过本书的主页下载到这些工具,它们不仅可以运行在WRK内核的系统中,也可以在其他版本的Windows系统上运行。下面是这组工具的简单介绍:

· ProcMon,进程和线程监视工具。它可以实时地显示当前每个处理器正在执行哪些进程和线程。这些信息还可以被转储到一个文本文件中供进一步分析和查看。

· MemMon,内存监视工具。它可以显示当前系统内存空间和每一个进程的用户空间的内存布局。在进程内存空间,MemMon能够显示进程中的模块、堆、栈等信息。

· DPerfLite,一个可以揭示线程间同步关系的工具。它记录了当前系统中与同步有关的内核操作,允许用户在一个图形界面中直观地观察这些操作,并检查线程之间的各种同步关系。

· IRPMon,IRP完成情况的监视工具。它在内核中记录下每一个I/O请求的完成操作,然后由IRPMon用户模式程序定期地从内核中获取这些记录,并显示在一个列表窗口中,供用户查看。

· SdtViewer,SDT(服务描述符表)显示工具。此工具可以显示出当前系统中的SDT;如果有符号信息支持,它也能够显示Windows子系统的SDT。

本书的支持信息

本书的主页是发布各种与本书内容有关的信息的场所,包括前面提到的一组工具,以及本书的勘误、修订信息。主页地址为:

http://www.phei.com.cn/windowskernelbook

您也可以将有关本书的建议和疑问,包括在阅读本书过程中遇到的问题、发现的错误,通过以下电子邮件地址发送给作者:

winkernelbook@live.com