操作系统是一种基础设施,在信息化的世界里,它就像电力和自来水一样。现在有不少呼声,我们要开发自己的操作系统。然而每次真正有适合 PC 端的操作系统开发出来,立刻会被网上一大批人一边倒地鄙视:“抄袭”、“拿 Linux 改个名就说是自己的”、“骗科研经费”等等说法不绝于耳。其实并非这些人真的体验过新的操作系统,也不是他们真的了解这些开发过程的容易或艰辛。而是每个人心里都很清楚,无论新的操作系统做得有多好,它都不会像 Windows 这样在千万个用户的电脑上流行起来。所以他们的鄙视之言永远都不会得到事实的反驳,他们可以放心大胆地在网络言论上通过“喷”来轻松地显示自己的睿智和存在感。
在漫长的时间里,我们已经习惯了使用 Windows 上的软件。就算现在有一款更好的操作系统,但它无法运行我需要的软件,我也会毫不犹豫地拒绝它。假设这款操作系统能完美地兼容 Windows 的软件,又会面临另一个问题:既然开发者都知道只需要给 Windows 开发软件,就能兼容另一个操作系统,那么开发者就永远只会给 Windows 开发软件了。本来因为软件数量不足而兼容 Windows 软件,然后又因此而导致软件数量更少了。这成为一个恶性循环!Windows 只要略微升级,改变特性,这款新的操作系统也得随之升级,否则新版的软件又无法支持。命运完全悬于人手。
所以操作系统能形成垄断,并非因为技术有多高明。说什么 Windows 有几千万行代码所以永远也不能超过那完全是扯淡。难道说越臃肿的东西就越是强大?Windows 的几千万行代码的规模反而有可能是历史的不断积累,垃圾代码无法清除(为了兼容旧版软件和扯不清的部门利益)而导致的。从头开发一个新的操作系统反而轻松很多。问题是操作系统天然属于占坑型的软件。一旦占住了这个坑,除非占坑者主动放弃,否则垄断很难被攻破。这不是一个技术问题。PC 上的 Windows 如此,移动平台上的 Android 与 iOS 也如此。
认识陈树宝先生到现在大概也有 5 年时间了,他是个技术深厚、勤奋踏实的开发牛人,
常常承担项目主要的开发职责。刚接触他时就知道他在研究 Windows 内核方面下了很大的工夫,从系统启动阶段到系统各种管理机制都有研究,例如内存管理、对象管理、进程管理、I/O 系统、文件系统等,我甚是佩服他在这方面的功底造诣。由于自己对 Windows 内核了解不多,遇到这方面的疑问,偶尔也会请教于他,总能得到一些收获。
相比于历来都是扎堆热门的 Linux 内核研究,以及雨后春?般蓬勃发展起来的 Andriod系统类研究书籍,国内对 Windows 内核进行系统地全面深入研究的书籍实在太少了。据我浅薄的见闻所知,大概也只有毛德操先生和潘爱民先生的著作属于这类书籍,当然还有翻译自国外经典
《Windows Internals》(中文版为《深入解析 Windows 操作系统》)一书。实际上,国内研究 Windows 内核的人非常多,但常常限于坊间研究,能愿意公布出来分享的不多。或者是限于本职工作范围内所使用到的,或者是一些零零散散的资料。
当我知道陈树宝先生打算写《Windows 内核设计思想》一书,我感到非常高兴。一来能将他这几年积累的知识呈现出来,我觉得这对国内想进入或者想了解这个领域的读者来说是幸运的,至少可以少走一些他以前走过的弯路;二来通过书籍能够实现自己一定的价值,并且为这个领域贡献出一份力量。我们都知道,沉醉于研究对于那些务实的技术人来说是孤独的,需要有毅力恒心。而花费时间将自己的研究心血分享出来更是难得的。在起笔此书时,我也曾经问过陈树宝先生打算写哪方面的内容,也有一些疑虑,毕竟要写好这类“大气”的书是不容易的,不仅涉及知识面广,而且也需要这方面能力的自信。所幸的是,由于知识的积累,陈树宝先生轻车熟路,手到擒来,竟似不费功夫,让我消除了这个疑虑。我很高兴为陈树宝先生的《Windows 内核设计思想》一书作序推荐。我了解到的信息,也正如陈树宝先生在《Windows 内核设计思想》一书前言所说的,这本书是以介绍源码(这个源码有不少是自己整理和修改过并经过验证的),结合相应的调试来展现出 Windows 内核的设计思路,通过调试代码能让读者更好地理解整个内核框架。我细看了此书的目录,第 1 章介绍了搭建开发和调试环境,第 2 章主要介绍 OS 的引导阶段,而第 3 章更是直捣黄龙,进一步深入地介绍 Windows 的调试机制,可见调试在这本书里是非常重要的。作者非常注重实践,毫无保留地呈现核心的内容。在第 6 章开始介绍了热门的,也是必不可少的内存管理机制。我们知道,内存管理对一个 OS 来说太重要了,Windows 设计了一套特别的内存管理手段,这部分必然是非常值得一看的。第 7 章的对象管理更是 Windows 独特的地方,对象管理充斥于 Windows 的每个地方,这个机制非常重要。I/O 系统、文件系统、进程管理在本书中都能看到。总而言之,这是一本非常棒的好书。
序言
与 Linux 作为一套自由开发的类 UNIX 操作系统不同,Windows 内核代码长期以来为微软所控制,始终保持云遮雾罩的神秘感。尽管在 2006 年微软针对教学和科研的目的,开放了 Windows 内核的部分源码 WRK(Windows Research Kernel),但是由于知识产权的问题,并不能摆在台面上来讲,有关这方面的原因,在毛德操老师所著的《Windows 内核情景分析——采用开源代码 ReactOS》中讲过。为此,笔者在本书中为求系统架构、程序流程设计的完整性,同时保证代码的高质量,经历了数次重构,其中第一次设计使用的就是 WRK代码,因为这是最正统的 Windows 代码,只是代码不能大幅度引用,造成了完整性的缺失,而本书要求能完整编译的开源代码,如果不这样,会影响读者的理解,于是放弃。笔者随后想到了 ReactOS 开源项目,但是 ReactOS 源码偏多,于是在第二次设计中使用的是 WRK 和ReactOS 代码的结合,即使用 ReactOS 代码去填充 WRK 的不完整部分,这种方法虽然保证了代码的完整性,但是由于代码的风格和设计不同,使得代码整体变得杂乱,因此这种方案也不可取。最终笔者抛弃了 WRK,采用完整的 ReactOS 代码(经过部分修改),虽然与正统的 WRK 代码不同,但是原理是一样的,而且表达很简洁,完全保留了 Windows 内核设计的中心思想,更有利于读者的学习。为了照顾部分读者学习 WRK,笔者在 MBR 处提供了切换回 WRK 的系统编译选项,有关 WRK 的更多知识,请参考潘爱民老师所著《Windows内核原理与实现》。
无论使用的是什么样的代码方式,本书都保证了理论上的正确性,大多数的理论都经过了笔者的调试验证,而笔者也将在本书中向读者一步步展示自己对这些理论的理解和验证过程,集理论、架构、编码、运行和调试于一体进行讲解,多角度全方位体现一个操作系统内核的完整设计过程。
Windows 内核的源码是相当多的,单就一本书是不可能完全讲解完的,笔者也自认为还没有足够的能力去全部讲解。但重要的不是量多,而是质量上乘,精炼,笔者本着确保读者能在 Windows 内核设计上形成一条清晰主线的目的,精选了内核设计上最重要的代码片段供读者学习。笔者认为,只要读者认真理解了这些代码片段,想要再深入学习别的部分就基本不成问题了,无论你是做 Win32 应用程序编程的,还是做内核驱动编程的,都已经有足够的思路去设计你的代码,写自己的东西,而且一旦出现问题,也有足够的能力去找到解决问题的方法。
在本书代码的设计中,笔者本人也按照 Windows 内核原理写过不少代码,但最终还是决定不收纳在本书中。原因是本书的用意是讲解 Windows 设计的核心原理,应该力求让读者掌握 Windows 设计最本质的东西,而不被其他繁杂的细节所影响。当读者认真读完这本书之后,相信也会有像笔者一样的冲动,想要根据自己的想法在功能不变的基础上去设计自己的代码片段,自由构架操作系统。