周五了,我们聊聊有趣的事儿。
早在 Linux (1991年发布的)出现之前的二十年 ( 大约在上个世纪70 年代 ), 就有一个相当稳定而成熟的操作系统已经存在了!那就是 Linux 的老大哥『 Unix 』呀!怎么这么说呢,他们这两个家伙有什么关系呀?
不急,且听我慢慢道来!众所皆知的, Linux 的内核是由 Linus Torvalds 在 1991 年的时候给开发出来的, 并且丢到网上供大家下载,后来大家觉得这个小东西 ( Linux Kernel ) 还不错,所以慢慢的,就有很多朋友开始研究他了!
为什么他这么棒呢?又为什么大家都可以免费下载呢?且听我慢慢的道来。
一. 1969 年以前:一个没有完成的梦想:Bell, MIT 与 GE 的『 Multics』系统
早期的计算机并不像现在的个人电脑一样,他可不是一般人碰的起的,除非是军事或者是高科技用途,或者是学术单位的研究,否则,真的很难接触到。非但如此,早期的计算机架构还很难使用,除了运算速度并不快之外,操作接口也很困扰的!在那个时候,写程序是件很可怜的事情,因为,程序员必须要将程序相关信息在读卡纸上打洞, 然后再将读卡纸插入卡片阅读机,最后将信息读入主机中。光是这样就很麻烦了,如果程序有bug,哈哈!光是重新打卡就很惨,加上主机少,使用者众多,光是等待,就耗去很多的时间了。
慢慢的,经由操作系统的改良,程序员可以用键盘输出了。 不过,那时在一所学校里,主机可能只有一部,如果多人等待使用,那怎么办?好在 上个世纪60 年代初,麻省理工学院开发了所谓的:『兼容分时系统』, 它可以让大型主机透过提供多个终端机,来联机进入主机,利用主机的资源进行运算。架构有点像这样:
如此一来,无论主机在哪里,只要在终端机前面进行输入输出,就可利用主机提供的功能了。不过,需要注意的是,此时终端机只有输入/输出的功能,本身没有运算的能力。而且,比较先进的主机大概也只能提供 30 个不到的终端机而已。
为了增强大型主机的系统,在1965 年前后,由贝尔实验室 、麻省理工学院 以及奇异公司,共同发起了 Multics 计划,其目的是想要让大型主机,可以达到提供 300 +个终端机联机使用的目标。不过,到了 1969 年前后,计划进度落后,资金也短缺,所以该计划就泡汤了。看来成功的确不易啊,得有天时地利与人和啊。
二. 1969 年:Ken Thompson 的小型 file server system
在认为 Multics 计划不可能成功之后,贝尔研究室就从该计划中溜了。不过,原本参与 Multics 计划的人员中,已经从该计划当中获得一些点子的 Ken Thompson ,他因为自己的需要,希望开发一个小小的操作系统。在开发时,有一部 DEC (DigitalEquipment Corporation) 的 PDP-7 没人用了,哈哈哈,被Thompson盯上了,于是他就摩拳擦掌,准备针对这部主机,开发操作系统内核。本来 Thompson 是没时间的,凑巧的是,在1969 年八月份左右,Thompson媳妇去美西探亲了。于是,他有了额外的一个月来捣鼓他的操作系统。经过四个星期的奋斗,终于,他用组译语言 (Assembler) 开发了一个操作系统,同时还写了一些核心工具以及一个文件系统。其实这就是Unix 的原型了!
发现个有意思的事儿,凡是做出突出贡献的人,一般都是在大把空闲时间下搞出个牛逼的东西,像牛顿在老家躲避鼠疫的几个月里,发现了万有引力。爱因斯坦在专利局的工作,可谓是闲的不行,人家弄出好多篇极具革命性的论文。刘慈欣在娘子关电厂,也是闲的不行,人家弄出个《三体》来。想想,自己是不是该给自己空些时日,只有闲了,才可能深度思考,别再穷忙穷忙了。自勉和共勉。
三.1973 年:Unix 的正式诞生,Ritchie 等人以 C 语言写出第一个正式 Unix 核心
由于 Thompson 写的那个操作系统实在太好使了,所以在贝尔实验室内部广为流传,并且经过多次迭代改版。但是,比较重要的改版则发生在 1973 年。Unix 本来是用组译语言写的,后来因为系统移植与效能的需求, 该系统被 B 语言所改写。不过,效能依旧不是很好。再后来,DennisRitchie 将 B 语言重新改写成 C 语言,C 语言算是比较高阶的程序语言,可以在不同的机器上运行, 而 Ritchie 等人,也同时将原本 Thompson 的那个操作系统用C 语言重写, 最后,正式发布Unix!
在这个时候需要特别注意的是,贝尔实验室是隶属于 AT&T 的,只是 AT&T 当时忙于其它商业活动, 所以对于 Unix 是采取比较开放的态度,此外, Unix 在这个时期的发展者都是贝尔实验室的工程师, 这些工程师对于程序当然相当有研究,所以, Unix 在此时当然是不容易被一般人所接受的!此外,由于 Unix 是用比较高阶的 C 语言写的,相对于组译语言需要与硬件有密切的配合, 高阶的 C 与硬件的相关性就没有这么大了!所以,这个改变也使得 Unix 很容易被移植到不同的机器上。
四. 1977 年:重要的 Unix 分支:BSD诞生
前面说到,虽然贝尔属于 AT&T ,但是 AT&T 此时对于 Unix 是采取开放的态度, 此外, Unix 是用高阶的 C 语言写的,理论上是具有可移植性的!所以,只要取得 Unix 的源码,并且针对大型主机的特性,加以修订Unix, 就可以将 Unix 移植到不同类的机器上了。所以在 1973 年以后, Unix 便得以与学术界合作开发!
最重要的接触就是与加州伯克利大学的合作了。伯克利的 Bill Joy 在取得了 Unix 的核心源码后,着手将其修改成适合自己机器的版本, 并且同时增加了很多工具和编译程序,最终将他命名为 Berkeley Software Distribution (BSD) 。这个 BSD 是 Unix 很重要的一个分支, Bill Joy也是『 Sun 』这家公司的创办者!Sun 公司就是以 BSD为核心,进行自己的商业Unix的开发的。(后来可以安装在 x86 硬件架构上面 FreeBSD,就是由BSD 改版而来的)
五.1979 年:一个措手不及的版权宣告!
由于Unix 的高度可移植性与强大的效能,加上当时并没有版权的纠纷, 所以让很多商业公司开始了 Unix 操作系统的发展,例如 AT&T 自家的 System V、IBM 的 AIX 以及 HP 与 DEC 等公司,都有推出自家的主机搭配自家的 Unix 操作系统。 但是,如同我们前面提到的,操作系统的内核必须要跟硬件配合, 以提供及控制硬件的资源进行良好的工作。
而在早期每一家生产计算机硬件的公司还没有所谓的『协议』的概念, 所以每一个计算机公司出产的硬件自然就不相同啰!因此他们必须要为自己的计算机硬件开发合适的 Unix 系统。例如在学术机构相当有名的 Sun 、 Cray 与 HP 就是这种情况。
他们开发出来的 Unix 操作系统以及内含的相关软件,并没有办法在其它的硬件架构下工作的。且由于没有厂商针对个人计算机设计 Unix 系统,因此,在早期并没有支持个人计算机的 Unix 操作系统的出现 ( 由于 Unix 强调的是多人多任务的环境,但早期的 x86 个人计算机架构下的 CPU 是没有能力达到多任务的作业,因此,并没有人对移植 Unix 到 x86 的计算机上有兴趣 )。每一家公司自己出的 Unix 虽然在架构上大同小异,但是却真的仅能支持自身的硬件, 所以啰,早先的 Unix 只能与服务器或者是大型工作站划上等号。
但是这个高度开放的 Unix 系统,在1979 年有了重大的转折。 因为 AT&T处于商业考虑,以及在当时现实环境下的思考,于是将想 Unix 的版权收回去, 因此,AT&T 在 1979 年发行的第七版 Unix 中,特别提到了 『不可对学生提供源码』的严格限制!同时,也造成 Unix 业界之间的紧张气氛,并且也引爆了很多的商业纠纷。
六.1984 年之一:x86 架构的 Minix 诞生
关于 1979 年的版权声明中,影响最大的当然就是学校教 Unix 相关学问的教授了。想一想,如果没有核心源码,那么如何教学生认识 Unix 呢?这问题对于 Andrew Tanenbaum (谭宁邦)教授来说,实在是很伤脑筋的!不过,学校的课程还是得继续啊!那怎么办?
既然 1979 年的 Unix 第七版可以在 Intel 的 x86 架构上面进行移植, 那么是否意味着可以将 Unix 改写并移植到 x86 上面呢?有了这个想法, 于是,谭宁邦自己动手写了 个类Unix内核:Minix。在搬砖的过程中,为了避免版权纠纷,谭宁邦完全不看 Unix 核心源码,并且强调他的 Minix 必须能够与 Unix 兼容才行。1984 年谭宁邦开始动工, 到了 1986年终于完成,并于次年出版 Minix 相关书籍,同时与新闻群组相结合。
这个 Minix 版本比较有趣的是,他并不是完全免费的,无法在网络上提供下载。必须要通过磁盘或者磁带购买才行。虽然真的很便宜,不过,毕竟因为没有在网络上流传, 所以Minix的传播速度并没有很快。此外,购买时,随磁盘还会附上 Minix 的原始码。这意味着使用者可以学习 Minix 的核心程序设计概念。此外,搬砖者只有谭宁邦教授一个人,因为学者很忙啊!加上谭宁邦始终认为 Minix 主要用在教育用途上面, 所以对于 Minix 是点到为止。尽管Minix 很受欢迎,但是使用者的呼声没能上升到很高的地方。这样说,你明白了吧~
七.1984 年之二:GNU 与 FSF 计划的成立
Richard Mathew Stallman (史托曼) 在 1984 年发起的 GNU 计划,对于现今的自由软件风潮, 具有不可磨灭的地位!目前我们所使用得很多自由软件,几乎均直接或间接源于GNU。 那么史托曼是何许人也?为何他会发起这个 GNU 计划呢?
Richard Mathew Stallman (生于 1953 年, 网络ID 为 RMS) 从小就很聪明,他在 1971年的时候,进入黑客圈中相当出名的人工智能实验室, 这个时候的黑客专指计算机功力很强的人,而非破坏计算机的 cracker。当时的黑客圈对于软件的着眼点几乎都是在『分享』,所以并没有专利方面的困扰!这个特色对于史托曼的影响很大。不过,后来由于管理阶层的问题,导致实验室的优秀黑客离开了实验室,进入其它商业公司继续开发优秀的软件。但史托曼并不服输,仍然坚持就地搬砖。后来,他发现,一个人无法完成所有的工作,于是想要成立一个开放的团体来共同努力!
1983 年以后,因为实验室硬件的更换,使得史托曼无法继续以原有的硬件与操作系统,继续自由程序的编写了。 而且他进一步发现到,过去他所使用的 Lisp 操作系统,是麻省理工学院的专利软件, 是无法共享的,这对于想要成立一个开放团体的史托曼是个绊脚石。于是他便放弃了 Lisp 这个系统。后来,他接触到了Unix,并且发现 Unix 在理论与实际上,都可以在不同的机器间进行移植。于是他转而开始投奔Unix。因为 Lisp 与 Unix 是不同的系统, 所以,他原本已经写好的软件,是无法在 Unix 上运行的。为此,他开始将软件移植到 Unix 上。并且为了让软件可以在不同平台上运行, 史托曼将他开发的软件都编写成可移植的形态。
1984 年,史托曼开始 GNU 计划,这个计划的目的是想要:建立一个自由的开放的 Unix 操作系统。但是建立一个操作系统谈何容易啊!而且在当时的 GNU 是仅有史托曼他自己一个人啊。 这实在太麻烦,但又不能不做这个计划,于是史托曼反其道而行。『既然操作系统太复杂, 我就先写可以在 Unix 上面运行的小程序,这总可以了吧?』在这个想法上, 史托曼便开始了他的搬砖之路。在此期间,为了不让自己吃上官司,他绝对不看专利软件的源码。为了这个计划,他开始使用原本 Unix 上面跑的软件, 并自行编写功能与 Unix 原有专利软件相仿的软件。
但不论是什么软件,都得要进行编译成为二进制文件后才能够执行, 因此他便开始编写C 语言编译器,那就是现在大名鼎鼎的 GNU C (gcc)了。这个点相当的重要,因为 C语言编译器版本众多,但都是专利软件, 如果他写的 C 编译器够棒,效能够佳,那么将会大大的让 GNU 计划出现在众人眼前。
但开始时并不顺利,为此,他先转而将 Emacs 编辑器写成可以在 Unix 上跑得软件, 并开源出来,因为 Emacs 太优秀了,因此,很多人便直接向他购买。此时 Internet 尚未流行, 所以,史托曼便借着 Emacs 以磁带出售,赚了一点钱 ,进而开始全力开发其它软件。并且成立自由软件基金会 (FSF, Free Software Foundation),请更多工程师一起搬砖。终于还是完成了 GCC,这比 Emacs 还更有帮助。此外,他还写了C 函式库(GNUC library), 以及BASH shell 。这些都在 1990 年左右完成的。
到了 1985 年,为了避免 GNU 所开发的自由软件被其它人所利用,进而成为专利软件, 所以他与律师草拟了有名的通用公共许可证 (General Public License, GPL), 并且给他起了个名字:copyleft (相对于专利软件的 copyright)。在这里,必须要说明的是, 由于有 GNU 所开发的几个重要软件,如:
-
Emacs
-
GNU C (GCC)
-
GNU C Library (glibc)
-
Bash shell
后来很多程序员可以借由这些基础的工具来进行程序开发,进一步壮大了自由软件团体。这很重要的。不过,对于 GNU 的最初构想 『建立一个自由的 Unix 操作系统』来说,有这些优秀的程序是仍无法满足, 因为当下并没有『自由的Unix 的内核』。所以这些软件仍只能在那些有专利的 Unix 平台上工作,直到 Linux 的出现。
八.1988 年:图形接口 XFree86 计划
由于GUI ( Graphical User Interface) 的需求日益加剧,1984 年由 MIT及其他厂商首次发表了 X Window System ,并在 1988 年成立了非营利组织:XFree86 。所谓的 XFree86 其实是 X Window System + Free + x86 的整合名称。
九.1991 年:芬兰大学生 Linus Torvalds 的一则简讯
到了 1991 年,芬兰的赫尔辛基大学的 Linus Torvalds 在 BBS 上面贴了一则消息, 宣称他用bash, gcc 等工具写了一个小小的核心程序,这个核心程序可以在 Intel 的 386 机器上面运行,他的出现让众人很感兴趣。从此开启了 Linux 的非凡之路。
众所周知,Linux 是由 Torvalds 这个芬兰人发明的。那么为何托瓦兹可以发明 Linux呢?凭空想象而来的?还是有什么渊源?
Linus Torvalds (托瓦兹, 1969 年人)的外祖父是赫尔辛基大学的统计学家, 他的外祖父为了让自己的小孙子能够学点东西, 所以从小就将托瓦兹带到身边来管理一些微计算机。在这个时期,托瓦兹接触了汇编语言 (Assembly Language),那是一种直接与芯片打交道的语言,也就是所谓的低级语言。必须要很了解硬件的架构,否则很难用汇编写程序的。
在 1988 年间,托瓦兹顺利的进入了赫尔辛基大学,并选读了计算机科学系。在就学期间,因为学业的需要与自己的兴趣,托瓦兹接触到了 Unix 这个操作系统。当时整个赫尔辛基只有一部最新的 Unix 系统,同时仅提供 16 个终端机 (terminal)。还记得我们上一节刚刚提过的,早期的计算机仅有主机具有运算功能, terminal 仅负责提供 Input/Output 而已。在这种情况下, 实在很难满足托瓦兹的需求。
光是等待使用 Unix 的时间,就很耗时,为此,他不禁想到:『我何不自己搞一部 Unix 来玩?』不过, 就如同 Stallman 当初的 GNU 计划一样,要写核心程序,谈何容易~ 不过,幸运之神并未背离托瓦兹,因为不久之后,他就知道有一个类似 Unix 的系统, 并且与 Unix 完全兼容,还可以在 Intel 386 机器上面跑的操作系统, 那就是,谭宁邦教授为了教育需要而撰写的 Minix 系统。他在购买了最新的 Intel 386 的个人计算机后,就立即安装了 Minix 这个操作系统。另外,由于 Minix 这个操作系统是有附有源码的。所以,托瓦兹也经由这个源码,受益良多。
一部unix和linux历史终于写完了,错了,其实他们还在继续,愿他们越来越好。