Linus和Linux

Linus

我是一个长相丑陋的孩子。

我能说什么呢?要是好莱坞有一天想拍一部关于Linux的电影的话,我希望他们一定得找一个像汤姆·克鲁斯那样的人担当主角。但在现实中,我的相貌可没有那么好。

千万别误解我的话,我还没丑到《巴黎圣母院》里那个驼子的地步。但可以想象一个我的大包牙,凡是见过我小时候照片的人,都会觉得我的相貌酷似河狸。再想象一下我不修边幅的衣着,以及一个托瓦兹家族祖祖辈辈遗传下来的大鼻子。这样,在你脑海中我的模样就形成了。

你有什么想法?你是不是想说,令人惊奇的是,所有这些缺点对我都没有什么太大的影响?长得像海狸、小矮个、戴副眼镜、乱糟糟的头发(其实后来我的头发也总是蓬乱不堪),不修边幅的衣着,这些都没什么影响,因为我有迷人的个性?

但我告诉你,事实并不是这个样子。

数学

还是让我们实话实说吧。我是一个古怪的书呆子,一个为人取笑的对象,从很早的时候起就是如此。

我倒没有干什么用胶带把眼镜粘在一起的事,但也差不多了。因为我有着其他合乎大家想象中的书呆子的所有特点——比如数学极好,物理也非常棒,社交能力却差得一塌糊涂等等。那时,做一个书呆子还没有被人认为是一件好事。

每一个人大概在上学时都遇到过像我这样的人。在数学方面很突出,但不是因为学习刻苦,而是天生就是那个样子,我在我们班就是这样一个人。如果说我孩提时代一些最幸福的记忆,是玩我外公的一台老式电子计算器,对此大概谁也不会感到惊奇。

我外公列奥·瓦尔德马·托尔奎斯特,是赫尔辛基大学的一位统计学教授。我记得我曾开心地在他那台计算器上计算过大量随机数字的正弦值,并不是因为我对答案感兴趣(毕竟,对这样的问题没有多少人感兴趣)。我开心是因为这发生在很早以前,那时的计算器可不像现在的那样能够很快的一下就给出答案,它们还得有个计算过程,一边计算一边闪烁个不停,好像在对你说:

瞧,我还活着,这次计算我只用10秒钟就能完成,同时我还能对你眨眼睛,告诉你我已经完成了多少工作。

这一点非常有意思,比现在的计算器令人兴奋多了,因为现在的玩意儿在计算简单问题时全然不费力气。而当早期的计算器计算时,你知道它们正在辛苦地工作,并且这一点可以一目了然地看出来。

计算机

我已经记不清我第一次见到真正的计算机是什么时候了,但肯定是在十一岁左右。

那大概是在1981年,当时我外公抱回来一台崭新的Commodore VIC-20计算机。由于我曾在那台老计算器上玩过好长一段时间,所以见到新的计算机时肯定特别兴奋,并且迫不及待地想试一试。然而,我已经记不起当时真切的情形了。

VIC-20是最早的家用计算机之一。它不需要自己组装,你只须把它和电视连接上,打开,它便开始工作了。电视屏幕的上方会显示出大写字母“已准备好”的字样,然后是一个一闪一闪的光标,在等着你开始操作。

最大的问题是,当时在个人计算机上你没什么可做的事情,尤其是在早期,开发商业程序的条件在当时并不具备,你能做的唯一的事情就是在它上面用BASIC语言编程序。我外公当时就是这么干的。

我外公把这个新家伙仅仅看作是个玩具而已,同时也是一台升级的计算器。它不仅在求正弦值等方面比老式的电子计算器快得多,而且你还可以让它自动地反复执行同一条指令。这样,我外公可以用它在家里完成一些过去只能在大学的大型机上完成的事情。他也希望让我分享他的快乐,并试图让我对数学感兴趣。

于是我就坐在他的膝盖上,替他输入他事先仔细地写在一张纸上的程序,因为我外公很不习惯直接在键盘上敲打。我不知道有多少不到十岁的孩子会坐在他们祖父的房间里,学习怎样简化数学公式,然后把他们正确地敲进计算机里去,但是我记得我自己是这样干的。

而后我又开始阅读电脑操作手册,并尝试将里面的示范程序输入进去。手册里有一些简单游戏的示范程序,你可以尝试着自己编进去,如果你没有出错,屏幕上就会出现一个人横穿走过的图像,画面比较差。而且你还可以稍作修改,让人形图像穿过屏幕时,出现各种不同的背景颜色。只要你做,你就可以做到。

这种感觉棒极了。然后,我开始自己写程序。但是,我编写的第一个程序与其他人编写的第一个程序没什么不同。

10 PRINT “HELLO”

20 GOTO 10

它将严格按照你所期待的那样去做,屏幕上显示出一行又一行的“HELLO”,并且无休无止,除非你因为厌烦而中止它。

芬兰的严冬

第一个将脚印踏在芬兰雪地上的最重要的瑞典人是亨利主教,他被天主教会于1155年派往芬兰。那些传教士占据着芬兰所有的城堡以抵抗俄国人,并最终战胜了我们东边的帝国,赢得了这场争夺芬兰控制权的斗争。

在后来的几个世纪里,为了促进芬兰殖民地人口的增长,瑞典政府给予在芬兰的瑞典人以土地和减税等激励。瑞典人的统治一直延续到1714年,接着是芬兰被俄国人接管七年的短暂插曲,之后瑞典人再次将它夺了回来。直到1809年俄国和拿破仑对芬兰发起进攻,芬兰又落入俄国的统治中,一直到1917年十月革命爆发为止。

早期瑞典移民的后裔如今在芬兰达到35万人,他们都讲瑞典语,占总人口的7%,这其中也包括我的怪癖的家庭。让我给你们描述一下芬兰吧。

在十月的某段时间,天空一直笼罩着令人难受的雨雪天气前的那种灰黑色,你每天起床时面临的都是这种预料中的黑暗天空。然后,寒冷的雨水将夏日的一切痕迹都冲洗得干干净净。降雪似乎可以创造奇迹,它给大地万物罩上一层非常明亮的外衣,洗刷掉漫天阴霾,给人们带来振奋和乐观。

这乐观情绪短暂得只能维持几天,因为接下来的是透骨的寒冷。即使是严寒过去之后,积雪在几个月之内都不会融化。然而,我却有一个可以让我度过寒冬的室内运动——编写程序。

这样的时候,我外公多半在我身边,他也不在乎他不在时我呆在他的房间里。我向他讨钱买来了第一本电脑书,但所有的文字都是英文,我还必须翻译书中的语言,而要理解用一个你不太熟悉的语言所表达的技术术语并非易事。

我也用我的零花钱购买电脑杂志,其中有一本写着关于莫尔斯电码的程序。而这个特殊程序的特别之处在于,它并非用BASIC语言写成,而是由一组数字写成,这些数字可以用手工方式将其转变为计算机可以读懂的许多0和1。

当时有一些程序,能把人们可读的数码转换成电脑看得懂的0和1,但我并不晓得有这样的程序。于是我就开始用数字形式编写程序,然后再用手工进行转换,这就是用机器语言编程序,这样做时,我便开始做起了我过去以为是完全不可能的事情。

我外祖父在把电脑介绍给我的四年后,得了脑血栓并且半身不遂。虽然他是我最亲的人,但在当时对我的影响并不太大,或许是我还太年轻而不那么敏感的缘故。

外公死后,他的电脑就成了我的生活伴侣。关于这一点没有什么更多可说的。

进入大学

中学时代这四年,我基本上是坐在电脑面前度过的。

当然还有上学。诺斯高中,它是赫尔辛基五所讲瑞典语的中学之一,坐落在市中心,离我家很近。我们的高中和大多数美国城市中的学校差不多,并不是为那些特别聪明和雄心勃勃的孩子们设立的。芬兰并不希望把孩子们分成等级,或把优秀生和差等生隔离开来。

然而,每个学校都有一个特有的专业,虽然它不是必修课,但你在其他学校却学不到。就我所在的中学来说,其特殊的专业是拉丁文。

中学毕业时,我头上戴着一顶白色毛茸茸的挂着黑穗的帽子。毕业典礼上,他们把文凭发给我,然后我就回家。所有的亲戚都在那里等着你,到处都是香槟、花卉和蛋糕。此外,全年级还要在当地的一家餐厅里举行庆贺聚会。

我上大学第一年成绩斐然,需要拿到的学分我都拿到了。然而,我仅仅在第一年收获颇丰,也许是新的环境让我感到特别兴奋,或是因为突然拥有了深入学习某些学科的机会,再不然就是读书使我感到很舒服。那时还没有选择专业,最后计算机成了我的主修课,数学和物理是辅修。

我的问题之一是,在整个赫尔辛基大学,除我之外,希望主修电脑的讲瑞典语的学生只有一个,他名叫拉尔斯·韦尔泽尼斯。我们俩参加了一个为讲瑞典语的理科学生举办的组织,这个俱乐部的盛况都是由学“硬科学”的学生们组成的,比如物理和化学。顺便提一句,成员都是男生。

我们俱乐部的房间和另一个组织共同使用,那个组织是为讲瑞典语的主修“软科学”的学生建立的,比如生物和心理学。因此,我们有机会和女生们交往,尽管我们当中的许多人在这方面显得笨手笨脚——不,我们所有人都如此。

Tanenbaum的MINIX

每个人都会有一本改变其一生的书籍,比如《圣经》、《资本论》、《星期二和莫瑞在一起》、《我想知道我在幼儿园里学到的一切》,等等。把我推向生命高峰的是安德鲁·塔南鲍姆写的《操作系统:设计和实现》。

我已经选好我的秋季课程,其中最让我期待的是C程序语言和UNIX操作系统。在等待着上课期间,我还买了一本上面提到的教科书,希望能先读一下。

在这本书中,住在阿姆斯特丹的大学教授塔南鲍姆讨论了MINIX,那是他为UNIX撰写的教学辅助软件,MINIX也是UNIX的小型翻版。一旦读完了介绍,了解到UNIX背后的理念以及那个强大、利索、漂亮的操作系统所能做到的事情后,我便决定弄一台机器来操作UNIX。我将操作MINIX,那是我所能找到的惟一版本。

我特别渴望操作UNIX,将我从塔南鲍姆书上所学到的东西进行试验。但是,我无法凑齐一万八千芬兰马克买一台386。通过阅读和对UNIX的了解愈来愈深,我的热情高涨起来。说实话,我的热情从来没有低落过(我希望你在做某件事时也能说出同样的话)。

UNIX具有程序的观点,凡是做任何事情都是一个进程。shell command是为进入操作系统而键入的一种命令,在UNIX中,它并不像在DOS中似的被装在操作系统里。它只是一个任务,同其他的任务相同,这个任务是从你的键盘中读出的,然后再写回到显示器。任何能做事情的东西在UNIX里面都是一个程序,此外还有文件。

在UNIX上完成的大部分任务都是通过六个基本操作完成的,它们被称作“系统调用”,因为它们是你对操作系统的调用,你便让它为你完成任务。

  • 创建子进程(fork):当一个程序创建子进程时,它便把自身完全复制出来,这样你就有了两个相同的拷贝。
  • 执行另一个程序(exec):用一个新项目替换自己,这便是第二个基本操作。
  • 文件操作(open、close、read、write):打开、关闭、读和写,都是为了访问文件。

当然,从细节方面讲,还有数不清的其他系统调用。然而,一旦你明白了这六个基本系统调用,你就理解了UNIX。UNIX的好处之一是,你只需在简单的程序之间创造出交流渠道,在UNIX中叫做“管道”,就能解决复杂的问题。

一小堆简单基本的建筑材料,结合起来就能创造出无限的复杂表述。物理的规则亦是如此,你努力找出基本的规则,而这些规则都是相对简单的。从那些简单的规则中,通过相互作用可以产生令人不可思议的复杂性。

那种简单的设计并非是自然产生的。UNIX是在美国电报电话公司的贝尔实验室中,丹尼斯·里奇和肯·汤普森花了很大力气设计完成的。你也不能认为简单就是容易,简单需要特别的设计和很高的品味。

Linux的诞生

1991年1月2日。在我的日历上,圣诞节和我的二十一岁生日,是两个最重要的能让我得到金钱的日子,而这一天是这两个日子之后商店开门的第一天。

我手里攥着在圣诞节和生日得到的钱,做出了一个重大的财政决定——准备买一台价格一万八千芬兰马克的计算机,这差不多等于三千五百美元。我没有这么多钱,所以打算首付三分之一,剩下的用赊账方式来付。

我去的是一家小店,也就是那种夫妻店,只是我去的这家只有丈夫,没有妻子。我对生产厂商不太在乎,所以决定买一台杂牌的,装在一个白色大箱子里的电脑。

这台电脑有一个DOS操作系统。我想使用UNIX的变体MINIX,所以我订了货,然而这个操作系统需要等一个多月的时间才能到达芬兰。操作系统的价格是一百六十九美元,再加上税,还有别的什么费用。当时我觉得这简直太不可思议了,坦白地说,我今天仍旧这样认为。

MINIX终于在一个星期五的下午到了,当天晚上我便将其装了上去,你得用十六张软盘才能把这个软件装入计算机。然后整个周末就都花在了熟悉这个新系统上。

MINIX有一些性能令我很不满意,其中最大的失望是终端仿真。终端仿真很重要,因为我只能依赖这个程序,才能让我家里的电脑模仿大学的电脑。每当我拨电话接通大学的电脑,使用强大的UNIX工作或仅仅是上网时,都使用终端仿真程序。

于是我开始做一个项目,制作自己的终端仿真程序。我不想在MINIX底下做这个项目,而是想在硬件水平上完成它。这个终端仿真项目也是一个很好的机会,可以让我了解386硬件的工作性能。

我不得不从BIOS开始。BIOS是计算机启动的ROM编码,它可读软盘和硬盘,所以这次我在软盘上操作,它读出软盘的一个扇区并跳转到那里。这是我的第一台PC,我不得不学着如何进行这种操作。386是以“常规模式”启动的,但为了充分利用全部的CPU和进入32比特模式,你只得进入“保护模式”。在此之前,你得进行大量的复杂的测试。

为了制作仿真程序,你需要了解CPU是怎样工作的。其实,我用汇编语言的部分原因就是为了了解CPU。你还需要了解的事情包括——怎样写入显示器,怎样读键盘输入,怎样读写调制解调器。但愿我的这些文字不会把非电脑迷们吓跑。

我想出两条独立的线程。一条线程从调制解调器读出,然后在显示器上显示;另一条线程从键盘上读出,然后写入调制解调器。这样就会在两条线程上运行着两条管道,这叫做任务转换,386有支持这一程序的硬件。

我写的最早的试验程序是使用一个线程将字母A写到显示器上,另一个线程写B。在定时器的帮助下,我使这个程序这样运转——显示器上先出现一连串的字母A,然后突然之间,转变成一连串的字母B。从实际的角度看,这是一个完全没有任何用处的练习,但却是一个很好的方式,显示出我的任务转换是可行的。最终,我便能改变由一连串A和一连串B组成的两个线程,从而使数据一个读自调制解调器,再写入显示器,另一个读自键盘,再写入调制解调器。

我把自己的软盘插入,重新启动机器,就能从大学的计算机里读新闻了;倘若我想改进终端仿真程序,我就启动MINIX,用它进行编程。对此我感到非常骄傲。

Linux操作系统就是这样开始的。