1.3 前尘:Unix在Multics废墟上延续
本文介绍了Unix的发展历史,在编写的过程中参考了《鸟哥的Linux私房菜》和《Unix编程艺术》两本书,如有侵犯版权,请联系我邮箱;
本文仅供学习交流,禁止用于商业用途,转载请标明转载来源
- gocifer.github.io
- gocifer.gitee.io
# 3. 前尘:Unix
# 3.1 Linux是什么
之前提到过计算机系统的概念,计算机主机是由一堆硬件(计算器、存储器、输入输出设备)所组成的,而计算机操作系统的功能和意义在于让计算机管理员/开发人员和高级应用服务精确、高效的控制硬件资源。具体的体现是:
- 通过底层内核/驱动直接控制、管理、调用硬件;
- 通过提供一整组系统调用接口,来为程序设计师提供更容易开发/设计软件的环境;
而Linux的功能也就在于此,你可以通过交互界面(字符终端或者图形化界面)管理文件、内存、进程、磁盘等底层硬件,也可以通过Linux提供的C语言系统调用接口来设计出更加复杂的硬件资源管理程序(比如磁盘分区,文件管理器、进程检测),如下图所示,Linux就是系统内核和系统调用接口那两层:
图1.3.1 计算机操作系统的角色
操作系统&应用软件
从上图可以看到其实系统内核与硬件的关系非常强烈。早期的Linux是针对Intel 80386处理器来开发的,由于Linux只是一套操作系统(不包含其他的丰富的应用程序),因此工程师在下载、安装了Linux之后,也只有极其有限的操作——通知已经开始运行,等待使用者输入指令,并没有现在丰富的软件——邮件服务、web服务软件、编辑器、文件管理器、聊天工具、浏览器。
当时能够在Linux上运行的软件还很少,基本上工程师还要根据需求购买、编写软件,另外在Linux上安装他们要用的软件。
这里不可或缺的是GNU计划和自由软件基金会,正是得益于开源运动的兴起,Linux 操作系统才得以运行各种丰富的开源应用软件,所以也会完整称GNU/Linux。
此外不同硬件的功能函数并不相同,比如IBM的Power CPU与Intel的x86架构指令集是不一样的,所以同一套操作系统是无法在不同的硬件平台上运行的,比如你想要让x86上面跑的操作系统在Power CPU 上运行,需要从底层开始,针对每一项涉及的硬件功能函数修改操作系统程序代码才可以——软件移植。
例如 MacOS 10 一直运行在Intel芯片上,而 MacOS 11 要想运行在 苹果基于Arm 架构自主设计的A系列芯片,中间涉及到巨量的操作系统底层代码对CPU的修改,这个过程还伴随着很多系统调用接口的变迁,因此原有系统上的应用软件还必须修改源代码中的系统调用接口,经过重新编译才能完成整个移植的工作。
由于Linux操作系统是开源(Open Source)的,这意味着任何人可以获得、修改源代码以在各种机器上运行——这是Linux的可移植性。可移植性是Linux非常重要的功能,时至今日,Linux广泛支持了Intel、Arm、MIPS、Power CPU、RISC-V等不同架构的CPU。
# 3.2 前事不忘——Unix
前事不忘,后事之师,Linux的发展固然是1990年代计算机史书中最为波澜壮阔的一页,但其实早在Linux出现之前的二十年(大约在1970年代),就已经存在一个成熟稳定的操作系统——Unix,在很多上古程序员的集体记忆中,Unix的悠久历史和丰富多彩,是他们那个年代的津津乐道的谈资和趣味,时至今日,Unix的许多内容仍然以一种近乎神话的形式流传。那么Unix是何方神圣?Linux又是怎样在Unix的一手遮天下翻身?
# 1969前——狮心之火:Multics
早期的计算机并不想现在的个人计算机一样普遍,除非是军事或者高科技用途,或者是学术单位的前瞻性研究,否则一般人真的很难接触到。非但如此,早期的计算机架构的原始程度,恐怕亲历者也难以记清:除了处理器的运算速度很慢,那个时候最强大的计算机所拥有的计算能力和内存还不如最初代的IPhone手机;1960年代视频显示终端也才刚刚起步,直到1975以后屏幕终端交互的技术才得到广泛应用,因此那时输入设备只有读卡机、输出设备只有打印机。
在编程的蛮荒时代,程序设计者必须把写好的程序指令编号码,然后要将程序相关的信息在读卡纸上打洞,然后再将读卡纸插入读卡机来将信息读入主机中运算。
在那之后,由于硬件和操作系统的改良,使得后来可以使用键盘来进行信息的输入。不过,在一间学校里面,可能只会有一个主机,而一般使用者却很多,往往申请使用一次就需要排队等待很多时间。好在1960年代初期麻省理工学院(MIT)发展了相容分时系统(Compatible Time-Sharing System,CTSS),它可以让大型主机通过提供数个终端机(Terminal)以连线进入主机,利用主机的资源进行运算工作。
计算机科学家 John McCarthy (Lisp语言发明者)几乎是在1960年左右才首次发表了分时系统的构想,而直到Unix诞生前七年的1962年才第一次真正部署使用,当时的分时系统也只是处于实验阶段,像喜怒无常的野兽,性能极其不稳定。而且当时分时系统的主机功能很有限,比较先进的主机大概只能提供不到30个的终端机而已。
分时系统
相同分时系统可以说是近代操作系统的鼻祖,它将CPU的计算资源分成一个一个时隙,每个时隙处理不同终端输入的处理任务,由于时隙非常短,因此使用者不会感觉到明显的任务切换,感觉上依旧是自己独占了处理机的资源。在当时,这种分时系统的设计是一种划时代的技术。
为了更加强化大型主机的功能,以让主机的资源你可以提供更多使用者来利用,1964年,由美国通用电气公司(GE)和麻省理工学院(MIIT)发起了一个合资项目,该项目旨在开发一套能运行在 GE-645 等大型主机之上的多用户、多任务的分时操作系统,简称 MULTICS。
1965年前后,贝尔实验室(Bell Labs)派出开发人员 KenThompson 等也加入了该项目。
Multics的计划的目的是想要让大型主机可以达成300个以上的终端机连线时用的目标。不过到了1969年前后,计划进度落后,运行性能较差,资金也短缺,Multics被认为不可能成功,虽然该计划继续在研究,但贝尔实验室还是退出了该计划的研究工作。
Multics
最终Multics还是成功发展出他们的系统,完整的历史说明参考http://www.multicians.org/网站内容。Multics计划虽然后来反响平平,但是这个计划培养出了相当多的优秀人才。
# 1969-1971——创世纪:Ken Thompson小型file server system
Unix于1969年诞生于贝尔实验室计算机科学家 Ken Thompson 的头脑中。Thompson 曾经是 Multics 项目的研究人员,在认为Multics不可能成功之后,1969年贝尔实验室(Bell Labs)退出了该Multics研究联盟,不过Ken Thompson带着从该计划中激发的灵感——如何创建一个文件系统——留了下来。
由于KenThompson酷爱游戏及游戏编程,他在Multics期间编写了一款名叫”星际旅行“(Startravel)的游戏,并运行在该Multics系统上,但运行速度非常慢,且耗费昂贵。
Startravel是个科幻游戏——模拟驾驶一艘火箭在太阳系中遨游。
1969年Multics项目宣告失败后,,KenThompson没能留下一台机器来玩自己编写的”星际旅行“游戏,但他没有放弃游戏的梦想,他在贝尔实验室的库房里找到一台没人用的DEC公司推出的PDP-7主机,但由于缺少操作系统,无法在该PDP-7上运行游戏,于是他准备针对主机进行操作系统核心程序的编写。
本来Thompson在工作之外,还在生活中有家有小孩,应该没有时间编写游戏的,但恰巧1968年八月份左右,刚好Thompson的妻儿去了美西探亲,于是他有了额外的一个月的时间好好的待在家将一些构想实现出来。
在DennisRitchie 的帮助下,他使用汇编语言为该PDP-7编写了一组核心程序,同时包括一些核心工具程序,以及一个小小的文件系统——这个系统就是Unix的原型,并把其游戏成功运行在了该系统之上。
改系统体现了很多优势,受到Multics项目开发经验的启发,DennisRitchie 和 KenThompson 在该游戏操作系统雏形的基础上,进一步完善和开发新功能,最终于 1970 年开发出了一款新的多用户、多任务操作系统,称为 UNIX 操作系统。
UNICS
实际上Unix这个名字直到1970年才正式产生,最初的缩写是"UNICS"(单路信息与计算服务,Uniplexed Information and Computing Service),Ritchie后来称之为”一个有点反叛Multics味道的双关语“——Multics是多路信息与计算服务(MULTiplexed Information and Computing Service)的英文缩写。因为相比较庞大复杂的Multics系统,Thompson则大大简化了不少,才会被同实验室的人戏称为为Unics。
科技始终来自于人性
Unix两个设计理念
- 一切皆文件:所有程序或是系统设备都是文件
- 一个程序做好一件事:不管编辑器、构建器还是链接文件,每一个程序只专注于做且做好一件事情
这两个概念再后来对Linux的发展产生了重要的影响!
# 1971-1973——出埃及记:基于C语言开发的Unix核心正式诞生
由于 UNIX 操作系统良好的性能,在其发布初期,就得到迅速的推广和应用。1973 年,KenThompson 和 DennisRitchie 在做系统内核移植开发时,感觉使用汇编语言很难实现。后来决定使用一种称为 BCPL(BasicCombinedProgrammingLanguage) 的语言进行开发,在开发过程中,他们在 BCPL 的基础上做了进一步的改进,推出了 B 语言(取 BCPL 第一个字母)。
后来发现使用 B 语言虽然胜在小巧,但开发出的 UNIX 内核还是无法达到他们的预期要求,于是在 B 语言的基础上,做了进一步的改进,设计出了具有丰富的数据类型,并支持大量运算符的编程语言。改进后的语言较B语言有质的飞跃,取名为 C 语言。
于是1973年诞生了里程碑事件——Thompson和Ritchie成功使用 C 语言重新编写了 UNIX内核。这是一个大胆的举动——那时为了最大程度的利用硬件性能,系统编程都通过汇编器完成,而在当时,可移植操作系统的概念几乎鲜为人知。
至此,使用 C 语言编写内核的 UNIX 版本已相当稳定,且具有良好的可移植性,为 UNIX 的进一步推广和普及奠定了坚实的基础,也展现了 C 语言与 UNIX 的完美结合及 C 语言在编写系统软件时得天独厚的优势。
由此可见,C 语言的起源与UNIX的改进是密不可分的,也体现了 C 语言在编写系统软件时的优势。
可移植性
使用C语言这种高级语言(有时也被戏称为唯一的中级语言)来编写Unix无疑是最英明的决策,在1979年,Dennis Ritchie终于可以这么写了:“很肯定,Unix的成功很大程度上源于其以高级语言作为表述方式所带来的可读性、可改性和可移植性”,虽然理想与现实此时尚有不少距离。
# 1974-1977:流入学术界——BSD的诞生
1974年在《美国计算及通信》(Communications of the ACM)上发表的一篇论文中[Ritchie-Thompson]第一次公开展示了Unix。文中作者描述了Unix前所未有的简洁设计,并报告了600多例Unix应用——这些都是安装在即便按照那个年代的标准,性能都算很低的机器上。但是正如Richie和Thompson所写:"性能的局限不仅成就了经济性,而且鼓励了设计的简约"
CACM 论文发表后,全球各个研究实验室和大学都要亲身体验Unix。根据1958年为解决反托拉斯案例达成的和解协议,AT&T(贝尔实验室母公司)被禁止进入计算机相关的商业领域。所以此时的Unix不能够成为一种商品,也不存在所谓的商业纠纷——实际上,根据和解协议的规定,贝尔实验室必须将非电话业务的技术许可给任何提出要求的人。Ken Thompson 开始默默回应那些请求——将磁带和磁盘一包包寄送出去。
而且因为Unix是以高级语言C写成的,理论上具有可移植性的!只要取得Unix的源代码,并且针对大型主机的特性加以修订原有的源代码,就可能将Unix移植到另一部不同的主机上头了。所以在1973年以后,Unix便得以与学术界合作开发,对于Unix编程者而言,那是一段激情和兴奋的荣耀岁月,许多大学都对Unix做出过贡献:
- 多伦多大学计算机系发明了200dpi 的打印机/绘图仪,并且开发了用打印机模拟照相排版机的软件;
- 耶鲁大学的计算机专家和学生们改进了Unix的shell;
- 普渡大学还开发出了最早的Unix计算机网络之一;
- 加州大学伯克利分校的学生开发了新shell 和许多小型实用工具;
1970年代后期贝尔实验室发布 Unix V7版本时,改系统解决了很多部门的运算问题,也综合了许多高校的创意。最终诞生了一个更强大的系统。思想潮流开始了新一轮循环,从学术界流向工业实验室,然后又回到学术界,最后流向了不断增加的商业用户。
其中值得称道的是伯克利大学的Bill Joy 在取得Unix核心源代码后,着手修改成适合自己机器的版本,并同时增加了许多工业软件和编译程序,最终将它命名为Berkeley Software Distribution(BSD)。这个BSD是Unix很重要的一个分支,Bill Joy也是Unix业者"Sun"公司的创办者!Sun公司即是以BSD发展的核心进行自己的商业Unix版本的发展的。(后来可以安装在x86硬件架构上面的FreeBSD即是BSD改版而来)。
# 1979:商业化纠纷——重要的System V7 与版权宣告
现代Unix 程序员公认的额第一个完全意义上的额Unix是1979年发布的 V7版本 (opens new window)。第一代Unix用户群一年前就已经形成。此时,Unix用于支撑贝尔系统(Bell System)的所有操作,并且传播到高校中,甚至远至澳大利亚——在哪里John Lions 对V6 版的源码的注释成了Unix 内核第一个正式文档。许多资深的Unix黑客仍然珍藏着一份拷贝。
Lions 的书是地下出版界轰动一时的大事,由于侵犯版权等诸如此类的问题,该书不能再美国出版,所以大家就你拷给我,我拷给你,我也有一份拷贝,至少是第六手了,在那个年代,若没有Lions的书,你就当不成内核黑客。
——Ken Arnoid
Unix产业也初露端倪:
- 由于Unix的高度可移植性与强大的性能,加上当时并没有版权的纠纷, 所以让很多商业公司开始了Unix操作系统的发展,例如AT&T自家的System V、IBM的AIX以及HP与DEC等公司, 都有推出自家的主机搭配自己的Unix操作系统。
- 1978年,第一个Unix公司(the Santa Cruz Operation, SCO)成立,同年售出第一个商用C编译器(Whitesmiths);
- 1980年,西雅图一家还不起眼的软件公司——微软也加入到Unix游戏中,他们把 AT&T 版本移植到微机上,改名为Xenix 来销售,但是微软把Unix作为一个产品的热情并没有持续多久(尽管知道1990年左右,微软的大部分内部开发工作都是用的Unix);
不过繁荣的背后也存在着不少隐忧:如同我们前面提到的,操作系统的核心(Kernel)必须要跟硬件配合, 以提供及控制硬件的资源进行良好的工作!而在早期每一家生产计算机硬件的公司还没有所谓的“协议”的概念, 所以每一个计算机公司出产的硬件自然就不相同!因此他们必须要为自己的计算机硬件开发合适的Unix系统。 例如在学术机构相当有名的Sun、Cray与HP-Unix就是这一种情况。 他们 开发出来的Unix操作系统以及内含的相关软件并没有办法在其他的硬件架构下工作的! 另外,由于没有厂商针对个人计算机设计Unix系统,因此,在早期并没有支持个人计算机的 Unix操作系统的出现。
因为AT&T基于上述现实环境的思考,以及商业化的考虑,于是想把Unix的版权收回去。因此,AT&T 在1979年发行的第七版Unix中,特别提到了“不可对学生提供源代码”的严格限制!同时也造成Unix业界之间的紧张气氛,并且也引爆了很多商业纠纷。
目前被称为直系的Unix指的就是SystemV以及BSD这两套
# 1980:双流记——Unix文化与Internet文化的交融
在 Unix 的发展过程中,加州大学伯克利分校很早就成为唯一最重要的学术热点。伯克利分校早在1974年就开始了对Unix的研究,而Ken Thompson 利用1975-1976 的年休在此教学,更对Unix 的研究注入了强劲活力。1977年,当时还默默无闻的伯克利毕业生 Bill Joy 管理的实验室发布了第一版 BSD。到1980年,伯克利分校成了为这个Unix变种积极做贡献的高校子网的核心。有关伯克利 Unix(包括vi编辑器的创意和代码不断从伯克利反馈到贝尔实验室)。
1980年,国防部高级研究计划局(DARPA,Defense Adcanced Research Project Agency)需要请人在Unix 环境下的VAX 机上实现全新的TCP/IP 协议栈。那时运行ARPANET 的PDP-10 已处于耆耆之年,而数据设备公司(DAC)可能被迫放弃PDP-10以支持VAX 的种种迹象也并非空穴来风。DARPA曾考虑和DEC公司签订实现TCP/IP的合同,但是因为担心DEC可能不太乐意改动他们的专有VAX/VMS 操作系统[Libes-Ressler]而打消了这个念头。最后DARPA 选择了伯克利Unix作为平台——显然因为可以毫无阻碍地拿到它的源代码。
伯克利计算机研究组当时拥有天时地利,还有最强大的开发工具;而DARPA 的合同无疑成为Unix 历史上自诞生以来最关键的转折点。
在1983年TCP/IP实现随Berkeley4.2 版发布之前,Unix对网络的支持一直是最薄弱的。早期的以太网实验不尽人意。贝尔实验室开发了一个难看但还能用的工具UUCP(Unix to Unix Copy Program),可在普通电话线上通过调制解调器来传送软件。UUCP可以在分布很广的机器之间转发邮件,并且(在1981年Usenet发明后)支持Usenet——一个分布式的电子公告牌系统,允许用户把文本信息传播到任何拥有电话线和Unix系统的机器上。
UUCP
其实如果当时调制解调器的速度能达到300波特时,UUCP跑的还是不错的。
尽管如此,已经意识到ARPANET光明前景的少数Unix用户感觉自己似乎陷在一潭死水中。没有FTP,没有telnet,只有限制重重的远程作业执行和慢的要死的连接,在TCP/IP诞生之前,Unix和 Internet 文化尚未融合。Dennis Ritchie 将计算机视为“鼓励密切交流”的这一摄像还只是围绕单机分时系统或统一计算中心的学术社群,并没有扩展到自1970年代中期开始ARPA 用户逐渐形成的一个分布全美的“网络国家”。早期ARPANET的用户对着自己蹩脚的硬件时,也只能想,凑合着用Unix 吧。
有了TCP/IP,一切都变了。ARPANET和Unix文化自边缘开始融合,这种发展最终使两者都免遭灭亡。不过,首先还得经过炼狱,起因是两个毫不相干的灾难:微软的兴起和AT&T的拆分。
对于微软兴起的PC市场和AT&T拆分后的Unix商业化影响,会有专门的章节记述。
# 1984-1986:x86架构的Minix操作系统诞生
关于1979年的版权声明中,影响最大的当然就是学校教Unix核心源代码相关学问的教授,因为1979年AT&T发布的 SystemV7 系统中严格限制了“不可对学生提供源代码”,但是没有核心源代码,如何去教导学生认识Unix呢?对于Andrew Tanenbaum 教授而言,这是个很苦恼的问题。
当时1979年的Unix第七版可以在Intel的x86架构上面进行移植,于是Tanenbaum教授开始有了将Unix改写并移植到x86上面的想法。在此基础上,Tanenbaum教授自己动手写了Minix这个UnixLike的核心程序!在撰写过程中,为了版权纠纷,Tanenbaum完全不看Unix核心源代码,并且强调他的Minix必须能够与Unix相容才行!谭宁邦在1984年开始撰写核心程序,到了1986年终于完成,并于次年出版Minix相关书籍,同时与新闻群组(BBS及News)相结合。
Minix
之所以称为Minix的原因,是因为他是个Mini的Unix系统。
Minix在当时学术界和教育界收到了很大的欢迎,很多人曾经希望进一步完善这个系统,但是Minix操作系统的开发者仅有Tanenbaum一个人,并且Tanenbaum教授始终坚定Minix仅仅用于教育用途,所以对于Minix是点到为止。
# 1988:图形接口XFree86计划
有鉴于图形使用者接口(Graphical User Interface, GUI) 的需求日益加重,在1984年由MIT 与其他协力厂商首次发表了X Window System ,并且更在1988年成立了非营利性质的 XFree86这个组织。所谓的XFree86其实是 X Window System + Free + x86的整合名称呢! 而这个XFree86的GUI接口更在Linux的核心1.0版于1994年释出时,整合于Linux操作系统当 中!
# 1991年:芬兰大学生Linus Torvalds的一则简讯
到了1991年,芬兰的赫尔辛基大学的Linus Torvalds在BBS上面贴了一则消息, 宣称他以 bash, gcc等 GNU 的工具写了一个小小的核心程序,该核心程序单纯是个玩具,不像 GNU 那 么专业。 不过该核心程序可以在Intel的386机器上面运行就是了。这让很多人很感兴趣!从此 开始了Linux不平凡的路程!