
前几个星期,微软的技术工程师 Mark Russinovich——绝对是 Windows 性能和架构方面的世界级权威(“内核神童”——译者注)——在洛杉矶的 PDC 2009 会议上花了一些时间向开发者们解释了 MinWin 到底是什么。简单的说,它就是把那些 Windows 该有的架构层全部加上了——谁让 1980 年的时候,Windows 的架构师们没有高瞻远瞩地看到大家在 30 年后是怎么使用 Windows 的呢。它让现在和以后的微软开发者们可以改进系统的架构,而不必重写核心服务,也不必担心会破坏上层 API 和核心服务之间的依存关系。
“如果你回头看这些年 Windows 的进化,你会发现这是一种非常有机的进化,因为进化的过程中加了无数的新功能和新组件,却完全忽视了系统架构和层次,”Russinovich 解释道。“这就是为什么我们经常被迫要搞那些临时的解决方案,”“当我们想搞那些简化版本的 Windows,比如服务器核心,或者嵌入版 Windows,或者 Windows PE 预安装环境的时候,我们得把 Windows 拿出来拆成一块一块的。但关键问题是,这一块有时候依赖于那一块,而我们又搞不清楚这些依赖关系。”

可能“视窗”这个名字对于描述系统内核该是啥样来说不大合适。Windows Server 2008 服务器核心取得的突破性进展,是它最大限度地减少了运行的系统服务的数量,减少到系统刚好能运行并对外提供网络服务的程度。但即使是这些服务,也还是有一堆依赖关系,比如提供图形界面的动态链接库,即使这些服务根本用不到这个功能。所以你也可以想到,在这个服务器核心之上还可以进行突破,打造一个完全最小化的内核,加上模块化的组件来实现其它功能,完全不需要搞什么跟图形,鼠标,声音之类相关的动态链接库。
MinWin 就是朝着这个方向迈出的重要一步。“我们想搞得更严密一点,”Russinovich 说,“因为每次我们想改进一下 Windows,就会把新版本搞得完全不能用。我们想找个我们能搞得懂的服务器核心,就是除了自己以外什么都不需要的那种,然后我们就可以在这个基础上改进。这样我们就可以单独改进,而不用担心把服务器核心搞坏了,或者每一版都要重新定义。”
Windows 7 上最基本的 MinWin 大约有 161 个文件,总共大概 28 兆。我估计你马上就打算买个最便宜的优盘把它装着到处晃,但我提醒你一下,MinWin连命令提示符都没有。它只运行内核,基础的系统服务,以及 TCP/IP 栈,没别的了。
操作系统的功能是由 API 来实现的。自从 Windows 3.1 以来,这些由各种动态链接库组成的集合被称为 Win32。在 Win32 里面,“苦力分界线”一直是纵向的,不是横向的。横向分界可以将处理用户输入的内核函数和图形显示函数分开。虽然现在 Windows 架构已经改进到整个图形部分对于主流程序来说可以基本废弃不用的程度了,但 GDI32.DLL 还是被假定存在的。
微软的工程师们要想实现横向分层,他们必须要把 API 函数设计成像原来那样工作,即使原来的分界已经不存在了。这就是我们要谈到的最关键的一个词——“虚拟”。在新的 MinWin 架构下,只有 KERNELBASE.DLL 里一小撮别有用心的内核函数负责处理系统的基本服务。其它不明真相的 API 调用被直接转发,就像互联网域名系统里无法解析的地址一样,被转发到系统核心外的其它动态链接库。
但是和 80 年代就有的那种将 API “解析”到相同的一系列动态链接库的方式不同,在新的 MinWin 架构下,一切都不一样了。在揭示了 25 年前的构成效率理念和现在的完全不同之后,Russinovich 道出了一个惊人的细节:在以前版本的 Windows 里,一些没有任何逻辑关系的 API 被胡乱绑在一起,纯粹是为了缩短启动时间。越是大的 API 集合,就越和文件名没有任何关系。

“我们不想再那么搞了,我们想让磁盘上的文件和真正的 API 没有任何关系,这样我们就可以动态地构造它们。” Russinovich 说。“换句话说,我们想让大家调用那些虚拟的动态链接库,然后系统会将虚拟的动态链接库映射到真正实现这些功能的逻辑动态链接库。”“所以对于一个程序员来说,一个虚拟动态链接库的功能是由哪个逻辑动态链接库来实现的都是无所谓的,到底怎么构成实现这些功能的最佳组合是由我们来决定的。”
这样做确实是会牺牲一些性能的,比如会在依赖关系中出现一些“人工制品”,比如 Russinovich 自己编写的 Dependency Walker 就可以跟踪到。另外,进程必须要建立一个虚拟动态链接库到逻辑动态链接库的映射表。而且虚拟动态链接库的文件必须要真实存在,哪怕文件里面全是空指令。
但利大于弊,比如 API 调用更快了,因为定位操作都是虚拟、动态的。而且微软自家的开发者们,在被 Russinovich 称作三年的“抑扬顿挫”的新产品研发周期中,又有更多的时间来研究除了新系统架构、新硬件以外的东西了。

MinWin 可能带来的意外惊喜之一可能是更好用的服务器核心。就像 Russinovich 演示的那样,直到 Vista 系统为止,命令提示符还在依赖一个(无关紧要的)高层进程,CSRSS。这个高层进程又与图形函数相关联。全新的 MinWin 架构使每个进程都能访问一个和系统核心更接近的子系统,名为 CONHOST,这样就不用去折腾那些根本不会用到的动态链接库。下一代 Windows (“Server 2011?”)会用以 MinWin 为基础的横向分层架构代替目前的服务器核心。
Windows 桌面版本的另一个可能的巨大变化——Russinovich 没有提到,但反正大家都可以预见——就是使用以 MinWin 为基础的功能层来管理硬件和运行系统服务,外加一个也是基于MinWin 的虚拟层来运行程序和提供用户环境。这种设计估计比目前的系统要安全无数倍。
FlowerCode@cnBeta 译自 betanews<