本文是《Linux鸟哥私房菜》的部分整理。
Linux操作系统作为全球高智商群体认可的计算机操作系统,其背后的成长历史和设计理念都代表了人类智慧的一个高点。乔布斯说,“优秀者模仿,伟大者剽窃。”本文的初衷就是从linux系统发展历史的几个关键节点思考西方强大的模块化思想和最小可进化生态链对个人和事业发展的指导意义。
什么是操作系统
操作系统是针对特定硬件核心(如微软的硬件核心就是X86命令集)设计的。过去Mac电脑请IBM设计其核心(称为Power CPU),因此,那时,Mac操作系统不能用于微软电脑,或反过来。现在Mac和微软均请Intel设计其硬件核心,因此,二者理论上操作系统可通用了,但需要处理一些兼容问题。而Linux由于是开源的操作系统,所以它的程序码可以被修改成适合在各种机器上面运行的,即,Linux是具有“可移植性”的!这是很重要的功能。
Linux提供了一个完整操作系统中最底层的硬件控制与资源管理的完整架构。这个架构是沿袭Unix良好的传统来的,所以相当地稳定而功能强大。此外,由于这个优良的架构可以在个人计算机(X86指令集系统)上面跑,所以,很多软件开发者渐渐将他们的工作心血转移到这个架构上面,所以Linux系统也有很多的应用软件了。这位Linux系统的未来发展奠定了很好的基础。
伟大的梦想——Multics系统
之所以说伟大,是因为它自诞生一直在为了解决计算机发展中的重大问题或gap而进化。
早期的计算机并不像现在的个人计算机一样普遍, 他可不是一般人碰的起的呢~ 除非是军事或者是高科技用途, 或者是学术单位的前瞻性研究, 否则真的很难接触到。 非但如此, 早期的计算机架构还很难使用, 除了运算速度并不快之外, 操作接口也很困扰的! 因为那个时候的输入设备只有读卡机、 输出设备只有打印机, 使用者也无法与操作系统互动( 批次型操作系统) 。
在那个时候, 写程序是件很可怜的事情, 因为程序设计者, 必须要将程序相关的信息在读卡纸上面打洞, 然后再将读卡纸插入读卡机来将信息读入主机中运算。 光是这样就很麻烦了,如果程序有个小地方写错, 哈哈! 光是重新打卡就很惨, 加上主机少, 使用者众多, 光是等待, 就耗去很多的时间了!在那之后, 由于硬件与操作系统的改良, 使得后来可以使用键盘来进行信息的输入。 不过,在一间学校里面, 主机毕竟可能只有一部, 如果多人等待使用, 那怎么办? 大家还是得要等待啊! 好在1960年代初期麻省理工学院( MIT) 发展了所谓的: “相容分时系统( CompatibleTime-Sharing System, CTSS) ”, 它可以让大型主机通过提供数个终端机( terminal) 以连线进入主机, 来利用主机的资源进行运算工作。 架构有点像这样:
从linux系统历史看如何做成一件事
这个相容分时系统可以说是近代操作系统的始祖呢! 他可以让多个使用者在某一段时间内分别使用CPU的资源, 感觉上你会觉得大家是同时使用该主机的资源! 事实上, 是CPU在每个使用者的工作之间进行切换, 在当时, 这可是个划时代的技术喔!
如此一来, 无论主机在哪里, 只要在终端机前面进行输入输出的作业, 就可利用主机提供的功能了。 不过, 需要注意的是, 此时终端机只具有输入/输出的功能, 本身完全不具任何运算或者软件安装的能力。 而且, 比较先进的主机大概也只能提供30个不到的终端机而已。
为了更加强化大型主机的功能, 以让主机的资源可以提供更多使用者来利用, 所以在1965年前后, 由贝尔实验室( Bell) 、 麻省理工学院( MIT) 及奇异公司( GE, 或称为通用电器) 共同发起了Multics的计划, Multics计划的目的是想要让大型主机可以达成提供300个以上的终端机连线使用的目标。 不过, 到了1969年前后, 计划进度落后, 资金也短缺, 所以该计划虽然继续在研究, 但贝尔实验室还是退出了该计划的研究工作。 ( Multics有复杂、 多数的意思存在。 )
1969年: Ken Thompson的小型file server system
在认为Multics计划不可能成功之后, 贝尔研究室就退出该计划。 不过, 原本参与Multics计划的人员中, 已经从该计划当中获得一些点子, Ken Thompson 就是其中一位!Thompson因为自己的需要, 希望开发一个小小的操作系统以提供自己的需求。 在开发时,有一部DEC ( Digital Equipment Corporation) 公司推出的PDP-7刚好没人使用, 于是他就准备针对这部主机进行操作系统核心程序的撰写。 本来Thompson应该是没时间的( 有家有小孩的宿命? ) , 无巧不巧的是, 在1969年八月份左右, 刚好Thompson的妻儿去了美西探亲,于是他有了额外的一个月的时间好好的待在家将一些构想实现出来!经过四个星期的奋斗, 他终于以组合语言( Assembler) 写出了一组核心程序, 同时包括一些核心工具程序, 以及一个小小的文件系统。 那个系统就是Unix的原型! 当时Thompson将Multics庞大的复杂系统简化了不少, 于是同实验室的朋友都戏称这个系统为: Unics(Uni-有唯一,单一等一的概念)。 ( 当时尚未有Unix的名称)
简化的极端重要性
Thompson的这个文件系统有2个重要的概念:
- 所有的程序或系统设备都是文件(模块化)
- 不管建构编辑器还是附属文件,所写的程序只有一个目的,且要有效地完成目标(模块的功能要求有效、可靠)
这两个概念几乎代表了西方模块化设计的核心理念!也代表了个人最小成长的核心理念,甚至代表了生物进化中对生物个体要求的主要特征。
这些概念再后来对Linux的发展有相当重要的影响!
由于Thompson写的那个操作系统实在太好用了, 所以在贝尔实验室内部广为流传, 并且数度经过改版。 但是因为Unics本来是以组合语言写成的, 而如第零章计算机概论谈到的, 组合语言具有专一性, 加上当时的计算机机器架构都不太相同, 所以每次要安装到不同的机器都得要重新编写组合语言, 真不方便!
后来Thompson与Ritchie合作想将Unics改以高阶程序语言来撰写。 当时现成的高阶程序语言有B语言。 但是由B语言所编译出来的核心性能不是很好。 后来Dennis Ritchie将B语言重新改写成C语言, 再以C语言重新改写与编译Unics的核心, 最后正名与发行出Unix的正式版本!
由于贝尔实验室是隶属于美国电信大厂AT&T公司的, 只是AT&T当时忙于其他商业活动, 对于Unix并不支持也不排斥。 此外, Unix在这个时期的发展者都是贝尔实验室的工程师, 这些工程师对于程序当然相当有研究, 所以, Unix在此时当然是不容易被一般人所接受的! 不过对于学术界的学者来说, 这个 Unix 真是学者们进行研究的福音! 因为程序码可改写并且可作为学术研究之用嘛!
需要特别强调的是, 由于Unix是以较高阶的C语言写的, 相对于组合语言需要与硬件有密切的配合, 高阶的C语言与硬件的相关性就没有这么大了! 所以, 这个改变也使得Unix很容易被移植到不同的机器上面喔!
如同相容分时系统的功能一般, Unix强调的是多用户多任务的环境! 但早期的286个人计算机架构下的CPU是没有能力达到多任务的作业, 因此, 并没有人对移植Unix到x86的计算机上有兴趣。
每一家公司自己出的Unix虽然在架构上面大同小异, 但是却真的仅能支持自身的硬件, 所以啰, 早先的Unix只能与服务器( Server) 或者是大型工作站(Workstation)划上等号! 但到了 1979 年时, AT&T推出 System V 第七版 Unix 后, 这个情况就有点改善了。 这一版最重要的特色是可以支持x86架构的个人计算机系统, 也就是说 System V 可以在个人计算机上面安装与运行了。
不过因为AT&T由于商业的考虑, 以及在当时现实环境下的思考, 于是想将Unix的版权收回去。 因此, AT&T在1979年发行的第七版Unix中, 特别提到了 “不可对学生提供源代码”的严格限制! 同时, 也造成Unix业界之间的紧张气氛, 并且也引爆了很多的商业纠纷~
最小成长核心法则——1984年的两件大事
1984年之一: x86架构的Minix操作系统开始撰写并于两年后诞生
关于1979年的版权声明中, 影响最大的当然就是学校教Unix核心源代码相关学问的教授了!想一想, 如果没有核心源代码, 那么如何教导学生认识Unix呢? 这问题对于 Andrew Tanenbaum ( 谭宁邦) 教授来说, 实在是很伤脑筋的! 不过, 学校的课程还是得继续啊! 那怎么办?
既然1979年的Unix第七版可以在Intel的x86架构上面进行移植, 那么是否意味着可以将Unix改写并移植到x86上面了呢? 在这个想法上, 谭宁邦教授于是乎自己动手写了Minix这个Unix Like的核心程序! 在撰写的过程中, 为了避免版权纠纷, 谭宁邦完全不看Unix核心源代码!并且强调他的Minix必须能够与Unix相容才行! 谭宁邦在1984年开始撰写核心程序, 到了1986年终于完成, 并于次年出版Minix相关书籍, 同时与新闻群组( BBS及News) 相结合~
之所以称为Minix的原因, 是因为他是个Mini ( 微小的) 的Unix系统啰! _
这个Minix版本比较有趣的地方是, 他并不是完全免费的, 无法在网络上提供下载! 必须要通过磁片/磁带购买才行! 虽然真的很便宜~不过, 毕竟因为没有在网络上流传, 所以Minix的传递速度并没有很快速! 此外, 购买时, 随磁片还会附上Minix的源代码! 这意味着使用者可以学习Minix的核心程序设计概念喔! ( 这个特色对于Linux的启始开发阶段, 可是有很大的关系喔! )
此外, Minix操作系统的开发者仅有谭宁邦教授, 因为学者很忙啊 ( 鸟哥当了老师之后, 才发现, 真的忙...) ! 加上谭宁邦始终认为Minix主要用在教育用途上面, 所以对于Minix是点到为止! 没错, Minix是很受欢迎, 不过, 使用者的要求/需求的声音可能就比较没有办法上升到比较高的地方了! 这样说, 你明白吧? _
1984年之二: GNU计划与FSF基金会的成立
Richard Mathew Stallman( 史托曼) 在1984年发起的GNU计划, 对于现今的自由软件风潮,真有不可磨灭的地位! 目前我们所使用的很多自由软件或开源软件, 几乎均直接或间接受益于GNU这个计划呢! 那么史托曼是何许人也? 为何他会发起这个GNU计划呢?
一个分享的环境:
Richard Mathew Stallman( 生于1953年, 网络上自称的ID为RMS) 从小就很聪明! 他在1971年的时候, 进入骇客圈中相当出名的人工智能实验室( AI Lab.) , 这个时候的骇客专指计算机功力很强的人, 而非破坏计算机的怪客( cracker) 喔!
当时的骇客圈对于软件的着眼点几乎都是在“分享”, 骇客们都认为互相学习对方的程序码, 这样才是产生更优秀的程序码的最佳方式! 所以 AI 实验室的骇客们通常会将自己的程序码公布出来跟大家讨论喔! 这个特色对于史托曼的影响很大!不过, 后来由于管理阶层以及骇客群们自己的生涯规划等问题, 导致实验室的优秀骇客离开该实验室, 并且进入其他商业公司继续发展优秀的软件。 但史托曼并不服输, 仍然持续在原来的实验室开发新的程序与软件。 后来, 他发现到, 自己一个人并无法完成所有的工作, 于是想要成立一个开放的团体来共同努力!
使用Unix开发阶段:
1983年以后, 因为实验室硬件的更换, 使得史托曼无法继续以原有的硬件与操作系统继续自由程序的撰写~ 而且他进一步发现到, 过去他所使用的Lisp操作系统, 是麻省理工学院的专利软件, 是无法共享的, 这对于想要成立一个开放团体的史托曼是个阻碍。 于是他便放弃了Lisp这个系统。 后来, 他接触到Unix这个系统, 并且发现, Unix在理论与实际上, 都可以在不同的机器间进行移植。 虽然 Unix 依旧是专利软件, 但至少 Unix 架构上还是比较开放的!于是他开始转而使用Unix系统。
因为Lisp与Unix是不同的系统, 所以, 他原本已经撰写完毕的软件是无法在Unix上面运行的!为此, 他就开始将软件移植到Unix上面。 并且, 为了让软件可以在不同的平台上运行, 因此, 史托曼将他发展的软件均撰写成可以移植的型态! 也就是他都会将程序的源代码公布出来!
GNU计划的推展:
1984年, 史托曼开始GNU计划, 这个计划的目的是: 创建一个自由、 开放的Unix操作系统( Free Unix) 。 但是创建一个操作系统谈何容易啊! 而且在当时的GNU是仅有自己一个人单打独斗的史托曼~ 这实在太麻烦, 但又不想放弃这个计划, 那可怎么办啊?
聪明的史托曼干脆反其道而行~“既然操作系统太复杂, 我就先写可以在Unix上面运行的小程序, 这总可以了吧? ”在这个想法上, 史托曼开始参考Unix上面现有的软件, 并依据这些软件的作用开发出功能相同的软件, 且开发期间史托曼绝不看其他软件的源代码, 以避免吃上官司。 后来一堆人知道免费的GNU软件, 并且实际使用后发现与原有的专利软件也差不了太多, 于是便转而使用GNU软件, 于是GNU计划逐渐打开知名度。
虽然GNU计划渐渐打开知名度, 但是能见度还是不够。 这时史托曼又想: 不论是什么软件,都得要进行编译成为二进制文件( binary program) 后才能够执行, 如果能够写出一个不错的编译器, 那不就是大家都需要的软件了吗? 因此他便开始撰写C语言的编译器, 那就是现在相当有名的GNU C Compiler( gcc) ! 这个点相当的重要! 这是因为C语言编译器版本众多, 但都是专利软件, 如果他写的C编译器够棒, 性能够佳, 那么将会大大的让GNU计划出现在众人眼前!
但开始撰写GCC时并不顺利, 为此, 他先转而将他原先就已经写过的Emacs编辑器写成可以在Unix上面跑的软件, 并公布源代码。 Emacs是一种程序编辑器, 他可以在使用者撰写程序的过程中就进行程序语法的检验, 此一功能可以减少程序设计师除错的时间! 因为Emacs太优秀了, 因此, 很多人便直接向他购买。
此时网际网络尚未流行, 所以, 史托曼便借着Emacs以磁带( tape) 出售, 赚了一点钱 , 进而开始全力撰写其他软件。 并且成立自由软件基金会( FSF, Free Software Foundation) , 请更多工程师与志工撰写软件。 终于还是完成了GCC, 这比Emacs还更有帮助! 此外, 他还撰写了更多可以被调用的C函数库( GNU C library) , 以及可以被使用来操作操作系统的基本接口BASH shell! 这些都在1990年左右完成了!
如果纯粹使用文字编辑器来编辑程序的话, 那么程序语法如果写错时, 只能利用编译时发生的错误讯息来修订了, 这样实在很没有效率。 Emacs则是一个很棒的编辑器! 注意! 是编辑( editor) 而非编译( compiler) ! 他可以很快的立刻显示出你写入的语法可能有错误的地方, 这对于程序设计师来说, 实在是一个好到不能再好的工具了! 所以才会这么的受到欢迎啊!
最小进化生态链:
到了1985年, 为了避免GNU所开发的自由软件被其他人所利用而成为专利软件, 所以他与律师草拟了有名的通用公共许可证( General Public License, GPL) , 并且称呼他为copyleft( 相对于专利软件的copyright! ) 。 关于GPL的相关内容我们在下一个小节继续谈论, 在这里, 必须要说明的是, 由于有GNU所开发的几个重要软件, 如:
- Emacs(编辑器)
- GNU C ( GCC,编译器)
- GNU C Library ( glibc,C函数库)
- Bash shell(操作操作系统的基本接口)
(这些软件构建了软件开发的最小完整生态进化系统,使得Unix得以不断进化和发展和成熟。)
造成后来很多的软件开发者可以借由这些基础的工具来进行程序开发! 进一步壮大了自由软件团体! 这是很重要的! 不过, 对于GNU的最初构想 “创建一个自由的Unix操作系统”来说,有这些优秀的程序是仍无法满足, 因为, 当下并没有“自由的Unix核心”存在...所以这些软件仍只能在那些有专利的 Unix平台上工作~~一直到Linux的出现...
Linux的诞生与蓬勃发展背后的理念
1991年,芬兰Linux Torvalds,在Andrew Tanenbaum ( 谭宁邦) 教授的Minix系统和GNU开发在最小可进化生态链中,开发了一个小程序,并在BBS上贴了一则消息,宣称以bash、gcc等GNU工具写了一个小小的核心程序,从此开始了Linux不平凡的路程!
GNU计划对于整个自由软件与开发源代码来说,是非常重要的角色!
1994年,Linux核心正式版V1.0。
1996年,Linux核心正式版V2.0.
2011年,Linux核心正式版V3.0.
2015年,Linux核心正式版V4.0.
Linux由于托瓦兹是针对386写的, 跟386硬件的相关性很强, 所以, 早期的Linux确实是不具有移植性的。 不过, 大家知道Open source的好处就是, 可以修改程序码去适合作业的环境。 因此, 在1994年以后, Linux便被开发到很多的硬件上面去了! 目前除了x86之外,IBM、 HP等等公司出的硬件也都有被Linux所支持呢! 甚至于小型单板计算机 ( 蓝莓) 与手持设备 ( 智能手机、 平板电脑) 的 ARM 架构系统, 大多也是使用 Linux 核心喔!
Linux能够成功除了托瓦兹个人的理念与力量之外, 其实还有个最重要的团队!
单一个人维护阶段
Linux虽然是托瓦兹发明的, 而且内容还绝不会涉及专利软件的版权问题。 不过, 如果单靠托瓦兹自己一个人的话, 那么Linux要茁壮实在很困难~ 因为一个人的力量是很有限的。 好在托瓦兹选择Linux的开发方式相当的务实! 首先, 他将释出的Linux核心放置在FTP上面, 并请告知大家新的版本信息, 等到使用者下载了这个核心并且安装之后, 如果发生问题, 或者是由于特殊需求亟需某些硬件的驱动程序, 那么这些使用者就会主动回报给托瓦兹。 在托瓦兹能
够解决的问题范围内, 他都能很快速的进行Linux核心的更新与除错。
广大骇客志工加入阶段
不过, 托瓦兹总是有些硬件无法取得的啊, 那么他当然无法帮助进行驱动程序的撰写与相关软件的改良。 这个时候, 就会有些志工跳出来说: “这个硬件我有, 我来帮忙写相关的驱动程序。 ” 因为Linux的核心是Open Source的, 骇客志工们很容易就能够跟随Linux的原本设计架构, 并且写出相容的驱动程序或者软件。 志工们写完的驱动程序与软件托瓦兹是如何看待的呢? 首先, 他将该驱动程序/软件带入核心中, 并且加以测试。 只要测试可以运行, 并且没有什么主要的大问题, 那么他就会很乐意的将志工们写的程序码加入核心中!
务实的态度
托瓦兹是个很务实的人, 对于Linux核心所欠缺的项目, 他总是“先求有且能跑, 再求进一步改良”的心态! 这让Linux使用者与志工得到相当大的鼓励! 因为Linux的进步太快了!使用者要求虚拟内存, 结果不到一个星期推出的新版Linux就有了! 这不得不让人佩服啊!
另外, 为因应这种随时都有程序码加入的状况, 于是Linux便逐渐发展成具有模块的功能! 亦即是将某些功能独立出于核心外, 在需要的时候才载入到核心中。 如此一来, 如果有新的硬件驱动程序或者其他协定的程序码进来时, 就可以模块化, 大大的增加了Linux核心的可维护能力!(核心是一组程序, 如果这组程序每次加入新的功能都得要重新编译与改版的话会变成如何? 想像一下, 如果你只是换了显卡就得要重新安装新的Windows操作系统, 会不会傻眼?模块化之后, 原本的核心程序不需要更动, 你可以直接将他想成是“驱动程序”即可!)
核心功能细部分工发展阶段
后来, 因为Linux核心加入了太多的功能, 光靠托瓦兹一个人进行核心的实际测试并加入核心原始程序实在太费力~ 结果, 就有很多的朋友跳出来帮忙这个前置作业! 例如考克斯( AlanCox) 、 与崔迪( Stephen Tweedie) 等等, 这些重要的副手会先将来自志工们的修补程序或者新功能的程序码进行测试, 并且结果上传给托瓦兹看, 让托瓦兹作最后核心加入的源代码的选择与整并! 这个分层负责的结果, 让Linux的发展更加的容易!
特别值得注意的是, 这些托瓦兹的Linux发展副手, 以及自愿传送修补程序的骇客志工, 其实都没有见过面, 而且彼此在地球的各个角落, 大家群策群力的共同发展出现今的Linux, 我们称这群人为虚拟团队! 而为了虚拟团队数据的传输, 于是Linux便成立的核心网站:
http://www.kernel.org!
而这群素未谋面的虚拟团队们, 在1994年终于完成的Linux的核心正式版! version 1.0。 这一版同时还加入了X Window System的支持呢! 且于1996年完成了2.0版、 2011 年释出 3.0版, 更于 2015 年 4 月释出了 4.0 版哩! 发展相当迅速喔! 此外, 托瓦兹指明了企鹅为Linux的吉祥物(奇怪的是, 托瓦兹是因为小时候去动物园被企鹅咬了一口念念不忘, 而正式的2.0推出时, 大家要他想一个吉祥物。 他在想也想不到什么动物的情况下, 就将这个念念不忘的企鹅当成了Linux的吉祥物了......)。
网友评论