李纳斯认为,Unix 是一个简洁、干净的操作系统,在 Unix 上的大部分任务都是通过一些基本操作完成的,这些操作被成为“System Call”,顾名思义,这些操作就是你对系统的呼叫,系统通过响应你的呼叫完成工作。比如 fork、clone(创建子进程),比如 open、close、read、write(文件访问)。这些基本的系统调用通过组合可以完成大部分功能。同时,Unix 还提供了极为强大的IPC(进程间通信)方式:pipe(管道)。很多工作在GUI(图形界面)软件环境下的读者,最常用的IPC操作可能是复制、粘贴、 鼠标拖拽,这些操作虽然简单,但是必须由人来完成,想要自动化就很困难。而这些在 Unix 上实现起来就像大自然一样自然,你只需要在程序之间开辟出一段缓冲区作为管道,然后父进程和子进程就可以通过这个管道实现进程间通信了。举个例子,以前给 大家介绍的查找历史命令的脚本,就利用了管道的功能,如下: history | grep apache 这行命令的含义就是查找包含 apache 的历史命令,其中特殊字符【 | 】用来告诉命令行解释器(Shell)将前一个命令的输出通过“管道”作为接下来的一行命令的输入,就这样,一个简单的进程间通信就完成了。 总之,李纳斯在读完这本书之后,就像郭靖修习了九阴真经全本一样,对机器和代码的世界有了更为透彻的认知,接下来的事情就是等待一个打造传奇的机会。 等待的过程中,李纳斯也没闲着,他又开始编程了。好的程序员对编程的喜爱是溢于言表的,以下摘录一些李纳斯的编程感想: 对于喜爱编程的人来说,编程是世界上最有趣的事,比下棋有趣得多!因为你可以自己制订游戏规则,而你制定什么样的规则,也就会随之出现与此规则相符合的结果。 在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝――在一个较小的层面上。 你可以建筑一个这样的房子,有一个活板门,既稳固又实用。但是每个人都可以看出一个仅仅以坚固实用为目的的树上小屋和一个巧妙地利用树本身特点的美妙小 屋之间的差异。这是一个将艺术和工程融为一体的工作。编程与造树上小屋有相似之外……在编程中,实用的考虑往往被置于有意思、美观优雅或有震撼力的考虑之后。 在代码的世界里,李纳斯就是一个诗人! Unix 始于上个世纪60年代,在70年代得到了迅猛的发展,这时候的李纳斯还躺在祖父公寓里的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚,出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现。真实的情况是,Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子、头发纷乱的芬兰小子长大,然后一决高下。李纳斯赢得了自己的时间,他一刻不停的磨练自己的技艺,在 清晨的微光中练习算法,在赫尔辛基的雪山上编译代码,随时随地补充的粮草和武器。二十一年之后,李纳斯抚着雪亮的刀锋上路了,他要去追寻属于程序员的最高荣耀。 1991年一月,李纳斯花费了三千五百美元,分期付款购买了一台杂牌组装电脑,内存4兆,CPU 33兆赫,还有一台14英寸的显示器,然后又买了 MINIX 操作系统,用十六张软盘把这个操作系统装到了计算机里。之后,李纳斯又用了一个月的时间,了解了 MINIX 的好和不好,并把这个系统改装成了自己得心应手的“战斗机”,开始了战斗的人生。就是在这台电脑上,催生了 Linux 的初始版本。 Linux 的诞生离不开 MINIX,MINIX 是 Mini Unix 的缩写,是 Andy Tanenbaum 教授编写的迷你版的 Unix 操作系统,源代码可以提供给大学和学生,用于操作系统教学,采用了微内核设计。其中的代码还作为《操作系统:设计与实现》的示例程序,这本书我们在 Linus(三)中提到过,给了李纳斯极大的启发。 李纳斯使用了 MINIX 之后,发现这个系统有很多缺陷,比如性能问题、内核问题、文件系统问题,最大的问题是终端仿真器,也就是我之前总提到的 Terminal,登录学校里的 Unix Server 和上网时,李纳斯都需要终端,但是 MINIX 无法满足这个需求。如果普通人遇到这种问题,估计就是发会呆然后洗洗睡了,或者说“你行你上啊”,李纳斯不是普通人! 他决定抛开 MINIX,从硬件层面开始,重新设计一个终端仿真器。牛人就是不同凡响,这个决定表明了李纳斯需要从 BIOS、CPU等硬件层面重新开发出一套系统,除此之外,还需要了解如何把信息写入显示器,如何读取键盘输入,如何读写调制解调器,早期储备的汇编语言 和 C 语言能力终于派上了用场…… 两个月之后,终端仿真器完成,对此李纳斯非常骄傲: 对于我了不起的成就,萨拉(妹妹)是了解 的。我把终端显示给她看,她盯着显示器看了大约五秒钟,看着上面是一串A和一串B,说了声“很好”,然后就没有然后了。我意识到我的成就并不辉煌,这犹如 你指给人看你铺设的一条长长的柏油马路,但想向别人解释这条马路的意义是完全不可能的。 当时是三月,也可能是四月,就算彼得盖坦街上的白雪已经化成了雪泥我也不知道,当然我也并不关心。大部分时间我都穿着睡衣趴在相貌平平的计算机前面噼噼啪啪的敲打键盘,窗户上的窗帘遮得严严实实,把阳光和外部世界与我隔离开来。 Linux 操作系统就这样开始了,一发不可收拾。李纳斯的当时编程状态是这样的:编程――睡觉――编程――睡觉――编程――吃饭――编程――睡觉――编程――洗澡――编程…… 实现了终端仿真器之后,李纳斯马不停蹄,开始添加磁盘驱动和文件系统,那一年李纳斯还在上课,但是课程很简单,他唯一的课外活动就是参加每周三晚的同学 聚会,这个长着大鼻子的技术天才,常常会因为担心自己缺乏社交能力和容貌丑陋而失眠,对那时的他来说,唯一有趣的事情就是把驱动程序写出来。于是他咬咬牙 对自己说,还得干下去。(看来没有女神的好处就是可以写个操作系统出来,然后把自己叫做上帝)。 随着工作的进展,终端仿真器正在开始向一个操作系统的方向发展,李纳斯显然也看清楚了这一点。 在整个创造 Linux 的过程中,我们没有看到李纳斯使用了什么样高级工具,估计那时也没有,整个系统基本上是一行行代码敲出来的,纯手工打造,这些先贤的编程功底和效率让我们 叹为观止,所以,现在,我决定打开终端,输入 vi,然后键入:to be continued,感受一下李纳斯当年编程的风采…… 随着李纳斯不断的敲击键盘,他的终端仿真程序也不停的扩张,从刚开始的小树苗长成了一株盘根错节的大树,树根牢牢的抓住土地,枝丫努力的伸向天空,花朵和果 实开始在高远的天空中烁烁发光,所有的细节都在李纳斯的掌控之中。懂行的技术人员都看得出来,这个大鼻子的芬兰小子是准备开发一个操作系统啊。 是年6月份,李纳斯基本确定了要开发一个操作系统内核的计划,并开始着手搜集 Unix 操作系统标准的相关资料。1991年7月3日,格林威治时间上午10点钟,李纳斯在 MINIX 新闻组发出了一封求助邮件,寻求有关 Posix 标准的帮助,他在邮件中写道: 目前我正在 MINIX 系统下做一个项目,对 POSIX 标准很感兴趣。有谁能向我提供一个机器可读的最新的 POSIX 规则?如果能有个 FTP 地址就更好了。 这份公开的邮件是标识 Linux 问世的最早证据。邮件发出后不久,有人就寄来了厚厚的 POSIX 标准,同时赫尔辛基工学院的 Ari Lemke 也对李纳斯的邮件做出了响应,为李纳斯提供了一个 FTP 地址,用来上传他即将完成的操作系统。 注:POSIX 全称是可移植操作系统接口(Portable Operating System Interface)。IEEE 最初制定 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。随着技术的发展,POSIX 开始不局限于 UNIX 系统,后续的 Linux 和 Windows NT 都部分的遵循了该标准。POSIX 在李纳斯开发的过程中起到了灯塔的作用,直接后果就是 Linux 系统从一开始就走在了正规军的康庄大道上,基本没有跑偏过。Linux 几乎可以适配各种类型的硬件体系结构。 标准和 FTP 地址都有了眉目,李纳斯开始实现各种 System Call,以便让 Shell 运行起来。这段时间的工作让李纳斯时常感到灰心丧气,看着增加的代码量,工作似乎前进了一大步,但是检验一下功能又仿佛没有任何进展。有时候他还不得不放 弃之前的想法和已经完成的代码实现,另辟蹊径重头再来,即使是在天才面前,代码也能让人欢喜让人忧。 终于 Shell 已经可以在新的操作系统上工作了,李纳斯开始编写拷贝(cp)和列表(ls)等程序。Shell 程序一旦完成,就好像完成了从0到1的飞跃,一切都变得无比顺利,李纳斯面前仿佛出现了一条阳关大道,一切都豁然开朗了,他说,要有光,于是就有了光。对 于这种状态,李纳斯表示:“我很满意”,并且开始用“Linux”称呼这个操作系统。 这种满意非常重要,因为那个夏天李纳斯除了伏在电 脑面前噼噼啪啪的敲击键盘,什么都没做。芬兰四月到八月的日子是一年中最美好的时光。人们到布满小岛的海上航行,去海滩上晒日光浴,到夏日小木屋中消遣时 光。但是李纳斯,他只是在永无休止的编写程序,忘记了白天和黑夜,黑色的窗帘遮蔽了灿烂的阳光,也遮蔽了外面的世界。他唯一的想法就是,得赶紧把这该死的系统做出来! |