2012年12月

Goodbye 2012

Tags: 总结

地点:公司,办公室

时间:下午三点左右

阳光依旧,却不抵风寒。午饭后想起,今天要写点什么,所以决定先打盘魔兽酝酿一番。2012快要度过了,应该给自己一份答卷,至于分数什么的,已经不重要了。2012经历了很多事,不论好坏,它们都将留下些痕迹,最终被灰尘覆盖。

工作

3月份,从原来公司离开。离开前与公司同事和BOSS的谈话,也很有收获,所以我也一直强调,离开并不是钱的问题。选择这家公司,是因为我需要一个过程。一个允许犯错误,并且能看到错误被如何修正的过程。来到新公司后,就开始接手做项目。九个月的时间里,从项目的最初认识到现在的技术攻克,学习到了很多东西。从软件上层到底层,从软件到硬件,一个合格的程序员,应该明白原理的每一个细节。

生活

年后回到西安上班,当时打了两个月的酱油,思考了很多问题。当决定要离开公司后,三月份就坦然了许多,其间第一次去看电影(来西安后)。后来决定做一些改变,后半年中偶尔去看电影,逛街。这个月,还买了一把吉他,希望明年能弹奏成曲。

从9月份开始,每天晚上睡前会做俯卧撑的锻炼,数目没有定太死,最多50个。现在,做50个已经没有太大问题。

6月份,由于电脑被盗,所以再次搬家到公司附近,一个人住也比较舒服。也因为搬得比较远,就不再去省图借书,也不怎么出去逛了,购物都是在网上搞定。买了图书10本(其中5本是赠送朋友或代购),以前朋友过生日,都是联络一下。今年想给朋友们送点小礼物,希望帮助大于本身价值。 看过的电影:《Battleship》,《BRAVE》,《Pi of Life》

爱情

今年罢考

总体上来说,收获很多,希望继续保持。当然,有些地方还是需要努力,比如坚持力,执行力,判断决策等。生活上多做些尝试,毕竟不同的体验,才能更好的做判断。

It's a day, and a special day.See you then, my friends!

芯片如何产生不同的时钟

Tags: 芯片

当初学2440开发板的时候,对时钟的认识不足。导致后来写裸机程序时,各种器件的时钟问题,出现很大的问题。那时@7hao也问过相同的问题,终究还是搁置了。最近调coldfire的板子,对时钟有些新的认识,顺便把这个问题解决下。

现在芯片工艺越来越高,使得芯片上的功能越来越丰富,支持的外围接口也越来越多。不同的接口,工作频率是不相同的。所以一个电路板中,对不同外围接口或电路模块,要提供不同时钟。当然,提高接口的工作频率会使器件工作更“快”,但“稳定性”才是最主要的。就像,CPU超频一样,频率越高,效率越高,但负作用就是功耗和稳定性的损失。

现在有个问题,芯片要正常工作,也需要一个时钟。所以,电路板上常有一个振荡器,一般会选用石英振荡器,因为输出的频率比较稳定。这样上电后,芯片就进入工作状态了,但其他的接口或模块还没有工作。这时候,芯片会做一件事,分频或倍频。完成这个操作的是PLL(Phase Locked Loop,锁相环)元件,这个是集成在芯片中的。这个元件本身是用来同步相位的,简单来看,就是“复制”振荡器的频率,后续的分频或倍频的操作都是在PLL的频率上进行。又因为,石英振荡器提供的频率一般不太大(我还没有见过板载100Mhz的振荡器),所以倍频是提高芯片工作能力的主要方法。

现在芯片通过PLL也有了“自己”的时钟,芯片的设计者在最初也考虑到这个问题,就规划了一个clock chart。把频率相近的接口或模块的时钟线放在一起,提供一个统一的时钟。这样,分频就不会太过于凌乱,而是呈现一定的比率。

这样看来,外部振荡器好像只工作了一会,其实不然。PLL可以复制时钟,但芯片会受到电磁的干扰,所以石英振荡器的稳定性就有很大的优势了。

参考文献:
PLL的原理,怎样用它倍频

Mac OS X的内核——从32位到64位

Tags: mac

本文转载自Weiphone论坛,作者fantacyleo(weiphone's id)。遵循CC版权协议。原文链接

自从标配4G内存的笔记本面市以来,我就非常关心预装操作系统是32位还是64位的,因为虽然理论上32位Win可以用到4G内存,但由于一部分内存要给系统和其他硬件设备预留,用户可见的内存并没有4G,大概只有2-3.5G的样子,而64位的windows可以用到3.8G以上(还有一部分应该是集显占用了)。不过后来我了解到,在目前windows的生态环境下,为了大内存而选择64位系统可能并不明智,因为大量为Win开发的软件都还停留在32位模式阶段,虽然64位win为32位应用程序建立了一个从文件系统到运行时环境的完全、彻底、独立的32位模式以达到兼容的目的,但这是以牺牲性能为代价的,并且不能彻底解决问题。从文件系统来说,64位win有两个Program Files文件夹,一个不带后缀,就像我们在32位win上看到的一模一样,用来存放原生的64位APP;另一个带x86后缀,用来存放32位APP。这个倒还好,根据后缀一目了然,诡异的是在C:\Windows文件夹下的三个system文件夹,一个不带任何后缀(C:\Windows\System)是用来兼容更古老的16位APP,这没问题。第二个是存放64位APP的运行时支持文件,可文件夹却被命名为C:\Windows\System32,第三个是存放32位APP的运行时支持文件,文件夹竟然名为C:\Windows\SysWoW64。在为32位软件搭建的虚拟运行环境中,包括了虚拟的CPU(执行32位指令集)、虚拟注册表、虚拟文件系统、虚拟内存空间,32位软件完全不会知道自己是在一台64位架构的电脑上运行(大家在PD模拟器里跑的Win一样不知道自己外面还有个Mac OS!),如果它调用Win的API来获得系统信息,则会被告知电脑的一切都是32位的。32位软件和外部64位环境的一切联系都要先通过这个虚拟环境来中转(参见这个简短的英文说明http://blogs.msdn.com/b/oldnewthing/archive/2008/12/22/9244582.aspx,或这个来自MSDN的更详细的中文说明http://technet.microsoft.com/zh-tw/library/dd180732),从而造成运行效率的损失。在遍地是32位APP的当下,选择64位Win并不能让我们充分享受64位的好处。

理论上来说,64位架构的电脑要比32位架构的电脑速度更快。这里我不扯很多技术问题,就拿乔帮主当年的一个演示视频来说明(好消息,这个视频youku上就有,不用翻GFW了)。在这个视频里,帮主分别用32位模式和64位模式载入一幅美国国会图书馆的照片。这张照片有4G之大,3200032000约10亿像素。接下来,帮主开始调整两张照片的亮度,于是CPU就要开始从内存读照片信息,调整亮度后再返回给内存。64位模式可以访问最多161000000TB的内存,轻而易举就可以把4G大小的照片全部读入内存,因此调整亮度过程中发生的只有CPU和内存间的数据交换,CPU的占用率基本保持恒定。而32位模式理论上最多访问4G内存,实际还达不到,只能将图片信息分次从硬盘读入内存,因此调整亮度过程中还要发生硬盘和内存的数据交换,此时CPU就处于闲置状态,而当CPU和内存交换数据时,CPU又开始忙碌,这导致CPU占用率持续波动,且渲染速度慢于64位模式。

要充分利用64位技术的优势,我们必须有64位的CPU、64位的操作系统和原生的64位APP(当然,还要有大于4G的内存,但在这里内存是个很被动的部分,它本身不知道什么32位、64位的,只是等着别的硬件来使用它。所以我就不提它了),缺一不可。尽管IBM在1961年就造出了能处理64位二进制指令的电脑,但那只是用于超级电脑领域的“王谢堂前燕”,离个人电脑的“寻常百姓家”还有很长的路要飞。在这条路上,Intel错失先机,他们忙着与HP合作搞64位的服务器CPU,这个名为Itanium的CPU系列与Intel在PC上的x86CPU不兼容,结果AMD抢先推出与x86架构兼容的x86-64,后改称AMD64(http://tech.sina.com.cn/h/2007-12-05/10581893688.shtml)。由于Wintel联盟的存在,Intel不出PC用的64位CPU,广大Wintel用户就只能干等。结果又被IBM-APPLE抢先发布世界上第一台64位个人电脑——PowerMac G5。到了2004年,Intel开始在其Prescott系列CPU上使用x86-64技术(其实就是照抄AMD的),并在酷睿系列发布后改名为Intel64,我们现在用的Intel CPU也都是基于它的(http://tech.sina.com.cn/h/2007-12-05/10581893691.shtml)。这里顺带一提,x86-64是一个向下兼容16位和32位APP的技术,并非真正的64位架构,这个兼容货的出现也是Wintel联盟独霸PC市场的必然结果,巨大的市场份额使得AMD和Intel不可能完全抛弃x86用户另起炉灶。而完全不兼容x86的Itanium是一个纯粹的64位架构,只是兼容性问题阻碍了它迈入PC的脚步。

这是2005年升级版的powermacg5机箱内部,可以搭载两个PowerPC G5处理器:

处理器64位化之后,操作系统和APP也要跟上。Win在这里犯了难,因为它的市场实在太庞大了,无数的PC厂商和软件开发者围绕在它身边,牵一发而动全身。微软做了两件事。一是搞32、64两种版本的windows,二是他们在64位Win中搞出了第一段中所描述的32位兼容模式。但这32位兼容模式也不是万能的,比如64位win中的IE就还是32位的,因为Win不允许一个应用程序中同时出现32位和64位的代码,为IE开发的一些插件仍然是32位的,没法和64位IE混合运行。还有驱动程序,必须和底层硬件直接打交道,也没法在32位兼容模式中运行。不过,一般的APP在32位兼容模式下是没有什么大问题的,有庞大的用户群拖着,又这么个32位兼容模式惯着,Win平台向64位的转变肯定是一个漫长的过程。而苹果的64位化之路较win来说就轻松多了。一是用户少,震动小;二是产品线单一,一人吃饱全家不饿。三是苹果采用了Universal Binary技术。第四章中我曾经提到过该技术,现在再来举例子详细说一下,这个例子参考了http://techsingular.net/?p=480

假设一个APP由一个可执行文件(二进制代码组成,受32or64位体系的影响)和一个纯文本格式的数据文件(平台无关,不受32or64位影响)构成。现在我们考虑将OS从32位迁移到64位。第一种办法就是在64位OS中弄一个模拟器跑32位程序,就像64位win那样。Mac OS X在向Intel平台迁移过程中也用过一个模拟器叫Rosetta(见第四章)。模拟器的优点就是程序完全不用改动,完全没有冗余代码,代价就是执行起来速度慢。第二种办法就是对32位和64位系统分别提供一套软件,每套软件都由两个文件组成(可执行文件+数据)。这种办法在APP执行上没有效率损失,但软件用户要根据自己的电脑配置买不同版本的软件,不够傻瓜,如果他们同时拥有两个平台的电脑,那么就要买2份软件,其中的数据文件部分完全相同,这就造成了重复。第三种办法是只针对不同平台制作不同的可执行文件,而共享同一份平台无关的数据文件。这种方式大大减少了冗余,但是要求APP的安装程序要智能,根据不同平台安装不同版本的可执行文件。对于用户来说,由于不同APP实现智能安装的方式不同,每装一个新软件都要再去熟悉这个软件的安装特点,而且在不同平台上装的软件版本仍然不同,无法互相copy,无法实现Mac OS经典的单文件APP。在Mac OS X中,大多数应用程序呈现在用户面前的都只有一个文件。如果你在APP上点右键,选择“显示包内容”就可以看到其复杂的内部结构,这种方式类似于计算机科学中的“抽象”,它的目的是对无关人员隐藏具体的实现细节。

单文件APP:

显示包内容:

第四种方式就是Universal Binary。它在任何平台上都只安装2个文件,即可执行文件+数据,但是在可执行文件中同时包含32位和64位的代码,操作系统根据需要调用不同代码。这种方式既方便开发者也方便用户。苹果从Xcode2.1开始提供编译成Universal Binary的功能,开发者可以参阅Universal Binary Programming Guidelines。当然,也不是所有程序用Xcode这么轻松编译一下就ok了。根据Universal Binary Programming Guidelines,如果一个程序利用的基本上是GUI层的功能,那么编译一下就差不多OK了。但如果程序大量利用了系统底层的功能,那么对不起,你的麻烦大了。比如Office for mac直到2008年才支持Universal Binary。用户就更轻松了,他们完全不用知道软件内部发生了什么变化,跟原来一样买、一样装、一样用就可以了。当然了,这种方式也有缺点,比如我用64位系统,但安装好的软件中依然包含32位代码,这对我来说是多余的。同样,一个32位系统的用户会发现安装好的软件中有他不需要的64位代码。

安抚了开发者和消费者,苹果就要全力完成操作系统的64位化了,和转向Intel平台相比,这一步苹果走得依然不痛苦,但却漫长,它花了苹果6年时间。

Mac OS X64位化的第一步就是刚才提到过的PowerMac G5,随同G5发售的Mac OS X Panther(10.3)内核开始支持64位运算,内核能够访问64位内存地址,但普通APP依然只能看到32位内存空间(参见:Mac OS X背后的故事 九(上))。

2005年发布的10.4 Tiger引入了64位指针,让每一个APP运行的进程都可以访问64位内存地址。同时,Tiger开启了第一个64位的编程支持,这就是Unix层的libSystem库的64位化,这个库包含了文件I/O、网络等基础功能,基本上可以让开发者编写64位的非GUI程序了。但是GUI编程仍然只能在32位下进行(http://arstechnica.com/apple/2005/04/macosx-10-4/4/)。当然,对于当时的大多数程序来说,64位化的需求并不迫切,谁会没事写个64位的通讯录程序呢,难道你认识全地球的人?但如果是Matlab、Maple这种科学计算程序,那就麻烦了,GUI界面是32位写的,为了计算的速度和精度又必须去和底层的64位库打交道。2005年也是苹果宣布转向Intel的年份(参见第四章),帮助开发者和用户平稳过渡的Universal Binary正式登场,并于2006年开始内置于运行在Intel CPU的Tiger中。Intel CPU的到来倒是给了Mac开发者投奔64位世界一个很好的理由。简单来说,64位Intel CPU不但能处理64位指令,而且其中能处理64位指令的元器件数量也比32位CPU多(用专业术语来说,64位Intel CPU的寄存器是64位的,而且寄存器数量也比32位 CPU多)。

2007年,姗姗来迟的10.5 Leopard将GUI APP带入了64位。同时,非GUI层的全部编程库也完成了64位迁移(Mac OS X背后的故事 九(上))。当然,对32位的支持仍然保留。随着GUI层的64位化,苹果也开始向另一个历史遗留问题开刀,那就是为了向下兼容Mac OS 9而建立的Carbon编程支持库。HIToolBox是Carbon中为C语言写的GUI库,2006年WWDC大会上,苹果指出HIToolBox将和Mac OS X原生的GUI库Cocoa整合http://origin.arstechnica.com/reviews/os/mac-os-x-10-5.media/carbon-future.mp3,而在2007年的WWDC大会上苹果宣布Carbon的整个GUI部分都将不会进入64位时代,Carbon被彻底判了死刑,所以Leopard中只有Cocoa写的GUI可以是64位的。一石激起千层浪,围绕Carbon的存废也有些故事,我会留待本系列的GUI篇和开发工具篇时再讲。

Leopard之后,Mac OS X离64位化只有一步之遥:内核的彻底64位化。这个任务由2009年发布的10.6 Snow Leopard来完成,它也是我接触的第一个Mac OS X版本。为了照顾那些还停留在32位时代的驱动程序,SL默认以32位模式的内核启动,如果你想切换到64位模式,可以在电脑启动时同时按住6和4两个键。这个版本很有趣,它的前辈Leopard有300项新功能:

而它却没有任何新功能:

尽管如此,它肩负的使命却十分重大。另外,SL还彻底与PowerPC决裂,只有运行在Intel CPU上的苹果电脑才能装它(我是说正常情况下,对Geek来说不是问题)

10.7 Lion和10.8 Mountain Lion在32位到64位的转变中就没那么重要了,他们只不过是在主要的第三方开发者都已经做好准备的情况下,对32位程序关上最后的大门。Lion的内核默认以64位启动,而ML则在内核中彻底移除了对32位程序的支持(10.8的XNU代码还没有放出来,我不知道ML的XNU版本号是多少),所以那些早期依然有32位驱动程序的苹果电脑就被排斥在ML的支持升级范围之列,不过这难不倒Geek们,他们仍然有办法在老电脑上安装ML。不知道有没有童鞋尝试过并成功了呢?不过,即使这种方法能装好ML,估计也没法运行,因为内核中已经没有任何32位代码了。

Mac OS X的内核——从PowerPC到Intel

Tags: mac

本文转载自Weiphone论坛,作者fantacyleo(weiphone's id)。遵循CC版权协议。原文链接

苹果和摩托罗拉的渊源极深。1984年的Macintosh电脑就装配了Motorola 68000,尽管这款CPU实际的主频只有可怜的6MHz(Macintosh 128K)2011年iMac最低配使用的CPU主频为2.5GHz,是Motorola 68000实际主频的约500倍)。从那时起,摩托罗拉的CPU就成了Mac电脑的“标配”,直到2005年苹果公司公开宣布转向Intel平台。用今天的话来说就是Macrola联盟(仿Wintel的构词法)。随后,又一家公司加入了Macrola联盟,这就是在和微软的合作中十分受伤的IBM。当年,IBM与微软联合推出IBM兼容机+DOS,有效遏制了上升势头正劲的苹果。未曾想共患难易,同享福难,IBM和微软很快翻脸。自此,Wintel联盟独霸一方,另一方面,IBM没从自己提出的PC标准中捞到多少好处,却养肥了组装PC厂商。世上没有永远的朋友,只有永恒的利益。失意的IBM找到苹果和摩托罗拉,三家公司于1991年10月联合发表了联盟声明,欲将IBM和摩托罗拉在硬件方面的优势与苹果在软件方面的优势结合起来,形成一个新的PowerPC体系,对抗Wintel联盟,时人以三家公司的打头字母,称之为AIM PowerPC联盟。该联盟在硬件方面的主要目标就是研发更加强大的PowerPC,取代苹果已经使用了多年的Motorola 68X00系列处理器,而在软件方面,该联盟希望共同开发新的操作系统,树立业界标准,以吸引更多开发者的依附。针对苹果和IBM结盟,比尔盖茨评论道:这简直像一个女流氓嫁给了银行家(参见“Power PC失乐园 IT巨头芯片领域恩仇录”

1994年推出的PowerMac 6100成为第一台装备PowerPC的苹果电脑。尽管它的销量不错,但苹果的“软硬件一体化”策略使得AIM联盟根本无法撼动Wintel的统治地位。比尔·盖茨在1995年出版的《未来之路》中评论道:“苹果公司为了它自己的硬件而决定限制销售它自己的操作系统软件,这种错误,在未来的年代还会时常重演。” 后来苹果的几任CEO开始将Mac OS对其他厂商开发授权,这有助于PowerPC市场份额的扩大,当然是IBM和摩托罗拉乐于看到的,因为这将带来规模效应,降低生产成本,开放授权也正是当年IBM和微软联盟时采用的策略。但是,正如第三章中提到过的,开放Mac OS的授权却损害了苹果公司自身的利益,数年内,苹果在授权问题上摇摆不定,于是,博弈论中经典的囚徒困境在AIM联盟中上演了。当上下游厂商之间的交易成本变得十分巨大之时,IBM想到了垂直整合,他们意欲收购苹果,但最终因价格没有谈拢而作罢。

PowerPC 6100

尽管AIM联盟在软件方面的目标从未实现,它的硬件目标却很成功。早期的PowerPC的性能远胜Intel(所以PowerPC联盟未能战胜Wintel联盟主要还是归咎于苹果自身),苹果曾推出了《蜗牛》广告片。广告中,蜗牛驮着英特尔处理器缓缓爬过,苹果以此嘲讽英特尔处理器很慢(苹果一向擅长通过广告嘲笑竞争对手,请看“细数苹果最具攻击性的广告”)。所以乔帮主在回归后仍然沿用PowerPC,并且在2001年的WWDC大会上专门安排了一个环节来讲解为何Intel不敌PowerPC,有条件的锋友请翻越GFW,观看MHz myth 。虽然苹果在评论竞争对手时经常夸大,但这回他们的批评还是很中肯的。当时的Intel迷信主频(也可能是他们利用消费者对主频的迷信),不重视优化CPU的架构。为了提高CPU主频,Intel过度增加管线长度(管线长度和频率的关系 ),造成高频低能。在架构问题上,Intel还在AMD K8那里吃过亏,给了AMD崛起的机会。 然而,随着AIM联盟中各方的貌合神离,PowerPC的优势很快就丧失殆尽,被Intel反超。乔帮主要求摩托罗拉加快研发速度,甚至以允许摩托罗拉继续生产Mac兼容机为诱饵,未果。后来,摩托罗拉将芯片部门独立出去,成立了飞思卡尔公司,IBM成了PowerPC的主要负责人。但是苹果电脑的市场实在太小众了,而且IBM当时正和微软、Sony、任天堂的游戏主机打得火热(http://www.cnhubei.com/200503/ca778102.htm),对苹果经常爱搭不理的。2003年,乔帮主宣布PowerPC的主频将在2年内达到3GHz,可是到了2005年这一目标仍未实现,这让帮主很没面子,加之PowerPC的功耗也大大高于Intel CPU,他终于下定决心抛弃PowerPC(参见http://en.wikipedia.org/wiki/Apple%27stransitiontoIntelprocessors)。不过我纳闷的是,帮主2001年才说主频不是一切,嘲笑Intel主频至上吗,怎么2年之后就开始“唯主频”了呢?。 WWDC大会上,帮主拿他2年前的3.0GHz PowerPC承诺说事儿

转向不同的处理器平台可不是件轻松的事情。不同的处理器工作方式差异很大,编写的软件需要转换成相应的机器指令(0、1构成的二进制序列)才能被CPU识别和执行。不过,苹果向Intel的转换过程既不痛苦,也不漫长,这归功于两项技术。一是帮主从NeXT时代就开始使用的微核心内核架构。苹果电脑进入PowerPC时代时,乔帮主正在主攻高校科研市场,卖力推销他的NeXT计算机。结果大家对NeXT的硬件不感冒,对其操作系统NeXTSTEP倒是情有独钟。后来,NeXT干脆砍掉了硬件部门,专门发展软件(参见《Cocoa Programming for Mac OS X》第1章 )。由于没有了硬件,乔帮主就不可能再坚持软硬件一体化时代的“不授权”策略了,NeXTSTEP必须能够跑在各种各样的硬件平台上。这种情况下,NeXTSTEP采用Mach微核心的优势就体现出来了。Mach的一个设计目标就是适应各种硬件平台,由于微核心只实现操作系统最基本的那些功能,在移植到不同平台时无须作太多改动,只需要针对不同平台修改驱动程序和高级功能,并挂在微核心上运行即可。在微核心架构的帮助下,NeXTSTEP被先后移植到x86、PA-RISC和SPARC等硬件(参见Mac OS X背后的故事 三)。而苹果公司也曾利用Mach与Linux结合,开发出能运行于PowerPC上的MkLinux(见本系列第三章)。二是通用二进制技术(Universal Binary)帮助新系统实现对老程序的完美兼容。在旧CPU平台上编写的程序想要在新平台运行,有两种方式。一是借助于模拟器,就像现在大家在Mac上用Paralells跑Win,好处是完全不用改程序代码,缺点则是速度慢。Mac OS X提供了一个叫Rosetta的模拟器,星际争霸I和PhotoShop都曾在Rosetta上跑过。第二种方式就是在一个程序中同时捆绑两种平台的代码,由系统根据需要调用不同版本的代码,这就是通用二进制技术的基本思想。通用二进制技术避免了模拟器带来的速度损失,代价是程序变得臃肿。

Universal Binary的logo:

向Intel过渡时期,应用程序可以选择以Rosetta模拟器方式执行

在移植计划的具体执行方面,根据几个老员工回忆苹果很早就有转向Intel平台的计划,当年把乔帮主请回来就是要完成向Intel平台的转变。而根据另一苹果员工Michael Burg的回忆,他在1999年时曾参与Mac OS向Intel平台的移植,他的团队成功地在Intel平台上启动了命令行界面和图形界面,但是在图形界面下无法运行任何程序(参见http://www.quora.com/Apple-Inc-2/How-does-Apple-keep-secrets-so-well中第一个帖子的评论部分) 。今年6月,另一位前苹果员工的妻子在社交网站quora上披露了Mac OS X在2000-2001年间首次成功地运行在Intel PC上(http://www.quora.com/Apple-Inc-2/How-does-Apple-keep-secrets-so-well),这个故事非常有趣,在这里和大家分享一下。

我们知道,苹果为了照顾Win用户,推出了BootCamp简化在Mac电脑上装Win。现在来看,尽管每天Mac区都有不少帖子抱怨装上Win后的大大小小问题,但至少Win在Mac电脑上跑起来还是比较轻松的。相比之下,PC用户装Mac OS就没有那么轻松了,黑苹果碰到的问题要大得多,装不上、装上却不能启动的一大把。weiphone论坛曾有一篇帖子,教大家在Sony笔记本上装Mac OS。不知道有没有锋友成功地让Sony跑上了Mac OS呢?其实,Sony笔记本装Mac OS本可以不必这么麻烦,只是天意弄人,Sony终于没能吃上一口美味的苹果。

2000年,已经在苹果工作了13 年的 John Kullmann Scheinberg(此人在Linkedin的主页http://www.linkedin.com/in/jdkullmann,他在苹果工作了21年,2008年离职,现在是另一家公司的联合创始人和CTO)正打算带着儿子老婆回他们位于东海岸的老家,和父母同住。这意味着以后他将成为SOHO一族,无法再和其他同事一起共事,他只好去寻找一个可以独自完成的项目。美国西部时间2000年6月20日,John Kullmann给他的上司发了一封邮件: Date: Tue, 20 Jun 2000 10:31:04 -0700 (PDT) From: John Kullmann jk@apple.com To: Joe Sokol Subject: intel

i'd like to discuss the possibility of me becoming responsible for an intel version of MacOS X.

whether that's just as an engineer, or as a project/ technical lead with another person - whatever.

i've been working on the intel platform for the last week getting continuations working, i've found it interesting and enjoyable, and, if this (an intel version) is something that could be important to us i'd like to discuss working on it full-time.

jk

这封邮件开门见山,第一句就提出要负责将Mac OS X移植到Intel平台。我们刚才看到了,苹果的移植计划可以追溯到1999年,也就是说,John并不是突发奇想要去跟进这个项目的。说来也巧,John的上司正好是13年前将他招入苹果的那位。这个提议得到了批准,之后的18个月里,John逐步从原来的项目中撤出,开始专心研究Mac OS X的移植,他的家里和办公室各有三台Intel PC,而根据苹果的保密措施,这六台电脑都不能通过苹果的内部流程来申请购买,John找了他的一个卖电脑的朋友搞到了这些电脑。在那18个月里,这个名为Marklar的计划只有6个人知道。2001年12月,John的上司让他报告一下现有的工作成果。John已经在几台Intel PC上装好了Mac OS,开机后,屏幕上出现了熟悉的Mac OS X欢迎画面。

John的上司傻眼了,马上叫来Mac OS X业务主管Bertrand Serlet。Bertrand也傻了,他问John在一台Intel电脑上装Mac OS X要多久,2-3周够不?John回答说不用,最多三小时(昨天还在黑苹果区看到有人用8个小时在PC上装Mac OS X)。Bertrand兴奋不已,他让John马上去电脑城买几台顶配的Sony Vaio电脑,然后现场装Mac OS X给他看。到了晚上7点半,电脑买来了,Mac OS X也装好了,运行正常。 Mac OS X业务主管Bertrand,2011年从苹果离职,2012年加入Paralells,就是做那个虚拟机软件的公司。

很快,乔帮主就去见Sony老总了。关于会谈,也有几种说法。一种说法是John的妻子提供的,说在苹果确认Vaio能够运行Mac OS X的第二天,帮主就飞往日本去见Sony老总洽谈在Vaio预装Mac OS事宜。第二种说法,是在John的妻子的帖子后发表评论的一位日本记者提供的。该记者自称采访过时任Sony老总Ando,Ando告诉他,乔帮主在夏威夷打高尔夫时透露了移植成功的消息。而第三种说法是上面提到的那位Michael Burg猜的,他认为乔帮主去见Sony老总只是为了商谈供货事宜,因为当时许多苹果产品内都使用了Sony的芯片。不管是哪个版本,反正最后苹果和Sony没谈妥移植的事情。虽然没谈妥,但苹果转向Intel的脚步并未停止。John Kullmann继续,苹果增派了更多的工程师和他一起。由于John已经和妻子谈过移植项目的一些情况,且演示移植时其妻儿也在场,苹果公司要求John的妻子不得泄密,而且John不能再和妻子谈论任何有关项目的话题,而John的房子也被要求进行改装以增强保密性。

有了内核架构和Universal Binary的保障,以及工程师们的不懈努力,苹果基本上做好了完全转向Intel的准备。2005年,乔帮主在WWDC大会上正式宣布将在2年内将全部电脑产品转向Intel平台(WWDC 2005视频片段,22分钟开始是转向Intel平台)。2006年1月,搭载Intel Core Duo处理器的iMac和Macbook Pro就已经面世,比原计划提早半年(参见http://tech.sina.com.cn/n/2006-07-14/111138197.shtml),2006年4月,BootCamp1.0推出,苹果电脑上终于能轻松地跑Windows了。软件方面的过渡也在逐步展开,从10.3开始,苹果用了3个版本的Mac OS X,终于在10.6雪豹停止对PowerPC电脑的支持,全面Intel化。

PowerPC和Intel平台各产品名称对照表: PowerPC Intel —————————————— Mac Mini Mac Mini iMac iMac Power Mac Mac Pro Xserve Xserve iBook MacBook PowerBook MacBook Pro

Mac OS X的内核——向左或向右

Tags: mac

本文转载自Weiphone论坛,作者fantacyleo(weiphone's id)。遵循CC版权协议原文链接

1976年2月3日,当时还名不见经传的微软公司创始人比尔盖茨发布了一封致业余电脑编程爱好者的公开信:

这封公开信可算是最早的反软件盗版宣言,尽管盖茨自己的屁股也不太干净。同时,它也宣告了专有软件时代的来临。所谓专有软件,就是其使用、修改、复制和分享受到版权持有人限制的软件。以微软为代表的专有软件支持者认为,软件所有者通过限制他人对软件的使用和分享并从软件的销售、技术支持中获得收益,能够更好地激励软件所有者不断改进软件,促进整个产业的发展。

软件专有并非计算机产业的传统。起初,软件是在不同用户之间自由分享的,我看到你的程序不错,就向你要一份源代码,放到自己的电脑上研究、使用。如果我对其中的某些功能不满意,还可以自己修改源代码,并将修改后的软件重新发布给其他人使用。其他人也可以随意向我索要源代码,研究、自用或修改后再发布。这一切都是免费的,而且被视为理所当然的。软件自由分享更正式的定义请看:http://www.gnu.org/philosophy/free-sw.html

专有软件出现后,版权限制加上许多开发者投入专有软件的怀抱,软件自由分享的传统日渐衰弱。上一章中提到,Unix源自一个失败的项目——MULTICS。但是,当早已撤出MULTICS项目的AT&T见Unix广受欢迎、有利可图时,就抡起了专利的大棒,将Unix变成专有软件,并向Unix的著名分支BSD发起了诉讼。1985年,一位对专有软件感到极度不满的年轻人从MIT的人工智能实验室辞职,并发表了著名的自由软件运动宣言,成立GNU组织,正式宣布要开始进行一项宏伟的计划:创造一套完全自由免费,兼容于Unix的操作系统GNU,并建立了自由软件基金会(FSF)来为该计划筹集资金。 此人便是自由软件教父Richard Stallman,搞编程,特别是Unix/Linux环境下编程的应该没有不知道这位大胡子的,Emac编辑器就是他的杰作。

几张2005年Stallman来中国时的照片: Stallman在复旦演讲

Stallman带领着一帮有理想的程序员,用了不到5年就将Unix上的各种带有版权保护的工具重新写了一遍,并以自由软件的形式重新发布。万事俱备,只欠OS,没想到这个代号为Hurd的内核难产了多年都没有进展。东方不亮西方亮,正当GNU组织犯愁的时候,芬兰的小伙子Linus Torvalds平地起惊雷,给他们送来了Linux,至此,GNU/Linux操作系统正式成型。

Linus Torvalds

Linux的发展极其迅猛,我从2002年上映的纪录片《操作系统的革命》 中节选几个数字: 1991年,Linux 0.01 10000行代码 1用户(Linus本人) 1992年,Linus 0.96 40000行代码 1000用户 1995年,Linux 1.2 250000行代码 50万用户 1997年,Linux 2.1 800000行代码 350万用户 1999年,Linux 2.2 1200万用户

Linux的发展也引起了苹果公司的注意。1996年,苹果公司和OSF合作搞了一个MkLinux系统,以实现了纯粹微内核的Mach3.0+Linux服务为内核,它可以运行在装备PowerPC的苹果电脑上,这个PowerPC版的Mach被叫作osfmk,我在第二章中提到过,Mach的这个变体后来被用在Mac OS X中。乔帮主回归苹果时,Linus已经成了个名人,开源界的大佬,背后有着350万用户和开源社区、GNU、IBM、Sun、Redhat等的大力支持,其话语权不可估量,而Linux系统也被认为是抗衡微软的希望之星。正好Mac OS X的非GUI层(Darwin)又是开源的,乔帮主自然希望能把Linus拉到苹果一边。于是,他请Linus到苹果总部一叙,以下内容来自Linus的自传兼回忆录:Just for fun的中文翻译版(这个版本貌似是某些爱好者翻译的,国内没有出正式授权的中文版)。

Linus当时刚到美国不久,也正好想见见硅谷的明星们,于是屁颠屁颠来到乔帮主的办公室,看到乔帮主和Tevanian正在等他。乔帮主直入主题,声称在操作系统的领域只有两个玩家――微软与苹果,现在他给Linus指条明路,就是与苹果公司联合,并号召开源社区都帮着苹果玩转Mac OS X。

帮主是极有个性之人,可这位Linus也不是什么善主,他决不像外表看上去那样温和(例如,Linus炮轰C++事件)。加上帮主这话摆明了是没把Linux放在眼里,更是深深地刺激了Linus,所以这次见面从一开始就几乎注定了要无果而终。

不过,Linus还是耐着性子想听听苹果的这个新系统到底有多牛B。于是接下去Tevanian就开始介绍Mac OS X的内核设计,也就是Mach微内核+Unix服务+I/O Kit,而且强调这个内核还是开源的,跟Linux的运作模式也是契合的。在第二章中我提到过,Linus没来美国之前,就和微内核的拥护者,Minix操作系统的发明者Tanenbaum在网上大吵了一架,因为两人对宏内核和微内核孰优孰劣意见相左(关于不同的内核形态,大家可以回头去看第二章)。Linus在他的自传中也提到了这次争吵,并且摆明了他的观点,微内核无法应对内核功能分解后不同内核模块之间猛增的通讯量。Linus这么说并不完全出于偏见,事实上,当年GNU自己的Hurd操作系统项目就打算采用微内核,结果正是因为无法Hold住内核模块间通讯的复杂性而难产(《操作系统的革命》23分40秒,Stallman承认了这一点,并且举了个例子)。听到牛B哄哄的Mac OS X使用的竟是自己最鄙视的架构,而自己的得意之作Linux可能只会被当作外部服务挂在这个微内核上(苹果公司在MkLinux上就干过这事),Linus再也忍不住了。他直言自己不喜欢微内核,微内核有各种缺点blabla。到了回忆录中,Linus更是直接写上他认为Mach“只是一堆废物”,而可怜的Tevanian更是连名字都没出现,只是被称为“随史蒂夫同来的那位苹果公司的主要技术人员”。我想,宾主寒喧时肯定会相互介绍,报上自己的名号,而Linus不写从大学时就开始热衷Mach的Tevanian的名字,也反映出他对Mach和微内核架构的极度不屑。接着,Tevanian又表示Mac OS X还要兼容旧的应用程序,Linus更不耐烦了,因为旧的Mac OS连内存保护都没有,也就是说,一个应用程序随时可能侵入另一个正在运行的应用程序的内存空间,随时都可能导致后者崩溃。

乔帮主在技术问题上碰了一鼻子灰,便又一次把他的开场白拿了出来,说Linux如果想占领个人电脑市场,抗衡微软,就一定要和苹果联合。这话倒是一点儿都没有夸大,由于Win统治下的用户很难适应Unix/Linux的那套命令行工作模式(就是像DOS那样的界面),如果GUI不行,那么Unix/Linux想要吸引个人电脑用户就难于上青天。以Linux目前的几个GUI,也就Ubuntu自带的那个弄得不错,其他的无论KDE还是GNOME,跟Win比都差着一截,遑论Mac OS了,而且它们还在不断地模仿Win和Mac OS的GUI(特别是KDE),搞得有点四不象。可是,这个美好的许诺依然没有打动Linus,他表示自己对打败微软没有兴趣(他的自传书名都说了,Just for fun嘛)。。。

KDE最新的4.7版,窗口看着还挺漂亮,那几个磁盘图标和Home文件夹是不是和Mac OS X上的似曾相识,而废纸篓图标又酷似Win7的回收站?一看任务栏,我凌乱了,这TM是回到win 98时代了吗?

Gnome 3,顶部那一行完全就是模仿Mac OS的嘛。。。底下那个地址簿APP的图标,是不是也和Mac OS X的地址簿长!得像?

两个都个性十足而又坚持己见的人,如果出现了意见分歧,那几乎是不可调和的,所以乔帮主和Linus的这次会面没有取得任何成果也在情理之中。和开源界的大佬谈崩了,可苹果还得和开源社区打交道,毕竟那个Darwin是开源的啊。不过,正是这个Darwin,让苹果和开源社区最后也闹得非常不愉快。

话说Stallman领*导的自由软件运动10多年之后出现了一些分裂的迹象。自由软件许可证要求源代码开放、任何人有修改再发行的权利,这就意味着自由软件的开发者是不可能通过软件销售获利的。Stallman当初的设想是自由软件可以通过服务赚钱。软件的售后技术支持对个人来说可能无足轻重,我想即使用着正版Win、正版Office的也没有几个找过微软的售后,实在不行卸载重装嘛。可是对企业来说就没有这么容易了,谁也不敢拿商业数据的安全开玩笑。企业用户更倾向于选择丛有信誉的厂商获取软件和售后技术支持,哪怕要花钱,而不是直接到自由软件主页免费下载没有任何后续支持的源代码。在这方面也确实有不少成功的案例,比如1/9/8/9年成立的Cygnus Solutions,以及后来的RedHat。

然而,任何纯粹的东西在经济利益的侵蚀下都不免带上现实功利的色彩,更何况“自由分享”精神对人的道德水平的要求似乎高了一点儿。随着自由软件运动的发展壮大,专有软件厂商也开始盯上了这块蛋糕,当然,他们看上的可不是“自由分享”,而是“开源”。开放源代码,意味着可以吸引一大批程序员为软件的改进出谋划策、增加新功能、消除BUG,三个臭皮匠,顶个诸葛亮,何况这些为“开源”社区工作的臭皮匠还是自愿无偿的,如此好事谁不喜欢。于是,许多专有软件厂商也纷纷竖起“开源”的大旗,吸引一批程序员到自己麾下无偿贡献,而一旦发现软件有商业价值,便将其闭源变为专有软件。Stallman强烈反对这种违背自由软件精神的所谓“开源”,2007年,他在回答《ComputerWorld》记者提问时,明确指出自由软件和开源软件是不同的两个概念,“Free software is a political movement; open source is a development model.”,并把Linus归为“开源”一方。Stallman把他对开源软件的看法及开源与自由的区别写成一篇短文,放在了GNU网站上(http://www.gnu.org/philosophy/open-source-misses-the-point.zh-cn.html)。同时,GNU也没有完全抛弃一度失败的开源操作系统Hurd的开发(http://www.gnu.org/software/hurd/hurd.html),可能是打算作为Linux的备胎,虽说现在人们不再认为纯粹的微内核操作系统效率低,但Hurd依然没有发布过任何的稳定版本,生死难测。

苹果的Darwin也是开源而不开放,第一个原因嘛,就是苹果也是以盈利为目的的公司,搞个开源社区,招呼一帮无偿服务的臭皮匠来帮自己,何乐而不为?第二个原因是技术上的,苹果公司在操作系统内核的开发方面远不如他们的GUI那样耀眼。Mach和BSD都是从学术界走出来、遵循自由分享传统的产品,无论是NeXT还是苹果都只是站在巨人的肩膀上修改了一下拿来用。倒是内核的硬件驱动程序部分——I/O Kit是正儿八经的用苹果自家的Objective-C语言写的,后来又改为C++版本。第三个原因,也是最重要的原因,就是乔帮主的固执己见。

对帮主来说,开源也好闭源也罢,他都是有底线的,他必须实现对Mac OS的完全控制。他不能容忍Mac OS像Win那样被授权给无数PC厂商,这改一点,那改一点,以便兼容各厂商的硬件。在这方面,他像个清教徒似地严格遵守着GUI先驱、smalltalk之父Alan Kay的那句名言:每个热爱软件的人都应该有自己的硬件系统(讽刺的是,Kay加入苹果公司后却致力于推动Mac OS像windows那样授权给PC厂商)。他认为最好的产品是一体的,软件是为硬件量身定做的,硬件也是为软件度身定制的。如果一台电脑要兼容那些在其他电脑上也能运行的软件,它必定要牺牲一些功能(乔布斯传第13章)。1982年5月,时任Macintosh营销总监的Mike Murray曾给乔帮主一份机密备忘录,提出Mac操作系统的授权计划。1985年,比尔盖茨致信赶走乔帮主的斯卡利,强烈建议他开放Mac OS的授权,允许Mac兼容机的出现。这两次提议都没有奏效。到了1994年,已处于困境的苹果公司终于向两家电脑厂商授权Mac OS,1996年摩托罗拉也获得了授权,生产StarMax。然而授权并不能解决苹果的问题。一方面如《乔布斯传》中所说,兼容机挤占了苹果电脑的销售,而当时每台苹果电脑的利润远高于兼容机的授权费,经济上得不偿失。另一方面,即使苹果像微软那样,彻底放弃自己的硬件,变为纯粹的软件厂商,但由于微软已经占领市场,而Mac OS却固步自封,多年未有重大更新,并且缺乏乔帮主这样的领军人物,苹果公司放弃软硬件一体的传统,就等于自废武功,变得毫无特色,依然很难翻身。乔帮主在回归后立刻着手消灭Mac兼容机。为此,他不惜花费1亿美元收购了其中一家获得授权的厂商PowerComputing(《乔布斯传》24章)。而对摩托罗拉,他采取了胡萝卜加大棒的策略:如果摩托罗拉能为Powerbook(后来的Macbook)制造出性能堪比Intel的芯片,就允许摩托罗拉继续生产Mac兼容机。不过摩托罗拉高层既不是吃素的,也不是厦大毕业的,谈判不欢而散,摩托罗拉立即中止了StarMax的生产(《乔布斯传》31章)。

以上三个原因注定了苹果的开源不可能是自由分享式的,甚至连彻底的开源都做不到,只是一开始开源社区的人还没有认识到这一点。2002年,苹果和国际互联网联盟成立了帮助Darwin发展的OpenDarwin社区。但是苹果和社区开发者的关系并不对等,苹果从OpenDarwin社区索取颇多,要求开发者积极反馈,却很少回报社区,Darwin中某些关键代码和API不开放给社区,Darwin有什么修改也很少和社区沟通交流,这引起了开发者的强烈不满(参见“Leopard:unix王朝的终极进化“)。顺带一提,有开发者提议以一只名为Helexy的鸭嘴兽作为Darwin项目的吉祥物,本来它应该叫Huxley的,中译为赫胥黎,达尔文进化理论的坚定捍卫者,但是被错拼为Helexy,结果将错就错就沿用下来了(http://en.wikipedia.org/wiki/Darwin%28operatingsystem%29)。

2003年,苹果发布了苹果公开源代码许可证APSL 2.0,自由软件基金会(OSF)认可了这个许可证,不过他们也指出,苹果在这个许可证中留了两手(参见http://www.gnu.org/philosophy/apsl.html),一是这个许可证允许一个软件中同时存在自由和专有部分,二是这个许可证与GNU组织的GPL许可证并不兼容,FSF给软件开发者的建议是,可以使用或修改这个许可证发布的软件,但如果你要再发行,就不要再依据此许可证了。事实证明,FSF的这个建议非常有先见之明,2011年末,Mac平台著名的视频播放软件VLC正是因为许可证冲突从Mac App Store下架。VLC基于GPL第2版发行,在Mac App Store上架时一切顺利。不过,VLC的一位开发者随后发现了GPL许可证和Mac App Store的许可协议在分发、修改条款方面存在矛盾,于是他向苹果提出了申诉,2个月后,VLC从Mac App Store下架(http://fosschef.com/2011/01/vlc-removed-from-apple-app-store/)。 VLC的图标源自交通路障

在Darwin源代码的发放上,苹果也不那么配合开源社区的传统。一般的开源社区允许用户通过版本控制系统访问源代码,并提供源代码打包下载,而苹果对源代码的提供方式就是文件浏览,没有对软件包进行任何的打包,这会让想下载源码的人非常麻烦(参见这位开发者的体验:http://blog.fatduck.org/2011/03/blog-post.html)。

两件事成了苹果和开源社区彻底翻脸的导火索。

第一件事是苹果在从PowerPC转向Intel这件事情上对开发者撒了谎。这个故事来自天涯上的这个帖子:http://www.tianya.cn/new/publicforum/content.asp?stritem=itinfo&flag=1&idarticle=64059&idwriter=0&key=0。Darwin的源代码刚刚开放下载时,开发者就发现代码有一个PowerPC版本和一个x86(Intel平台)版本。于是就有人怀疑苹果是不是要转向Intel平台。后来,苹果在官网上给出了一个Q&A,表明没有任何移植MacOS X到PC平台的计划。

Q: Will Mac OS X be ported to the PC? 问:Mac OS X(苹果机的操作系统)会被移植到PC上么? A: There are no plans to make Mac OS X available on any non-Apple platforms. We're simply making Darwin, the underlying operating system of Mac OS X, a better system by using x86 as a test bed to ensure architectural soundness and to reap the benefits from applying portable software coding practices. 答:我们没有任何让MacOSX在其他平台上运行的计划。我们在x86上运行Darwin内核,只是为了使得Darwin作为现在MacOSX的内部操作系统,从软件的可移植性角度来说,能够具有更好,更坚实的体系结构。”

原文链接应该是:http://developer.apple.com/darwin/news/qa20010927.html#x86。遗憾的是这个链接已经失效了,即使通过http://web.archive.org也找不回来(被苹果屏蔽了)。天涯的帖子给了个据说存了档的网页,不过也已经打不开了。。。经过一番努力,我在wiki百科的这个appleoldfaq页面找到了这个Q&A,无巧不成书,页面作者也是在看到天涯帖子提供的那个网页后制作了这个wiki页面:http://en.wikipedia.org/wiki/User:Lielei/AppleOLDFAQ。

根据原始网址,那个Q&A发布于2001年9月27日,有证据表明,苹果在此之前已经开始准备转向Intel平台,但它向开发者隐瞒了这一点。当2005年乔帮主在WWDC大会上宣布苹果电脑将转向Intel平台时,开源社区一片哗然。

第二件事,也是更让开发者愤怒的事情就是苹果在宣布转向Intel平台后迅速关闭了Darwin基于x86版本的源代码。本来嘛,苹果不配合,开发者也就忍了,毕竟他们可以利用Darwin源代码,在自由软件许可证下修改发布自己的新操作系统,事实上,他们当时正在开发一个可以运行在PC上的Darwin,开发中他们向苹果索要一下关键技术的信息,苹果对他们就爱理不理,现在干脆连PC分支的源代码都关闭了,开源社区彻底没戏了,他们也彻底明白自己被苹果耍了,社区主力开发者Rob Braun在邮件列表中写道:

”随着Mac OS X在x86 芯片上的发行,苹果决定不再开放一些操作系统的核心组件和驱动的源代码。这决定了Darwin/x86已经胎死腹中。Darwin/ppc已经有很多闭源的成份并且已经是要淘汰的体系。人们不禁要问苹果何必要释出这些非GPL协议代码,如果它不愿意和外界的(开源)开发者合作来增加他们对投入的回报和对Bug的修复以及新的功能。人们甚至更要问:我们为什么要花时间在这样一个没有结果和无意义的工作上。”

2006年7月,OpenDarwin项目宣告停止。2008年,在波特兰举行的世界开源大会(OSCON 2008)上,Ubuntu创始人Mark Shuttleworth发表了主题演讲,直言苹果是开源的敌人

就事论事,我们当然可以批评苹果在Darwin项目上的做法,甚至,我们也可以以阴谋论的观点来看待苹果推动其他开源项目,如WebKit,的目的。但是,开源软件与自由软件的分裂已经表明,自由软件运动的困境是系统性的,而并非苹果一家造成的。在商业利益的诱惑下,如今由Google主导的Android,谁能保证它不会成为下一个OpenDarwin呢?自由软件的铁杆粉丝们是不是也该重新规划一下如何推进他们的事业,在专有软件的荆棘丛中杀开一条血路?

Mac OS X的内核——三位一体

Tags: mac

本文转载自Weiphone论坛,作者fantacyleo(weiphone's id)。遵循CC版权协议。原文链接

乔帮主年轻的时候玩high了,弄出了人命,也就是他的女儿Lisa(话说这女儿果然像老爸):

尽管乔帮主一开始不愿意承认这个女儿(当时也没啥亲子鉴定的高科技玩意儿,乔帮主不承认,孩子妈也没办法),但他还是用Lisa命名了他主持的一个革命性的新项目——带有图形用户界面(GUI)并用鼠标操作的电脑Apple Lisa:

以后的GUI篇中我还会提到这台前卫却在商业上失败的电脑,现在大家所要知道的是,这台电脑的操作系统设计理念在当时的个人电脑领域同样前卫,例如多任务。今天我们早已习以为常的多任务在20世纪80年代的个人电脑中完全是个新鲜事物,比如当时IBM-PC上跑的MS-DOS就不支持多任务(当然也不是完全无解,DOS提供了一个很不靠谱的实现机制。另外,APP可以绕过DOS系统,直接操纵硬件来实现多任务,这种方式当然不安全,软件开发者的一个不小心就会让导致系统崩溃,还记得第一章的那些系统内核崩溃图吗?在后来实现了多任务的Windows系统中,为了兼容老板本的程序,依然允许APP直接访问硬件)。其实多任务只是让用户感觉似乎有多个程序在同时运行,在电脑内部,实际上是多个程序轮流使用CPU,每个时点只有一个程序能够得到CPU的响应。在Lisa OS中,“轮流”是基于自愿的,每个APP执行完自己的任务后,就给OS打个报告说我的任务完成了,OS就让它暂时靠边,把CPU让给其他APP,这被称为协作式多任务(Cooperative Multitasking)。

乔帮主没有等到Lisa开发完成就离开了Lisa项目组,投入了Macintosh的开发。Macintosh成为了世界上第一个在商业上成功的GUI操作系统,然而,Macintosh的操作系统并未实现多任务等先进功能,我猜想这是因为Macintosh的重点是GUI,特别是在GUI的处女秀(Lisa)失败的情况下。当然,乔帮主并没有忘记Lisa OS中的那些前卫设计。

1983年,乔帮主在布朗大学计算机科学系演示了尚未发布的Macintosh电脑。不过,学校里的那些老学究们对GUI这玩意儿并没有太大的兴趣,系主任Andy van Dam就给乔帮主浇了盆冷水,他指出,Macintosh的性能不能满足他们的科研需要。乔帮主说那你有什么要求。Dam说,我要3个M。乔帮主差点把嘴里的水喷出来,老兄,我们是卖电脑的,不玩霓虹国那一套。Dam连忙摆摆手,No,No,No,我说的3个M是指一台具备1兆(Megabyte)以上内存、百万(Million)像素显示屏、每秒百万次浮点运算能力(Megaflop)CPU的电脑。乔帮主定了定神,把水咽回去说,你就不能直说你要一台高配置个人电脑吗,搞电脑我是专家,什么M之类的你该找埃里克施密特去(原谅我让乔帮主穿越了,原谅我调侃了Android)。

Brown大学归来,乔帮主就开始让那3个M的项目上马。这个项目有着一个可口的名字:BigMac(没错,“Big Mac”就是麦当劳大名鼎鼎的明星产品——巨无霸。如果这台电脑成功上市,不知道麦当劳会不会起诉苹果公司):

这个可能就是传说中的BigMac样机

这BigMac作为工作站,和一般的个人电脑还是有些不同的,多种多样的外部设备接口是少不了的,还有什么并行啦,多任务啦,这就意味着操作系统的任务多了、复杂了。苹果公司当时估计还没这方面的经验,而且IT界有一句名言:不要重复发明轮子。历史早已为BigMac准备好了一个优秀的操作系统内核——Unix,也就是本章的主角。

话说20世纪60年代的时候,电脑上用的操作系统还比较落后,于是AT&T、GE等业界大佬联合了学术界大佬MIT就准备搞一个非常先进的操作系统,代号MULTICS。不过,理想丰满,现实骨感,这个项目过于复杂和庞大,以至于多年都没有实质性进展。大事干不了,贝尔实验室的一位工程师Ken Thompson就用MULTICS的半成品来测试自己开发的一款太空打机,呃不对,是太空射击游戏。结果这破系统不但慢得要死,还烧钱,打一次飞机,呃,又错了,是玩一次太空射击要75刀的费用。要放现在,一程序员发现自己设计的游戏跑得慢,他肯定是在自己身上找原因,想方设法优化程序。可贝尔实验室的工程师的想法就不一样,人家压根不认为自己的程序写得有问题,跑得慢是因为操作系统烂。Thompson喊来了同事Dennis Ritchie,两人合写了一个新的操作系统,大名鼎鼎的Unix诞生了! Thompson和Ritchie两位老爷子:

Unix一开始就是先进、前卫的:

引入了数据存储的基本单元——文件。支持先占式多任务(preemptive multitasking)。CPU的分配不再像协作式多任务那样基于自愿,而是完全由操作系统控制(搞编程的应该很熟悉,类似多线程里的运行、阻塞、中断、锁等等),不但可以优化对硬件资源的使用,还从根本上防止了APP中的BUG导致某个程序长时间占用CPU。

强大的网络功能,由加州大学伯克利分校开发的Unix分支,即著名的BSD率先实现了TCP/IP协议,Windows的TCP/IP实现也是参照了BSD中的相关源代码。

Thompson和Ritchie在20世纪70年代初用C语言重写了Unix,从而使Unix获得了极强的可移植性和适应性。Unix被移植到各种硬件平台,从嵌入式系统到大型机都可以看到它的身影。而我们的老朋友Windows则基本上没有可移植性,离开了Intel平台它几乎哪儿也去不了。

Unix+苹果的图形用户界面就是乔帮主为BigMac规划的完美蓝图,也就是说,Mac OS X的基本架构在它诞生前10多年就已经奠定。可惜,乔帮主很快就因为内斗被剥夺了实权,到了后来更是被扫地出门,BigMac也被乔帮主的继任者废止了。但是,在乔帮主心中,BigMac的信念并未熄灭。1985年8月,乔帮主和生物学家、诺奖得主保罗·伯格(PaulBerg)在斯坦福大学会面,又聊起了科研人员对电脑的需求,《乔布斯传》中这样写道:

他们在斯坦福大学的校园里散步,最后在一个小咖啡店里吃午饭,探讨问题。伯格向乔布斯解释了在生物实验室做实验的困难程度,做一个实验并获得结果可能需要数周时间。

“为什么不在计算机上进行模拟实验呢?”乔布斯问道,“这样不仅你自己能够更快地开展实验,而且,有一天,美国的微生物学新生都会用到保罗·伯格的基因重组软件。”

伯格解释说,对于大学实验室来说,具备这种能力的计算机太贵了。“突然间,乔布斯就为这种现状所蕴含的可能性兴奋起来,”伯格回忆说,“他想到要创办一家新企业。他年轻、富有,要为自己今后的生活找点儿事做。”

于是,乔帮主不惜与苹果公司翻脸,带走了负责高校市场的营销干将,以及Lisa项目的部分成员。他决心在他的新王国NeXT公司复活BigMac项目。

Unix无疑是非常优秀的,但随着其不断发展,也开始出现一个问题——内核太大。这里的“内核太大”并不是说内核占用空间大(实际上Unix刚出来的时候,其内核只占用12K的内存),而是说内核要操心的事情太多。在现代操作系统中,一个普通的APP不能想干啥就干啥,一不高兴把内存中属于内核的数据改了,引起系统崩溃那还得了。所以,现代操作系统中,一个APP启动时通常都被限制在一个被称为“用户态”的筐里,能做的事情有限。APP想做点更高级的动作咋办?那就必须向内核打报告,让内核把APP临时提升到“内核态”(关于内核态和用户态,请参阅http://book.51cto.com/art/201001/177431.htm),任务完成后再打回“用户态”。但是这一来一回的切换要耗费时间,对于一些要基础性、需要大量重复执行的程序来说,每次都要打报告显然效率很低。对此,操作系统的设计者可以把这些程序安排在“内核态”执行,这些程序通常包括进程管理、文件管理、输入输出管理、硬件驱动等,具备此特点的内核被称为“宏内核”。传统的Unix、早期的Windows和Linux内核都是宏内核。宏内核避免了“用户态”和“内核态”的频繁切换,执行效率最高,但缺点也很致命。在内核态中运行的程序只要出一丁点错,都有可能让整个系统崩溃。你把越多的东西放到内核,崩溃几率也就越大。

站在宏内核对立面的是微内核。微内核只把少数核心的操作系统功能放进内核态,其他的通通作为外*挂服务,挂载在内核之外,以用户态启动,即使某一服务出错,也不容易造成整个系统崩溃。当然其缺点也是显而易见,频繁的用户态和内核态切换,以及不同服务之间的通讯(IPC),都要耗费更多的时间,降低效率。

这两种内核形态各有优劣,也可以互相学习,共同进步。不过有人的地方就有纷争,关于两种内核优劣的争议不断,其中最著名的当属Linus和Tanenbaum之间的大辩论(其实这两人可算是师生,Tanenbaum开发了Minix用于课堂教学,而Linus上课时不满于Minix过于简单,就加以改进并发明了Linux系统。),我这里给出google group上的完整版:。也有很多人试图找出操作系统功能在用户态和内核态之间的最优划分,即所谓的混合内核。Mac OS X和现在大家用的win版本皆属此类。我详述不同的内核形态,一是为了引出Mac OS X的内核特点,二是为第三章的内容作个铺垫。有了宏内核、微内核、混合内核的概念,第三章的小故事看起来会更有趣。

下面该回到我们的故事主线,乔帮主的BigMac计划,嗯,等一下,在NeXT,它有了个新名字,叫NeXTSTEP。乔帮主向来讲究软硬件不分家,承载NeXTSTEP的硬件叫NeXT计算机,由Lisa项目的原班人马负责,而NeXTSTEP OS则由卡内基梅隆大学的高材生Avie Tevanian博士负责。

Avie Tevanian:

前面说过,Unix是宏内核,随着功能的不断扩展,内核日渐臃肿,卡内基梅隆大学就想搞一个没那么臃肿但又与Unix兼容的系统,取名为Mach,Avie Tevanian便是开发组中的干将之一。Mach的终极目标就是走到Unix的对立面,成为一个纯粹的微内核,而把部分Unix的功能作为外*挂服务。但这家伙也是个理想丰满现实骨感的典型。Mach的起点就是BSD Unix的源代码,开发人员试图将新理念和新代码逐步替换原有代码,最终完成一个新系统。可是,直到2.5版本,Mach内核都还是一个未能摆脱Unix的宏内核。

Tevanian领*导下的软件组当然采用了Mach,并于1988年10月12日发布了NeXTSTEP OS预览版(0.8版),第二年9月18日发布1.0版。从3.1版开始,NeXTSTEP OS又包括了一个用Objective-C写的全新的驱动程序框架Driver Kit,但Unix和Mach仍未彻底分开。后来,Mach 3.0内核终于将Mach和Unix服务完全独立,到1997年NeXT被苹果公司收购前,NeXTSTEP OS(其实已经改名为OPENSTEP)也采用了Mach 3.0,形成Mach、BSD Unix服务、Driver Kit三合一的OS底层,这已经非常接近Mac OS X的架构了。

NeXTSTEP OS的GUI:

乔帮主回归后,Tevanian担任苹果公司软件技术的主管,Mac OS X的底层也沿用NeXTSTEP的架构,但又有所不同。其中Mach改用一个名为osfmk的变体,BSD在2000年之后逐步转向FreeBSD,而最惨的当属Driver Kit,不但改了个名叫I/O Kit,连实现它的编程语言都改成了C++,按“Mac OS X背后的故事(三)”中的说法,这是为了“迎合大众的口味”。我认为,NeXT岁月对乔帮主最大的影响就是让他那张扬、特立独行的性格有所收敛。根据《乔布斯传》的描述,帮主原来连电路板印刷工厂都要亲自设计,亲自监督,后来他终于放弃这种古怪的偏好,将电路板制造外包出去了。

2000年Mac OS X public beta发布会上,乔帮主的keynotes中,BSD已经换成了FreeBSD:

就这样,Mach、FreeBSD、I/O Kit三位一体的Mac OS X内核正式成型,它被称作XNU:

在苹果的开发者文档中,经常把文件系统和网络功能与Mach、FreeBSD、I/O Kit并列,例如这里。但文档里也明确说明,Mac OS X中的文件系统和网络功能也都是基于Unix,最明显的,大家打开“实用工具”里的“终端”,输入命令“ls /”看看列出来的那些/usr /bin /dev文件夹都是标准的Unix文件夹。因此,我只把Mac OS X的内核分为Mach、FreeBSD、I/O Kit三部分。

XNU是完全开源的,它的各版本源代码可以在这里找到:http://www.opensource.apple.com/source/xnu/ 。 XNU加上一些被称为“Core OS”和“Core Service”的开源工具,就构成了一个完整的不带GUI的操作系统(Mac OS X的GUI是有版权的,不开源),也就是大家熟知的Darwin。Darwin是个完整的开源操作系统,而XNU是它的内核。

Mac OS X的内核——N国语言

Tags: mac

本文转载自Weiphone论坛,作者fantacyleo(weiphone's id)。遵循CC版权协议原文链接

这个系列文章里几乎不会讲Mac的坏话,但也不等于不讲Mac的坏话。这第一章我就来讲讲Mac的“坏话”——Mac OS X内核崩溃,俗称死机,别名“N国语言”(N是正整数)。为什么用N而不是一个确定的数字?答案是这个N实际上在不断变化,确切来说是不断增长。

内核是啥玩意儿?说白了内核也是一个程序、一个软件,是操作系统最核心最基础的部分,专门负责硬件资源管理和调度,以保障其他程序和软件的正常运行。大到你在暗黑3里厮杀,小到你按下键盘上的一个按键并在屏幕上显示出来,全都离不开内核的帮助。CPU、显卡、内存、硬盘、键盘、打印机等硬件本身都是些死东西,他们都会做好也只会做好份内的事情,比如你在键盘上按下字母“A”,键盘可以记录下“A”键被按,但它所能做的也仅限于此了,它可不会自动帮你在屏幕上打出“A”,要想在屏幕上打出“A”,就必须由内核来帮你牵线搭桥,接收键盘传来的信号并给屏幕发送指令。

内核也是程序,也是软件,也是人造的东西,所以它不可能不出问题,bug和用户的错误操作都可能让内核挂掉,当然,内核对自身的错误是有纠正机制的,不过这也不保险,严重的错误会突破内核的承受极限,于是内核崩溃了。内核的工作是如此基础而重要,一旦崩溃那是非常麻烦而棘手的。不过,内核临死前会给我们留下一些有用的线索,一是会把系统运行的情况记录在特殊的文件中,二是会在屏幕上留下一些可见的信息,就好像是内核的遗言,这也正是我要讲的。

目前,个人电脑上的操作系统内核主要有两大类:Windows内核和Unix/Linux内核(这两大阵营的恩恩怨怨可以写一大本书了。2002年有人拍了部纪录片:操作系统的革命,http://www.tudou.com/programs/view/Nbz3C92uFuQ/ 大家有兴趣可以去看看,我以后的文章里也会用到这部电影里的一些素材)。不同内核的遗言是不同的。Mac OS X的内核中包含了一个Unix的分支叫Free BSD,所以,Mac OS X早期版本的内核崩溃遗言就是Unix内核的崩溃遗言:

Mac OS X 10.0-10.1内核崩溃遗言:

再来两张有趣的Linux内核崩溃图:

看完上面几张内核崩溃图,除了那两个吐舌头的死人和死牛有点意思外,其他的大段英文和数字估计大伙都是一头雾水。没错,这些内核崩溃遗言都是给专业技术人员看的,帮助他们排查故障,但对普通用户来说无异于天书、火星文。早期的Mac OS X还不稳定,内核崩溃是家常便饭,时不时就跳出一段火星文。对普通用户来说,给他们一大段火星文和简单告诉他们电脑死机了没有任何区别,火星文或许还有副作用:会吓到普通用户。于是,一向注重用户体验的乔帮主不能忍了,他怒吼:苹果电脑就算是死机的用户体验也要做得比其他系统更好。帮主发话,下头的人哪敢敢怠慢,马上在10.2版本中拿出了一个用户体验更好的死机画面:

这个画面用英法德日四种语言告诉你需要按住电源数秒强行关机,这就是大家熟知的“四国语言”死机,也是“N国语言”的开始。这个“四国语言”提示真是与众不同,只告诉你有问题要重启,连系统崩溃了都不告诉你;当然,Unix内核崩溃的详细信息也还是保留的,只不过是记录在了专门的文件中,而不是打印在屏幕上给普通用户看。“四国语言”伴随大家走过了10.2、10.3、10.4、10.5,到了10.6雪豹系统,N增加到5,新增西班牙语,俗称“五国语言”:

我之前用pro玩那个GeekTool时遇到过几次,可惜当时没有截图留念。。。如今,论坛上还是经常看大家称呼“四国”、“五国”,其实,在10.8 Mountain Lion中,N已经增加到了6,新增的语言就是在10.8和iOS6中打了翻身仗的咱们的母语——中文:

不知道装了10.8的各位有没有遇到“六国语言”的?欢迎在下面跟贴出。当然,Mac OS X现在已经很稳定了,大家看到“N国语言”的机会非常非常渺茫,绝对比看到Win蓝屏的几率小。

好了,Mac OS的坏话先说到这里,既然提到Win的蓝屏,本文的最后就来调侃一下Win的死机画面吧: win95/98的蓝屏,没有输出大量的错误信息,基本上只有一个错误代码和出错的内存地址。我认为这个蓝屏画面最经典的地方就是教会了大家按那三个键。

win2000蓝屏,内容增加了:

win xp/vista/7蓝屏,好多,越来越多:

可爱的win 8蓝屏,世界又清净了:

再来爆两个和Win系统蓝屏有关的糗事: 1.win 98发布会上,当着盖茨的面,98蓝屏鸟 2.Surface平板电脑在发布会上不堪演示者的乱点乱戳,当场死机

fedora中安装xmind的deb包

Tags: xmind

1.Download the deb package from official website of xmind
http://www.xmind.net/download/linux/
2.unpack that package mkdir xmind
ar -x xmind-linux-xxx.deb
sudo tar xvf data.tar.gz -C /
sudo update-mime-database /usr/share/mime/

okay,now you can use it to write something.If it doesn't appear in your desktop menu, you can try next command cp /usr/share/applications/xmind.desktop ~/.local/share/applications Good luck!
References:
Install Xmind in Fedora with deb package

最新文章

最近回复

  • Blackrose: 感谢拍砖!嗯,那句话...
  • aa: “Raspberry...
  • Blackrose: 外部只是帮你把芯片启...
  • : 内部时钟比外部的频率...
  • Blackrose: 你这评论比正文更有内容么
  • 7hao: CR+LF ...
  • Blackrose: 可以是你更新软件源后...
  • sxk: 博主,我的系统是ub...
  • Blackrose: 你深得精髓么
  • qihao: 这篇文章的简单总结就...

分类

归档

其它