最近讨论Windows CE 6.0的人开始多起来了,但是Windows CE 6最早也要07年才开始发售。微软在MEDC 2006会议上上发布CE6的消息,我命衰,本来打算去参加MEDC,结果被美帝国主义拒签了,所以没能第一时间掌握这些消息。当不成御林军,只好当民间侠士了。回忆回忆以前从各个渠道得到的一些资料(MS对合作伙伴的讲座,MS邀请到US去进行合作伙伴测试的工程师,道听途说,等等)。大概总结了一下有下面几点,还有一些是我自己的乱弹琴评论,说得不好不对不怕拍板砖,因为本来我就没有得到过官方资料,要怪就怪美帝国主义那个拒我签证的大光头,所以还得把这段圆滑的“AS IS”文字放上,把MS替换成我就好了:

废话少说,正文开始:

  1. 取消系统中最多32个进程,每个进程32MB虚拟内存的限制,据说现在可以支持32767个进程,而且每个进程有2G的用户可用空间。

这个可以说是Windows CE 6.0最具有爆炸性的改动了。以前在想别人介绍Windows CE操作系统的时候,总是说Windows CE是一个微内核的操作系统,很多操作系统特性都被放在用户态的exe里面实现,并且其驱动程序也是放在用户态的,等等等等云云云云,这与桌面Windows这种把所有东西都放在OS内核中的宏内核的体系结构操作系统完全不同。可是,现在呢……(本来想画一张图,但是实在是知道的有限,怕画出来贻笑大方,还是等拿到Beta光盘,研究了之后再画,再次痛恨拒我签证美帝国主义阿。)

最早去年冬天听到这个消息的时候,的确产生的震动比较大,因为这意味着Windows CE在发展了十年之后,丢弃了十年前设计的内核,拥有了一个新的Kernel。这个新的Kernel乍一眼看上去,跟桌面的Windows非常像。唯一的一点不同可能是桌面的Windows只能跑在X86上,但是Windows CE可以跑在ARM、X86、MIPS和SH处理器上,好像显得Windows CE比Windows还要强大了。我在想,有没有可能以后微软的桌面Windows也用Windows CE的X86版本来代替,只要把Office、Avalon、Indego什么的技术都移植到Windows CE上,YY而已,哈哈哈。

后来又考虑了一下,这样改也不是没有道理的。原因有两方面:

第一,应用的驱使。可能在10年前32个进程每个进程32MB虚拟内存已经对所有的嵌入式应用都足够了。但是今天,看看Smartphone 2003吧,开机系统默认的进程就已经有20个了!用户能用的只剩下10个左右。再说说32MB虚拟地址空间的事。每个进程只有32MB的虚拟地址空间今天看起来更是莫名其妙。现在的多媒体应用,一次性分配32MB内存都是家常便饭,而且现在的很多手机和PDA都装备了128MB的虚拟内存,所以现在很多Windows CE上的应用程序都面临着物理内存还有不少,但是虚拟内存已经耗尽的尴尬局面。我就曾经在项目中遇到过解开一个超大的JPEG图片(上海交通图),结果内存不足的惨状。后来只能用共享内存这种方法悲惨的解决。

第二,这个是听我老板说的,他当年在西雅图总部工作,据说参加过Windows CE 1.0的论证,当时为什么把Windows CE的调度系统设计成这个样子呢?据说是因为当时的X86系统进行进程间切换的时候地址空间切换太慢了,所以就有人提出来使用Windows CE这种平坦地址空间,就省了地址空间切换了。所以呢,就有人写了个小Kernel,拿去找Bill Gates炫耀,那个小Kernel就发展成了现在的Windows CE。现在,据说X86硬件已经解决了那种问题,所以现在这种Kernel的存在性也就不必要了。

  1. 一些驱动程序都移到了Kernel里面,另外一些在用户态的驱动放在一个叫UDevice.exe的进程加载。

以前的Windows CE里面,所有的驱动都是User Mode的驱动,我一直觉得学习写驱动程序,Windows CE是一个不错的平台。因为第一其体系结构简单第二其开发调试方便。现在呢,据说图形系统跟文件系统进了Kernel。所以图形驱动,文件系统驱动等等都进了Kernel。剩下一个UDevice.exe加载一些用户态驱动,但是大多数都是些总线扩展驱动,例如USB Class的驱动与SDIO的驱动。

这个为什么要这么改呢?我觉得这个恐怕也是不得已而为之。因为内核虚拟内存体系结构变化的缘故。如果再像以前一样把所有的东西都放在用户态,可行肯定是可行,但是效率问题是没法保证的。想想,调用一个文件系统API要经过多少次进程间切换与数据的Marshal:Hello.exe(调API) -> NK.exe(API转接) -> FileSys.exe(API的实现) -> Device.exe(外存设备驱动)。你别嫌烦,这才一半,调用完了还得原路返回去。为什么以前没问题,以前是平坦地址空间,切换都是假的逗你玩的。如果按照Windows CE 6的新内核,再这样一圈下来,那个效率问题可不得了了。不要以为我说效率问题是臆测,我还真见过这种架构的OS,大概写一个8MB的文件要8秒钟,实实在在的评测数据,不是臆测。微软当然不是傻子了,所以老老实实把该进Kernel的进Kernel,这样就省了很多次Marshal了,速度就快了。

  1. OAL成了一个单独的进程,叫OAL.exe,跑在了NK之外。

估计这一条对OEM商最重要。毕竟让CE在板子上跑起来,OAL是最重要的一部分。以前我们都知道,CE的微内核就是一个NK.exe,是由NK.lib和OAL.lib链接成的。现在Kernel的独立进程没了,成了所有进程的上2GB。那独立出来的OAL,就成了一个单独的进程。据说新的Kernel部分还不只这些,包括了:OAL.exe、kernel.dll、kitl.dll、kcoredll.dll、device.dll等很多部分。

唉,这块我道听途说的实在有限,这么多DLL的功能也只能望文生义,连评论都没法给了。抱歉抱歉,以后一定补上。

  1. IDE的改动,Platform Builder没了,新的Visual Studio 2005 IDE接任。

这块是早就看出苗头来的了。Windows CE 4之前还把Platform Builder真当回事,Windows CE 5里面Platform Builder就是命令行工具的一个小Wrapper了,既然都是简单的Wrapper了,那还要它干吗,干脆Wrapper也别Wrapper了,直接作为Visual Studio的一个Plug-in就得了。微软的Visual Studio IDE从.NET开始做的就非常有灵活性了,我记得还有一本书叫Visual Studio程序设计,不是讲怎么用Visual Studio写程序,而是讲怎么对Visual Studio编程,国内有些人把GBA游戏机开发工具都写成了Visual Studio的Plug-in了,让微软那帮人来写,更是小菜一碟了。

这个道听途说居然在今天下午被证实了。上了一个中国台湾省的网站,看到了下面几章图片。

我们不能想象这是亲爱的台湾同胞用Photoshop改出来的。所以肯定是真的了。可以看到似乎Catalog变成了勾选了。唉,EVC在5.0时代被Visual Studio吃了,连PB在6.0时代也贞操不保了。不知道Windows XP Embedded的那个IDE再不远的将来会不会也变Visual Studio的插件阿,阿门。

看来以后只要是微软的Developer,不管是嵌入式还是企业开发还是桌面开发,也不管你是开发应用还是开发内核,一个Visual Studio就够了。