软件技术潘爱民:掀开Windows内核的神秘面纱

米花 发表 于:10年前 浏览量:250

在微软工作,最有吸引力的地方是能够融入微软的大家庭中,并触摸到方方面面的技术和产品。微软的产品线遍布软件技术的各个方向,真正称得上软件帝国。对于软件技术人员,这是极好的机会来满足自己的求知欲,并领略各种先进的软件产品是如何诞生的。

我有幸加入微软亚洲研究院,并从事自己喜欢的系统技术研究工作。最近两年,在机缘巧合之下,选择Windows内核原理作为写作题目,最终完成了一本讲述Windows内核技术的学习用书——《Windows内核原理与实现》(电子工业出版社,2010年5月),封面如下图所示。

神秘的Windows内核

在外界看来,Windows操作系统的核心是极其神秘的,微软官方的书籍大多停留于API层面,但业界却爆出了不少关于Windows内核的各种讯息,包括一些冠名为“Undocumented Xxx”的书籍和文章。事实上,微软对于操作系统技术并不封闭,也没有刻意遮掩什么。关于Windows操作系统的核心技术,MSDN中有不少文章涉及底层实现细节,而且,微软公开的符号服务,更是直接暴露了各个系统模块中的符号信息。对于逆向工程爱好者而言,这无疑是一份极好的礼物。

有两件事情足以说明微软对Windows操作系统技术的开放心态:

(1)鼓励和支持“Windows Internals”一书多个版本的出版,此书不仅披露了让管理员更好地使用最新版本Windows的细节知识,而且也提到了Windows内核中各种机制的工作原理,以及一些设计理念。可以这样说,凡是看过这本书的技术人员,对于Windows内核不会再觉得神秘。

(2) 2006年7月开放了一份内核源代码——WRK(Windows Research Kernel)。WRK本质上是Windows Server 2003 SP1(和Windows XP x64)的内核源代码,就当时而言,代表了微软的最新内核技术。微软公开这份内核源代码的意图是,学校和科研机构可以用于操作系统的教学和研究。除了内核源代码,WRK还包含一些设计文档、学习讲义,以及内核的执行和调试环境。这些设计文档反映了Windows NT最初的核心团队是如何设计各个系统组件的,今天我们回头来看这些设计文档,尤其值得学习和深思。

我正好有机会翻译了“Windows Internals”第4版,这让我系统化地学习和认识了Windows操作系统。尽管在此之前,我对Windows已经非常熟悉,可以熟练地编写各种类型的应用程序,也了解Windows内核的许多组件,但翻译这本书的过程让我重新认识了Windows操作系统,从技术人员的角度认真地考虑了Windows系统的设计。

至于WRK,我在正式发布之前便已拿到,并帮助测试了其编译环境。在随后的几年中,我一直协助研究院的高校关系部门向国内高校推广和普及WRK的教学与研究,这期间结识了不少高校老师和学生。最终促使我写作Windows内核原理一书的缘由也因此而起。

在研究项目中深入Windows内核

与产品部门相比,在研究院工作的一个优势是,研究员们往往有机会选择自己感兴趣的问题作为研究对象。Windows经过十多年的发展,已经是一个很成熟的产品了,但是,Windows内核不见得已臻完美,它也仍然在发展和完善。其中一个重要的问题是性能,Windows Vista之所以饱受批评,一个显著的原因是它的性能未达到用户的预期;而Windows 7之所以深受好评,部分原因也要归于它良好的性能表现。

我最初从应用程序角度来看待性能问题。依据我自己的体验,有些应用程序时常会发生一些奇怪的事情,比如,即使系统很空闲时,它们可能也非常慢,对用户的响应并非如预期的那样快捷。当我碰到这样情况时,常常想,要是能钻到系统里边,看看系统到底在干什么,是否就能立即查明原因呢。这促使我想到,在内核中记录一些关键事件,利用这些事件信息来诊断应用程序的问题。最终的根源可能在应用程序,也可能在操作系统中。这是很原始的想法,后来进一步的研究和实践表明,这是可行的。在研究过程中,还解决过身边同事们的一些实际问题。

在研究Windows性能的过程中,恰逢Windows Vista和Windows 7两个系统的发布,我有机会跟Windows产品部门的同事交流关于性能问题的看法和各种做法。此外,微软亚洲工程院有一个小组一直在分析Windows的各种实际性能问题,这为我们的研究工作提供了实例支撑以及应用基础。因此,这一研究项目得到了多个部门的支持。

在实施这一研究项目过程中,我积累起了关于Windows内核的知识,虽然无法通晓Windows内核的方方面面,但对于Windows系统的运行过程有了较为清晰和完整的理解。在解析一些实例时,也常常会触及到Windows的源代码,因而弄清楚了 Windows系统的一些实现细节。

写一本介绍Windows内核原理的书

2008年5月,我注意到,尽管WRK已经发布快两年了,并且高校关系部门组织国内高校的一些老师设计了多个课程实验,但很多老师和学生反映通过WRK来学习Windows仍然很困难,最主要的原因是缺少导读性质的资料。WRK提供的讲义并不能有效地指导阅读内核源代码。我有在研究项目上积累的经验,知道Windows的内核源代码其实可读性非常好,只不过,Windows内核中各种机制本身较为复杂,从而容易在阅读过程中迷失方向。而且,Windows操作系统中不可避免地涉及到大量异步机制,导致许多单个功能的实现代码分布在多个地方,显得不是那么一目了然。

在2006~2007年间,我参与了国内操作系统老师设计WRK实验的全过程,深切地知道老师和学生们在使用WRK时碰到的诸多困难,也一直希望有人能基于WRK来写一些指导书。到2008年5月份,我卸下了清华大学理论计算中心的一门课程,便打算自己动手写这样一本指导学习WRK的书。经过简单策划以及跟出版社协商,很快便定下书名和内容要点:Windows内核原理与实现;基于WRK来系统化地阐释Windows内核中的核心机制,同时兼顾系统的完整性。

随后便是一年多的奋笔疾书,几乎每个夜晚都沉浸在Windows的内核机制中。在我的电脑上,总是打开着以下程序:Word(写正文)、Source Insight(检查和阅读源代码)、Virtual PC(虚拟机环境,我常常运行Windows Server 2003和Windows XP)、WinDbg(内核调试器)、Cmd(命令窗口)、Notepad(记事本)等。原定计划是,花1年时间完成一本500页左右的书,期望能在2009年秋季上市。实际上,花了1年半时间完成了将近700页的篇幅,从内容广度和深度上,基本上达到了预期的目标。

写作的过程也是学习的过程,期间克服了大量的技术障碍,常常为Windows内核中的精妙机制深深地吸引。Windows好比是众多能工巧匠协同努力、不断改进而完成的骇世之作,我有幸能解剖这一伟大作品,还有什么比这更值得投入去做的呢。这种信念一直支撑着我,丝毫不敢懈怠,直至完成所有预定要写的内容。

我尽可能从与读者同等的角度来叙述Windows内核中的机制。虽然我能够访问Windows完整的源代码,包括Windows子系统以及Windows系统dll等模块的代码,但我仍然尽量从WRK中获取知识,只有不得已才参考Windows的产品代码。偶尔,为了验证一些说法,我也会看一看逆向工程得到的代码。我秉持的一个原则是,凡是在书中讲到的内容,微软之外的任何一个人,只要有耐心,不管使用什么样的方法,同样可以获得这些知识。这本书的目标是,让读者可以快速地理解Windows内核如何实现操作系统的核心组成部分。有些内容虽然是第一次描述成文,但实际上任何人透过WRK的源代码都可以获得这些知识。

新书发布

在4月16日的WinCore 2010会议(Workshop)上,主持人John Warren为《Windows内核原理与实现》这本书留了10分钟时间,举行了一个小小的发布仪式。尽管有2/3左右的听众看不懂中文,但因为有Dave Probert、Arkady Retik和Lolan Song等专家和领导的支持与捧场,现场颇为热烈。我有些紧张,原计划在台上当面向微软的同事们表示感谢,一紧张就忘了,下来后就不好意思再上去,好在书中的致谢部分已经书面表达了谢意。

下面的照片是WinCore 2010现场,主持人在问我几个关于这本书的问题。

由于电子工业出版社的大力支持,这本书赶在2010年五一前夕上市了。我在第一时间拿到了样书,并且从互动网购买了一批(30本)以赠送亲朋好友。

最后,我想表达自己的一点感受:很幸运有机会写这样一本书,让Windows内核彻底不再神秘。总结起来,我得到了天时、地利、人和三方面的关照:

天时 —— WRK的发布;

地利 —— 在微软工作;

人和 —— 得到产品部门和高校关系部门的鼎力支持。

-------------------------------------------------------------------------------------------------

作者介绍:

潘爱民,微软亚洲研究院研究员。长期从事软件和系统技术的研究和开发工作,撰写了大量软件技术文章,并著译了多部经典计算机图书。在从事科研工作的同时,为北京大学和清华大学开设了多门计算机课程。潘爱民获得了数学学士学位和计算机科学博士学位,主要研究领域包括软件设计、信息安全、操作系统和Internet技术。

本文由 米花发表。转载请注明出处:https://www.mihua.net/list/0/1489.html

发表评论

您的昵称:

猜你喜欢

最近更新