Linux诞生记

 以下内容来自于本人通过www.oldlinux.org论坛的收集整理,献给每一位喜欢linux的人!

        多年以后,面对数十亿的电脑及手机使用者,Linus Torvalds定会想起在屏幕上打出AAAAAAA和BBBBBB的时刻。那时候芬兰的冬天依然是漫长而寒冷,年轻人只能躲在家里捣鼓点东西。由于房屋破旧,家里只有一根电话线,更别提宽带了。Linus不是一个好哥哥,他为了上网,不惜在妹妹正在打电话时将线路抢断。在Linus向妹妹演示自己的伟大程序时,也只能够得到“还不错”的评价,然后妹妹该干嘛干嘛去,原来英雄从来都是那么孤独与寂寞。Linus自己不可能想到,从这么一个简单程序开始,能够谱写出一部像Ken Thompson与Dennis Ritchie所创造的一样的传奇。后两者写出了Unix操作系统和C语言这两个伟大的事物,他们两人的故事将会在Unix诞生记里来讲述。从本篇开始,我想讲述Linux 1.0以前的故事,主要参考Linus的自传《Just For Fun》。

        Linus很小的时候就喜欢捣鼓外祖父送给他的破电脑,能让电脑听从自己的指令,那比与女生约会还能激起他的兴趣。当然,在他交了女朋友之后,还真是将Linux丢在了一边两周,这是后话了。上大二的Linus再也忍受不了那台破电脑的速度,于是耗费3500美元的天价买了一台386兼容机。随机带的是一个DOS操作系统,但他想安装一个Minix。Minix是Andrew S. Tanenbaum所写的《操作系统设计与实现》配套的操作系统,Minix即Mini Unix,是Unix的简化版。你可以很方便的到书店买到那本书,但由于购买操作系统的人很少,所以没有现成的。Linus又花了169美元订购了一套Minix操作系统,那是漫长的一个月的等待,才拿到。Linus花了一个周末安装了Minix操作系统,要知道当时的Minix操作系统是16张软盘。至于Linus为啥没有直接安装Unix,这话就长了,简而言之是Unix已经由于版权问题闭源了,价格比较贵,另外,对硬件的要求也较高。对于没有收入的学生来说,当然是能省则省。如果Minix能够允许任意修改,那也没Linux啥事儿了。可偏偏Andrew是一个狂热的微内核支持者,并且坚持Minix只用于理论学习,要保持精简。于是乎许多Minix爱好者想做的改进以及功能需求都得不到满足,憋成了内伤,这其中就包括Linus。

        Linus对Minix下的终端模拟器很不满意,想自己实现一个。所谓终端模拟器就是一个可以远程拨号连接到其他机器的程序。但他不想直接基于Minix来开发,而是基于裸的硬件,这样他就可以学习一下386的硬件知识了。那么他就需要从BIOS开始,研究怎么从硬件一步步的启动到操作系统。以Linus当时的水平,只能是边干边学,首先要写一个测试程序,就是本文开头提到的打印AAAAAA和BBBBB的程序。

        Linus想搞明白操作系统的多任务是怎么实现的,多任务在当时已经是很成熟的东西了,Unix毕竟最开始就引入了多任务的理念。当然,DOS系统在当时依旧是单任务的模式,开发者是不会放在眼里的。那时候的Windows也只是一个玩具,直到1995年的windows 95横空出世,才引起了轰动。怎么实现多任务呢?只要将电脑启动后,在引导程序中,设置一个时钟中断,每次时钟中断时,保存正在运行的程序的状态,然后加载另外一个程序的状态,然后返回。那么中断完成后,就开始运行新程序了。Linus在这两个程序中,一个负责打印A,一个负责打印B,在某些异常情况,则打印C。就这样,他奇迹般的实现了多任务。这里要说的是,他实现的多任务是写死的,如果你要动态的增加新任务,那是不可能的。

        有了打印AAAAAA和BBBBBB的经验,Linus就可以继续他的终端模拟器项目了。可以通过Modem连接到学校的服务器,这样就可以看新闻之类的了。这不同于一个操作系统上的应用,它是不依赖与任何操作系统独立运行的,你可以理解为他要实现一个简单的操作系统,就能干远程登陆这么点事,当然,任何人不能将它称为一个操作系统。基本的实现是创建两个任务,一个负责将服务器的内容接收过来,显示到屏幕上,另一个负责将键盘敲入的内容,传递到远程服务器。就这样,很快被他捣鼓出来了。然后安装在了自己的电脑上,想看新闻的时候,就切换到这个模拟器,想开发或干点其他东西,就还是用Minix系统。<<问题:这里有点不明白:然后安装在了自己的电脑上,想看新闻的时候,就切换到这个模拟器,想开发或干点其他东西,就还是用Minix系统。 模拟器和Minix系统是如何切换的?(模拟器算是一个简单的系统,难道放到了软盘,每次换一下软盘后重启电脑。)?解释:Linus 把硬盘分了几个区, 然后通过选择想使用的启动分区来进行切换. --- 这样做的后果很严重, 最终导致误写了MINIX分区, 把以前所有有保留价值的东东一扫而光, 包括那个AAABBB程序.>>

        在上一篇,我们讲到Linus完成了自己的终端模拟器,其最大的特点是直接基于硬件运行的,而不是任何操作系统上的一个应用。Linus用它可以连接学校的服务器,看看新闻,收发邮件,以及参与Minix新闻组的讨论。可慢慢他有了新的需求,希望能够将自己感兴趣的内容存到磁盘上。

        于是他需要写一个磁盘驱动程序,用于访问到硬盘上的内容,然后还要写个文件系统,用于管理磁盘上的数据。由于他本来就在用Minix操作系统,而自己的数据都是在Minix文件系统上很好的存放着。Linus想是不是干脆就实现个Minix文件系统算了?就是说,Linus通过他的终端模拟器可以读写Minix文件系统上的内容,同样,Minix操作系统也能够读写到终端模拟器上写入的文件。总之就是Minix与终端模拟器公用一个文件系统。要知道,全世界的大学男生都一样,都希望有自己的女朋友,如果没有,就想办法参加各种活动来认识女生。Linus对自己的长相并不是很有信心,他每周三都会参加一个晚上的同学聚会,这差不多是他社交活动的唯一渠道了,当然,很少女生会对一个木呆的程序员感兴趣。这样倒好,Linus可以专心的做爱做的事——实现磁盘驱动程序和文件系统。他进入了一种模式:编程——睡觉——吃点东西——编程——睡觉——演示——编程...,直到他真的实现这些功能。

        有了文件系统,Linus不知道是哪个白天或者夜晚,连他自己都搞不清楚,忽然意识到自己是不是可以写个操作系统了?因为已经实现了操作系统的雏形了。他把自己的系统叫做:终端模拟器中的GNU-Emacs。之所以这么叫,是因为他的终端模拟器不再是简单的模拟器了,它有了腿。熟悉GNU-Emacs发展史的人应该知道,Emacs的最开始的用途只是一个文本编辑器,可后来有人给它加了可以执行脚本命令的功能,然后加了可以收发邮件的功能,然后又加了其他功能。可以说Emacs成了一个操作系统的壳子,很像现在的浏览器基于网络无所不能。Linus觉得自己的终端模拟器也可以无所不能。

        操作系统是计算机领域的最终统治者,它拥有自己的规则。所有运行在其中的程序都得遵守规则,否则操作系统随时可以把你干掉。而写操作系统的程序员,就很接近于上帝。他制定规则,创造一切,Linus太喜欢这种感觉了。女孩的心思他可能无法掌控,但自己写的程序,那还是会乖乖听他的。

        要实现操作系统,那最起码得熟悉POSIX标准。POSIX是Unix可移植操作系统接口的缩写,定义了操作系统提供给上层应用的所有系统调用接口。说起POSIX,不得不提Unix发布之后的混乱局面。由于Unix开源,各大公司基于原生的Unix发布了各自的版本,为了保证应用程序能够运行在各操作系统上,或者说较少的修改即可移植到其他操作系统,美国电气和电子工程协会(IEEE)邀请了自由软件之父Richard Stallman基于Unix制定了本标准。这个标准不只是局限在Unix世界,其他操作系统也建议采用此标准,包括Windows也生成部分实现了POSIX标准。当年的互联网可没这么发达,Linus只能在新闻组里发帖咨询谁有POSIX文档,最好是有Ftp地址可供下载。发帖之后没有什么响应,他只能寻求第二种方案,登陆到学校的Sun公司的Unix系统中,找到其中的系统调用的一些接口,加上Minix操作系统设计书上讲解的部分,他基本可以去实现二三十个常用的系统调用了。最常用的系统调用包括open、read、write、close等,这些抽象非常伟大,几乎所有的设备访问都能这么去抽象。这里我们要再次感谢Ken Thompson和Dennis Ritchie,是他们在最初创造Unix时,坚持简单而优雅的原则,而不是复杂而丑陋。

        发帖寻找POSIX标准,略微懂计算机操作系统的人都能明白,这人一定是在考虑实现一个操作系统了,至少是在深入研究操作系统的实现。有个叫Ari Lemke的助教看到了帖子,并回复说可以为Linus创建一个Ftp目录,以方便其将开发的操作系统传到那里,供其他感兴趣的人下载。

        Ari Lemke助教一定是个乐观主义者,因为连Linus自己都想不到可以分享什么的时候,他就给Linus创建好了ftp目录。事实上,从建好目录到Linus真的有东西上传进去,那可是好几个月的时间。Linus一遍查着Sun版本的Unix的用户手册,一遍翻着各种操作系统书籍,《The Design Of The UNIX Operating System》和《Operating Systems: Design and Implementation》是他常翻的两本。前者是贝尔实验室(Unix正是诞生于此地)的一个专家写的关于Unix实现的经典著作,我在前一段还在网上买了一本影印版,对Unix的讲解非常透彻,特别是进程与文件这两个大的抽象概念的实现。后者就是实现Minix操作系统的Andrew S. Tanenbaum教授的著作。他要查找所有的系统调用接口说明,进而实现这个系统调用的底层。这里再重复一次,系统调用就是操作系统开放给上层应用访问底层硬件资源的接口,应用是不能不经过操作系统直接访问硬件的。像Unix这样的操作系统,当时差不多有200个左右的系统调用接口,Linus就一个一个的实现。系统调用有的很简单,有的又很复杂。像一个read调用,你需要实现底层的磁盘驱动。而像open调用,你简直要实现整个文件系统。你需要去不断的写函数,然后写段测试代码,测试其是不是正常运行,别提有多枯燥了。Linus实现的很没劲,他想让这个事情变的有趣一点。

        忽然有一天,他想到是不是能够让一个正常的应用程序能够在他的小操作系统上跑起来?这个程序依赖的系统调用如果还没实现,就优先实现它,有一个明确的目标,比漫无目的的实现一堆调用,可要有趣的多。那么选择一个什么程序呢?Linus想到了Shell。Shell的意思是外壳,在Unix系统中,系统默认提供的可以敲命令运行其他程序的程序就是Shell。Shell可以说是其他程序之母,可以说其他程序都是通过Shell来启动的。当然,实际情况并非如此,你先可以这么理解。于是Linus直接从网上找了一个开源版的Shell,叫Bash。只是为啥这个Shell叫Bash,还有个恶搞的事情。曾经有一个叫Borne的人实现了一个Shell,而又有人基于他的经验实现了一个更好的Shell,名字就叫Borne-Again Shell(即另一个Borne Shell),简称Bash。那么怎么将Bash跑起来呢?他的小操作系统从磁盘上读出Bash这个文件,但它并不能理解Bash是什么东西,也就是说先要实现一个程序加载器。等实现了程序加载器,Bash就可以加载到内存运行了,运行的时候就会有系统调用请求,如果小操作系统还不支持,那么就打印出“系统调用512号尚未实现”之类的信息,Linus就知道要先实现这个系统调用。<<PS:"有一个明确的目标,比漫无目的的实现一堆调用,可要有趣的多。"--------这给了我们一个启发,就是当你要去实现一个庞然大物却又有无从下手的时候,一个明确的目标是最有效的突破口。>>

        从4月到8月,差不多是芬兰每年最好的时光,许多人会在海边晒太阳,而Linus则总是呆在屋子里。不分白天与黑夜,工作日与周末,在某个时间点,从床上起来,走两步到电脑前,编程——睡觉——吃东西——编程——演示——睡觉...。平均每周会有一个朋友来找他玩,如果他不是在忙着调程序的话,Linus就会邀请他到屋子里。注意,这里是“他”而不是“她”,那个时候极客可不是什么很酷的事物,即使现在,程序员依旧是苦逼的。偶尔也会和朋友出去喝杯啤酒,那是极少的。他老爸还催促他妈是不是给儿子找份暑期工作,他妈觉得无所谓。只是Linus的妹妹对自己老哥偶尔和自己抢电话线表示不满,可还能忍受。

        大约在实现了25个左右的系统调用的时候,Shell竟然可以正常运行了!这真是激动人心的事,Linus感觉非常有成就感。要知道之前没什么可以运行的东西,一下子有了这么大的程序可以跑。并且对于像cp(拷贝文件)和ls(列出当前目录的文件名列表)之类的程序,都是Shell的系统调用的子集,直接移植过来就能运行。那种感觉就像一门课程从0分一下子提升到了100分。那感觉就像圣经中的“要有光”,于是世间万物就有了光。做操作系统,其实是追求上帝的感觉。

        Linus把自己的操作系统叫做Linux,当然,他最开始不这么想。Linux对他来说显得过于自恋,他最开始给系统其的名字叫Freax,就是将Freaks(怪胎)的ks改为x,和Unix一样的结尾。当然,这个事情不是很重要,Linus还没有公开发布什么内容,有没有名字都无所谓。这个时候程序员的本性又暴露了,他要去论坛上去炫耀了,当然,会以问问题的方式。

        屌丝计算机系大二学生Linus到Minix新闻组发了一个帖子,问大家希望Minix增加什么样的功能。在这个帖子里,他告诉大家自己正在开发一个小操作系统。它仅仅是一个小爱好,所以没办法和GNU里的软件如gcc之类的相比。但他已经完成了bash外壳程序和gcc编译器的移植,也就是说,再过几个月,他就可以发布一个有一定实用性的操作系统了。功能需求倒是没有收到多少,但Minix新闻组里的那些极客们震惊了,开始问它支持内存管理单元吗?它是用C语言实现的吗?它是可移植的吗?并有许多人想做操作系统beta版的测试人员。这可给了Linus无穷的动力,但他什么时候确定要发布自己的操作系统呢?这是一个问题。程序员们都有完美主义情节,自己的代码就是自己的作品,那么就不愿意将乱七八糟的草稿公之于众,自己会觉得羞于面对。也就是说,什么时候发布操作系统的问题演变成了什么时候自己的操作系统不会让自己觉得难堪这一问题。

        有了这么几个勇于测试的人员,Linus有了更好的主意。他不需要一下子将Linux发布给所有人,而只需要先发给几个人试用。Ari Lemke助教提供的ftp地址终于派上了用场,他将自己的第一个版本上传了上去。对于版本号定为多少,一般也有个约定,我们把第一个正式版叫做1.0,那么对于测试版本,Linus就以自己觉得相比较正式版,已经实现的比例来作为版本号。他把这个版本定为版本0.01,也就是说他觉得自己的操作系统刚实现1%。

        在上一篇中,我们已经提到,Linus已经实现了支持bash外壳程序和Minix文件系统。还有一点在最开始的AAAAAA和BBBBBB打印程序里就已经实现了的多任务支持。他所实现的文件系统是支持多个任务同时读写文件的。由于Linux 0.01是在Minix下开发和编译的,所以如果想安装Linux 0.01,必须要已经安装了Minix,并且拥有gcc编译器。事实上,这个gcc编译器还是经过Linus修改过的版本,他也一并放在了ftp上。所以我怀疑Linus在发出开篇那个帖子时,还并没有实现gcc完全移植到Linux下面,也就是说他所说的gcc编译器的移植,只是指移植到了Minix系统下并支持Linux编译需求。

        事实上,为了安装这个仅能运行bash外壳程序的Linux,代价是很大的。编译过程可能会出现各种诡异的问题,另外,还需要建立一个单独的磁盘分区用于安装Linux。运行起来后,可能随时崩溃。你不小心运行的某个程序可能会访问越界,即使你什么都不做,它过一段时间也可能自己崩溃。而它能做的事情少的可怜,比如可以展示出系统的源代码,大约有1万行。

        Linus可能永远不会忘记发布0.01版的日子:1991年9月17日。

        我们之前提到Linus为自己的小操作系统起名叫Freax,可是助教Ari Lemke很不喜欢,擅作主张将ftp目录改成了pub/OS/Linux。Linus觉得这个名字也不错,并且不是自己主动这么叫的(这个名字显得过于自恋),就欣然接受了。发布之后,Linus自己都不确认会不会真的会有一两个人会尝试使用一番,结果竟然收到了好几个积极的反馈。他们往往会在开头夸这个系统很不错,但是,如果能有个什么什么功能就更好了。还有一个家伙,差不多写了一整段的赞美之词,然后说自己的磁盘被写坏了,怀疑是Linux的磁盘驱动程序的某个bug导致的。

        Linus积极修复了几个bug,并真的将gcc移植进入了Linux系统。这样,使用者就可以在Linux下面编译几个可以运行的程序了。这样,就不需要在安装Linux之前,先用gcc编译应用程序,然后在Linux系统编译时打包进去或者放在Minix的文件目录下了,也就是更接近一个可工作的操作系统。差不多半个月之后就发布了0.02版,并在公告词中说:你是否会期待那样的日子到来?男人能够像个真正的男人,可以写自己的设备驱动程序?这就是传说中的程序员的追求。接着又过了1个月发布了0.03版。在1991年底的时候,Linus几乎要决定终止这个项目了,因为他没有发现太多有趣的东西了。但真要如此,Linux也许就真的只是Linus的一个小爱好了。

        一旦面对的问题中的最关键部分解决了,人的兴致就会大减。Linus在完成了Linux的最基本的功能后,就没了兴致继续搞下去了,这时候发生了一件悲惨的事情。Linux毕竟还只是个玩具,在下面还干不了太多的事情,Linus主要用它来连接学校的电脑,通过他写的Linux下的终端模拟器看新闻和收发邮件。而连接学校的机器主要是靠电话线拨号,他本来是要拨串口线设备/dev/tty1,结果拨到了/dev/hda1。而/dev/hda1表示电脑磁盘,结果就损坏了Minix系统的关键数据,导致Minix无法启动。这时候Linus需要做一个决定:是重新安装Minix?还是干脆就只用Linux算了?他选择了后者。促使他选择后者的还有一个原因,不断的有一些用户向他反馈问题和需求,他需要不断的改进系统。于是Linus的电脑上就变成了只有Linux系统,如果需要什么功能,就将它补充上去,Linux成了一个真正的工作环境。这种理念有点像当年的Unix,Ken Thompson和Dennis Ritchie坚持使用自己开发的Unix系统,进而及时改进有问题的部分,并让它变得更易用。西方有句谚语叫“Eat your own dog food”,直面意思是吃自己的狗食,对开发者来说,就是使用自己的产品,这样更能感同身受。看看现在的大的互联网公司,有的软件工程师自己开发的产品,都几乎不怎么使用,只是将自己的工作当作薪酬的等价物,产品体验也就可想而知了。

        Linus开始通过使用Linux系统来编译新版本的Linux,这是多么振奋人心的事情。当年我在大学时,听老师说某个C语言编译器就是用C语言写的,开始还感觉理解不了。这无非就是一种迭代,最开始的C语言编译器肯定不是用C写的,但可以再用最初的编译器编译一个C实现的编译器。由于这一版本进步这么大,Linus将其作为0.10版发布。

        Linus将自己的电脑内存由4M升级为8M,并且添加了一个浮点协处理器。要知道最早的intel的CPU是没有小数计算能力的,只能做整数计算。当然,也不是绝对的不能,通过整数来模拟实现小数计算,只是效率比较低。浮点协处理器就是为了做小数计算的,效率更高。由于有用户反馈是否能支持自己的浮点协处理器,那Linus干脆自己也添加相应的硬件来用于开发。有一个德国的用户反馈Linux的编译环境能否支持2M的电脑内存,由于Linus自己的电脑最开始是4M内存,编译Linux内核时,gcc编译器需要用到1M多,这样再加上操作系统本身使用的内存,2M的内存显然就不够用了。这就迫使Linus给Linux添加了page-to-disk的功能,直接翻译是将内存页写到磁盘,就是虚拟内存。这里就多解释两句。在Linus之前开发的版本中,已经支持了分页功能,就是一个应用程序使用的内存可以是不连续的几个页,每个页假设是4KB大小,这样就避免了事先给一个程序分配连续的一大块内存。由于电脑的内存上限是4M,那么所有运行的程序加起来最多可以占用4M内存,再要使用更多的内存,就需要将某些程序给杀掉。有没有更优雅的解决方案呢?那就是page-to-disk即虚拟内存技术。当内存不够用时,我们可以将内存中不那么频繁使用的页面先写到一个磁盘交换区中。进而可以将空出来的内存用于更重要的需求。当被置换的磁盘交换区中的内存重新被访问到时,操作系统就将其重新加载的内存,当然,如果内存依旧是耗尽的,就会导致其他的程序的某些页面被置换到磁盘交换区中。这是Linus第一次为了别人的需求而添加的大功能。

        有了page-to-disk功能,Linux就不再是Minix的一个子集了,因为Minix并不支持这一功能。极客们开始将Linux与其他已有的系统做对比,有一批的Minix用户开始切换到使用Linux,Linux开始第一次的腾飞。这是1992年的1月,随着Linux 0.12版的发布,有成百上千的人开始使用Linux。相比于挣钱,Linus觉得有更多的人使用Linux是件更有趣的事情。Linus对钱没有太大的需求,他不需要约会,剩下的唯一的需求就是升级电脑硬件,可不升级也能够使用。实在不够花了,还可以找老妈要。当时网上发生了一个段子,说是有人得了癌症,希望收到来自其他地方的明信片,于是有成千上万的明信片寄到那里,至于有没有那个得了癌症的人,Linus也不敢确定。Linus参考了这个事情,就开玩笑给用户们说可以寄张明信片给他,于是来自新西兰的、美国的、日本的世界各地的明信片寄到家里。他的家人搞不清楚这是怎么回事,他妹妹开始觉得老哥有两把刷子。Linus并没有太多的给家里解释这是怎么回事,因为家人似乎对他做的电脑相关的事情并不感兴趣。

        由于大量Minix用户开始使用Linux且在Minix新闻组里热烈讨论,这引起了Minix的创始人Andrew S. Tanenbaum的极大不满,并引起了那场著名的口水战。

        事情的起因是Linus总是在Minix新闻组里发一些关于Linux的信息,并且吸引了许多Minix用户转向了Linux,这引起了Minix的创始人Andrew S. Tanenbaum的极大不满。如果Tanenbaum只是一个无名之辈,那也就称不上是著名的口水战了。一场伟大的对决,必须是双方都是高手,且在一个层次上。Tanenbaum如果只是写过一个教学用的操作系统Minix,那么其个人能力也就只能说是中等偏上了。可他做的远不止这些。

        我在读大学时,学校要求专业课尽量引进国外的原版教材,虽然读起来比较吃力,可也学习了不少经典之作。包括K&R的那本The C Programming Language,虽然当时主要是参考的谭浩强老师的那本C语言教程。还有一门计算机网络课程,用的教材叫Computer Networks。当时学校为了省钱,发的都是学校自己复印的版本,似乎也不是一件很合法的事。只记得虽然是英文教材,可读起来还是很流畅,对网络的讲解也很系统。直到前几天,我才发现这本教材也是出自Tanenbaum之手。

        Tanenbaum出生在荷兰,那里有漫长的雨季,在他无所事事的时候,写了Minix,还写了那本教材《操作系统设计与实现》,那本影响了Linus一生的书。事实上他不止写了这一个操作系统,还写了一个叫Amoeba的分布式操作系统,并且写了一本叫《分布式操作系统》的书。还有一本叫《现代操作系统》,都是经典之作。这三本属于他写的操作系统系列。当然,还写过关于分布式系统设计与范式的书籍,以及计算机网络的。他写书的特点是量非常多,而本本又是经典。即使说Minix与Linux对战中他输了一局,我们也不得不承认他是一个泰斗级的人物。

        这场争论起源于Tanenbaum在新闻组里发了一篇名字叫“Linux是退化的”的文章。这里要提的是从80年代开始到90年代初期,操作系统领域发生了一次关于内核该如何设计的争论。坚持微内核的一方认为操作系统的内核应该设计的尽可能的简洁,简洁的只处理模块间的消息传递。而像内存管理、进程、文件系统之类的,都是内核之外的服务或模块。坚持宏内核的一方认为虽然说把一个复杂的系统拆分成几块,每一块变得简单了,但是模块间的通信变得异常复杂,那没有将一些核心的东西当作一体来的更有效。Tanenbaum就是坚持微内核的一员,Minix就是微内核的代表,他相信微内核是大势所趋,代表了潮流。而Linux恰恰是宏内核的,所以是退化的。读者可能要问现在影响比较大的操作系统中,有哪些是宏内核,哪些是微内核呢。遗憾的是你能想到的可能都是宏内核的,唯一的例外的Mac OS,它的内核是基于mach改造的。而Mach是一个开源的微内核,可Mac OS已经将其改成了杂交体。当然,计算机领域总是一些理念交替的占主流,开放与封闭,分散与整合,说不定哪天微内核又成了主流呢。

        另外争论的一个焦点是关于操作系统的可移植性。由于Linus在开始写Linux时,一个主要目的是为了学习X86的硬件编程,所以Linux可以说是只能运行在X86体系下。由于使用了X86的较多特性,导致其想移植到其它如MIPS等其他体系时,改动是巨大的。而Minix对硬件的访问做了很好的抽象,促使其很方便的可以移植的各种体系上。关于这一点,Linus认为操作系统本来就是为了管理硬件的,这样的移植是意义不大的,总之都要重写底层驱动。最重要的是上层应用程序的可移植性,这一点通过使用POSIX系统调用接口来保证。

        最后的一个争论焦点是Minix是收费的,这一点促使了Linus要开发免费的操作系统。Tanenbaum给Linus发了一封邮件,截取了一个杂志上的关于Linux某个商业版本销售的广告,并问Linus这不是也想通过Linux赚钱?Linus赌气说是的。Tanenbaum就再没有给Linus回信了。

        Tanenbaum一直坚持Minix不能修改的过于复杂,以有助于教学使用。甚至对Minix所做的修改,只能作为补丁的形式存在。结果这大大限制的Minix发展成为一个商用的系统,给了Linux一个发展契机。到了Minix 3时,它也开始免费了,并且致力于成为一个商用的嵌入式操作系统,那是以后的事了。

        那场争论一年后,Linus亲自拿着他那本《操作系统设计与实现》去Tanenbaum家里去要签名。可在门口等了一天也没有等到,原来Tanenbaum教授正好去乡下度假了。当然,Linus可不是专门从芬兰到荷兰阿姆斯特丹找Tanenbaum要和个签名,还是为了参加一个关于Unix大会并要做主题演讲。事实上,Linus很不擅长站在万众面前,但他经不起免费旅行的诱惑。在这之前他曾经因为害怕演讲而错过了一次出国旅行,他不想继续懦弱了。

        Linus是一个内向的人,站在讲台上做个报告都只会傻笑,情不自禁。所以要面对400人的观众,头天晚上只会在被窝里颤抖。就像接受末日审判一般,他完成了自己的演讲。有一个叫Kirk的BSD Unix开发者走过来夸他的演讲非常有趣,Linus简直想跪在他的面前亲吻他的鞋子。Linus很少在网上去搜寻其他人,但Kirk是他找过的少有的一个。经过了这场演讲,Linus对自己更加自信了,连这么恐怖的演讲都能应付,还有什么能难得住的事呢?没有解决不了的问题,没有翻不过的火焰山。事实上那个时候他还深陷在一个泥潭,这是后话了。

        在1992年的春天,差不多是在做终端模拟器后的一年。有一个叫Orest Zborowski的黑客将X Windows移植到了Linux上面,也就是Linux也有图形界面了。这一天比Linus想的要早得多,在这之前他只是觉得有一天也会有图形界面,但只是开个玩笑而已。X Windows是一套图形界面,发布于1984年,主要是为了给Unix系统提供图形界面功能。与一般的图形显示系统不同,它设计了一个操作图形设备的Server,然后将其他需要图形界面的程序作为Client。Client需要图形显示时,就通过socket向Server做出请求,那么Server就在比如显示器上展示图形。这样做的一个好处是将图形显示与应用程序相分离,远程的程序也可以调用本地的图形显示。这个功能听起来似乎华而不实。这你需要回到80年代,那个时候使用计算机的模式还是通过一个性能比较弱的终端,连接到工作站上,进行一些命令提交。在这种模式下,用户可以将程序跑在工作站,然后在终端上进行图形显示,是不是很完美?其实到了今天,云计算时代,我们又将计算放在了云端,这种模式似乎又可以有用武之地了。比如手机操作一个云端的计算密集的程序,而程序又反过来控制手机上的展示。

        当然,它的优点也恰恰是它的缺点。因为通过socket网络通讯,导致Client与Server之间有较多的数据传输,即使是在同一台机器上,也有大量的数据拷贝工作,导致其图形显示性能大大下降。所以像Windows、Mac OS这样的主流操作系统,并没有采用这种图形显示模式。现在Linux系统上的两大图形界面KDE和GNOME,都是X Windows衍生出来的。KDE允许用户灵活定制,而GNOME限制的较死,但默认给你一个比较合适的效果。

        既然有了图形界面,又有个一个基本的网络传输socket模块,Linus觉得Linux距离一个羽翼渐丰的可靠的具备网络功能的操作系统不太远了。本来这一版本该叫0.13版,Linus将其发布为0.95版。也就是在Linus看来,整个系统已经完成了95%。IT界有个谚语,是说你花了一定的代价完成了90%的工作,你还需要花同样的代价完成剩下的90%的工作。这网络功能远非想象的那么简单,需要实现整个TCP/IP栈,需要考虑网络超时,以及网络安全。有了网络,就不是像本地操作计算机了,你无法控制有人想通过网络连接上你,这就需要很复杂的安全处理。这是一个大泥潭,Linus花了整整2年时间才爬了出来。

        由于接下来还有许多工作要做,而0.95到1.0之间的编号又不太多,Linus改变了版本号的标记方法。比如0.99版,下面再基于问题的优先级再设置一个序号,需要下面再带个字母,就成了0.99 15A这样的版本号了。

        从0.95版开始,Linux开始迅速发展。Linus感兴趣的一件事,变成了看Linux新闻组在所有新闻组中的活跃度排名,先是超越了Minix新闻组,之后竟然到了前五名。Linus激动的一夜没睡着,他的小玩意儿已经和Sex新闻组一样的火了。

我吃,

我睡,

偶尔去趟学校,

我编程,

我读许多的邮件,

这就是Linus的生活。

        对Linus来说,1993年的大部分时光与1991、1992并没什么不同,都是对着电脑,是时候发生点变化了。Linus在学校作为助教,教授一门瑞典语的计算机科学导论。可不要觉得是因为他的瑞典语有多棒,讲课水平有多高。完全是因为他们那一届一共只有两个会瑞典语,因而有幸得以选中。班里共有15个学生,算是针对社会人士的培训班之类的。当时的互联网还没有流行开,在一堂课结束后,他布置了一道课后作业,让学生们给他发封Email。许多人给他发送了一个简单的测试信息,但有一个叫Tove的姑娘给他发了一个约会邀请。就这样,两人很快的走到了一起,并且结婚生子。在他们刚在一起的两个星期,Linus简直就忽视了电脑。这是在11岁玩电脑以来,离开CPU最久的一次。他的母亲将其归结为“母性的胜利”。

        就这样,到了1994年春天,Linux 1.0终于要发布了!这是一个历史性的时刻,倒不是因为它的技术,而是市场层面的意义。你不可能卖给用户一个0.96版的系统,当然,这里不是指Linus卖出,而是那些将Linux商业化的公司。Linus自己觉得无所谓,本考虑直接在新闻组发封类似于“Linux 1.0发布了,大家快来下载吧”之类的邮件。可Linux社区的黑客们可不这么考虑,认为这是一件大事,一个叫Lars的积极筹备了这场发布会。由于Linux是非商业的,更适合在非商业的场合发布,当然,也不可能选在Linus的寝室,那里地方太小了。最后选在了Linus所在的大学,学校欣然同意。对学校来说,这是一个难得的机会,可以全国直播提升学校知名度。这也是Linus第一次上电视,还是他女朋友第一次见他父母。Linus的演讲没有讲太多Linux的东西,重点讲了开源软件。Linus Tovalds与Richard Stallman一样,高举自由软件大旗。

        多年以后,Linux成了互联网公司服务器的标配,像google、百度、阿里这样的公司,内部服务器和开发机都是用的Linux。手机操作系统Android也是基于Linux。随着Android在移动市场的普及,Linus的Linux甚至有希望打败比尔盖茨的Windows。2001年左右,有个叫David Diamond的作者找Linus合写一本自传。Linus想了想,说,我们开头可以讲人生的意义,David觉得有点意思,问然后呢?Linus就说看客就会被吸引进来了,那我们就可以随便乱写了。当然,Linus对人生的意义真有自己的看法,与心理学家马斯洛的理论倒是有些想通之处。

        天才马斯洛将人的需求定为5个层次,逐层递进。之所以叫他天才,是因为他智商194,接近封顶。第一个层次是生理需求,为了活着。第二个层次是安全,有健康的保障。第三个层次是社交,有归属与爱。第四个层次是尊重,自尊与他尊。第五个层次是自我实现,成为想要的自己。Linus有自己的一套哲学,他将任何人类活动分为三个层次,且有可能是相交的,分别是:生存、社会关系、乐趣。就拿性来说,最开始肯定是为了生命的延续,之后有夫妻之说,再进一步是为了获取一种快感。而对于参与Linux开发的技术人员来说,倒不是为了生存,因为挣不到钱。但可以通过自己的贡献,获取社区的认可。再进一步,是能够有比较多的乐趣。对于Linus来说,开发Linux绝不是为了挣钱,倒是可以获得某种成就感,但最重要的是有一种乐趣存在,对,Just for fun!

(完)

你可能感兴趣的:(网易博客搬迁之linux方面)