自从 2007 年 10 月 Windows 7 的第一条新闻发布以来,我们就一直听说这个操作系统有个叫 MinWin 的新组件,一个听起来像轻型系统内核的东西。现在,Windows 7 已经出现在了许多愿意买账的客户的计算机上;而在它的内部——以及 Windows Server 2008 R2 的内部,就是传说中的 MinWin 内核架构……但是很少有人知道它究竟是什么。
前几个星期,微软的技术工程师 Mark Russinovich——绝对是 Windows 性能和架构方面的世界级权威(“内核神童”——译者注)——在洛杉矶的 PDC 2009 会议上花了一些时间向开发者们解释了 MinWin 到底是什么。简单的说,它就是把那些 Windows 该有的架构层全部加上了——谁让 1980 年的时候,Windows 的架构师们没有高瞻远瞩地看到大家在 30 年后是怎么使用 Windows 的呢。它让现在和以后的微软开发者们可以改进系统的架构,而不必重写核心服务,也不必担心会破坏上层 API 和核心服务之间的依存关系。
“如果你回头看这些年 Windows 的进化,你会发现这是一种非常有机的进化,因为进化的过程中加了无数的新功能和新组件,却完全忽视了系统架构和层次,”Russinovich 解释道。“这就是为什么我们经常被迫要搞那些临时的解决方案,”“当我们想搞那些简化版本的 Windows,比如服务器核心,或者嵌入版 Windows,或者 Windows PE 预安装环境的时候,我们得把 Windows 拿出来拆成一块一块的。但关键问题是,这一块有时候依赖于那一块,而我们又搞不清楚这些依赖关系。”
可能“视窗”这个名字对于描述系统内核该是啥样来说不大合适。Windows Server 2008 服务器核心取得的突破性进展,是它最大限度地减少了运行的系统服务的数量,减少到系统刚好能运行并对外提供网络服务的程度。但即使是这些服务,也还是有一堆依赖关系,比如提供图形界面的动态链接库,即使这些服务根本用不到这个功能。所以你也可以想到,在这个服务器核心之上还可以进行突破,打造一个完全最小化的内核,加上模块化的组件来实现其它功能,完全不需要搞什么跟图形,鼠标,声音之类相关的动态链接库。
操作系统的功能是由 API 来实现的。自从 Windows 3.1 以来,这些由各种动态链接库组成的集合被称为 Win32。在 Win32 里面,“苦力分界线”一直是纵向的,不是横向的。横向分界可以将处理用户输入的内核函数和图形显示函数分开。虽然现在 Windows 架构已经改进到整个图形部分对于主流程序来说可以基本废弃不用的程度了,但 GDI32.DLL 还是被假定存在的。
微软的工程师们要想实现横向分层,他们必须要把 API 函数设计成像原来那样工作,即使原来的分界已经不存在了。这就是我们要谈到的最关键的一个词——“虚拟”。在新的 MinWin 架构下,只有 KERNELBASE.DLL 里一小撮别有用心的内核函数负责处理系统的基本服务。其它不明真相的 API 调用被直接转发,就像互联网域名系统里无法解析的地址一样,被转发到系统核心外的其它动态链接库。
但是和80年代就有的那种将 API “解析”到相同的一系列动态链接库的方式不同,在新的 MinWin 架构下,一切都不一样了。在揭示了 25 年前的构成效率理念和现在的完全不同之后,Russinovich 道出了一个惊人的细节:在以前版本的 Windows 里,一些没有任何逻辑关系的 API 被胡乱绑在一起,纯粹是为了缩短启动时间。越是大的 API 集合,就越和文件名没有任何关系。
“我们不想再那么搞了,我们想让磁盘上的文件和真正的 API 没有任何关系,这样我们就可以动态地构造它们。” Russinovich 说。“换句话说,我们想让大家调用那些虚拟的动态链接库,然后系统会将虚拟的动态链接库映射到真正实现这些功能的逻辑动态链接库。”“所以对于一个程序员来说,一个虚拟动态链接库的功能是由哪个逻辑动态链接库来实现的都是无所谓的,到底怎么构成实现这些功能的最佳组合是由我们来决定的。”