1.1 Linux操作系统的诞生
操作系统是一种特殊的软件(或程序),它是用户和计算机的接口,也是人机沟通的桥梁。用户通过操作系统提供的交互界面来使用计算机。操作系统位于应用程序和计算机硬件的中间:一方面,操作系统控制着应用程序的运行;另一方面,操作系统又管理着计算机的硬件资源。在这个过程中,操作系统把硬件抽象成一种资源,并以系统接口的形式提供给应用程序。此外,操作系统一般也会自带各类实用工具,方便用户进行各类操作,如程序开发、程序运行、系统访问、文件管理、数据处理、网络通信等。总而言之,操作系统能让计算机更易于使用,同时也能更有效地管理计算机资源。
自20世纪50年代中期批处理操作系统(常被认为是第一代操作系统)诞生以来,操作系统已经发展了将近70年。批处理系统可以让计算机处理器按顺序批量执行用户的任务,提高了计算机的利用率。在执行单个任务的过程中,处理器时常需要等待外围设备反馈的结果,于是多道批处理操作系统应运而生。该系统可以在处理器等待外围设备反馈的时间间隔里,切换执行另一个任务,这样可以有效提升批处理的效率。
当时计算机庞大且昂贵,普通用户根本无力购买自己的计算机,因此很多用户只能共享一台由专门的操作员负责操作的计算机。普通用户把需要处理的任务交给操作员,等待一段时间后才能取回运行结果。尽管多道批处理操作系统已经大大缩短了用户等待的时间,但是用户还是需要排队来依次使用计算机。如果能让用户直接访问计算机,用户和操作系统的交互无疑就会更加高效。
分时操作系统的出现解决了这个问题。分时操作系统允许多个用户通过终端访问系统,并轮流分配给每个用户一小段时间来使用计算机。由于轮流的速度很快,感觉就像是多个用户在同时使用一台计算机。当时较为著名的分时操作系统是由麻省理工学院开发的兼容分时系统(Compatible Time-Sharing System,CTSS)。该系统简单而高效,让每位用户在使用时都感觉是独占了整台计算机。尽管CTSS很成功,但是其功能相对简单,于是麻省理工学院开发出了一个更好的操作系统—— Multics。Multics被认为是现代计算机操作系统的始祖,计算机操作系统的发展可以分为以下3个阶段。
(1)UNIX操作系统的诞生与发展。UNIX操作系统吸收了CTSS和Multics的许多先进思想。UNIX操作系统早期在贝尔实验室流行,后来又被提供给大学和一些公司使用。不同的机构各自都对UNIX操作系统开发了新功能,因此UNIX操作系统出现了很多衍生版本。不论是操作系统研究领域还是商业应用领域,UNIX操作系统都有着显著的影响力。
(2)计算机操作系统迈入图形化时代。随着个人计算机的诞生,可视化操作系统也应运而生,其中macOS操作系统和Windows操作系统最为著名。它们对用户更为友好,同时也对现代社会文明的发展产生了深远的影响。
(3)Linux操作系统的诞生与演进。与商业化的macOS操作系统、Windows操作系统相反,Linux操作系统因其开放源代码的特性而异军突起,并在全世界软件人员的合力开发中取得了长足发展,在科学研究、工程应用、嵌入式开发等领域都得到了广泛的应用。
1.1.1 从UNIX操作系统到Linux操作系统
真正意义上的操作系统出现在20世纪60年代初期,主要是指计算机制造公司为自家生产的大型计算机/小型计算机而编写的分时操作系统。此外,麻省理工学院的“黑客”(这里主要指计算机爱好者和程序爱好者)们为当时的计算机主机开发了兼容分时系统(CTSS),让约30位用户可以联机使用。在1965年前后,麻省理工学院开始设计Multics。由于设计该操作系统是个大项目,因此麻省理工学院联合美国通用电气公司和贝尔实验室一起进行开发工作。Multics和CTSS有着类似的观念,即让人们可以更方便地通过操作系统去做一些真正有价值的工作。不过到了1969年,由于Multics的设计目标过于复杂、开发进度迟缓,贝尔实验室退出了该开发项目。
肯·汤普森(Ken Thompson)是贝尔实验室的工程师,他参与了Multics的开发项目,还为Multics写了一个名为“太空旅行”(Space Travel)的游戏,该游戏乐趣十足,得到了不少同事的赞扬。但没有了Multics,该游戏也就无法再运行了。于是,在他们退出Multics开发项目之后不久,由于肯·汤普森的工作需求以及他想要继续体验该游戏的愿望,肯·汤普森在同事丹尼斯· 里奇(Dennis Ritchie)的协助下,在一台小型计算机PDP-7(如图1-1所示,当时PDP-7是性价比很高的计算机,售价72,000美元)上用汇编语言开发了一个极其简单的操作系统。当时还没有给该操作系统取名,于是他们的同事布赖恩·柯林汉(Brian Kernighan)提议道:“Multics有包罗万象的功能,而新系统顶多择一而从,应该用Uni来替代Multi,就叫这个新系统为UNICS。”(multics有复杂、多数的意思,unics有单一的意思,UNICS就是相对于Multics的一种戏称,后来被改名为UNIX)。
图1-1 小型计算机PDP-7,运行第一版UNIX操作系统的机器
1973年,肯·汤普森和丹尼斯·里奇把UNIX操作系统移植到了实验室新买的PDP-11上。由于移植操作系统需要对用汇编语言编写的操作系统进行完全重写,因此他们打算用更高级的语言来重新开发UNIX操作系统,方便以后的移植工作。此前,肯·汤普森已经开发出了B语言。B语言是他专门为PDP-7而设计的编程语言,由于其语法接近BCPL而得名。但是B语言并不适合PDP-11,因此丹尼斯·里奇对B语言进行了扩充,并将新的语言命名为“New B”(简称NB)语言,最后它逐渐演变成了C语言。在丹尼斯·里奇给C语言添加了结构体(struct)类型之后,他们用C语言和少量汇编语言成功重写了UNIX系统。在此之前从来没有人用高级语言编写过操作系统,这成为了操作系统历史上的一个里程碑。至此,UNIX操作系统成长为一个可移植的操作系统,这令其传播更为方便。UNIX操作系统和C语言的组合很快被应用于极为广泛的计算作业,其中的很多应用完全超出了设计者的预期。当时的UNIX操作系统属于AT&T公司的贝尔实验室,贝尔实验室一开始并未重视UNIX操作系统,因为UNIX操作系统本来就不是正式项目,也就没想着用它来营利。此后,UNIX操作系统和其源代码被免费提供给各大高校使用。不仅如此,贝尔实验室还和学术界(主要是加利福尼亚大学伯克利分校)合作开发UNIX操作系统,使得UNIX操作系统在各大高校快速传播开来。
对UNIX操作系统而言,1977年是具有特殊意义的一年。在这一年,学术界的顶尖院校—— 加利福尼亚大学伯克利分校,以UNIX第6版为基础,在系统中添加了许多先进的特性,并以“Berkeley Software Distribution”为名对外发行,也就是1BSD,1BSD的发行也正式开创了BSD系列。BSD系列是UNIX操作系统中一个很重要的分支(苹果公司的macOS操作系统实际上就源自此分支)。1979年,在UNIX第7版发布后不久,AT&T公司意识到UNIX操作系统的商业价值,收回了UNIX操作系统的版权,企图将UNIX操作系统变为商业化的产品。自此,UNIX操作系统分为两大阵营,即以AT&T公司为代表的System V(基于UNIX第7版开发的商业UNIX版本)和以加利福尼亚大学伯克利分校为代表的BSD,各自蓬勃发展。
BSD操作系统
BSD的全称是Berkeley Software Distribution(也被称为BSD UNIX),是由加利福尼亚大学伯克利分校计算机系统研究小组(CSRG)开发的基于UNIX的操作系统,其中包含了有关UNIX操作系统的诸多研究成果。早期的大部分BSD代码是以UNIX第6版代码为基础的。在比尔·乔利兹(Bill Jolitz)和琳恩·乔利兹(Lynne Jolitz)等几位BSD开发小组关键成员的努力下,他们根据开源软件许可协议开发出了386BSD。后来,很多评论家在比较了386BSD和林纳斯·托瓦兹(Linux操作系统之父)的早期成果之后,都认为386BSD将会成为个人计算机史上最重要的类UNIX操作系统。不过就目前而言,Linux操作系统显然比386BSD(及其衍生版本)要更受欢迎。
1993年,比尔·乔利兹这一重要成员退出了386BSD项目,使得该操作系统面临被终止的危险。好在几位项目组的开发人员在商量后,决定继续开发该项目,但是对于如何确定开发方向,却存在两种不同的声音。于是,386BSD项目就衍生出了两个分支:NetBSD和FreeBSD。NetBSD的目的是设计一个多平台系统,让它可以在几乎任何计算机架构上运行;FreeBSD则着重于开发一款高性能和高可靠性的操作系统,不仅可以使服务器稳定且高效地工作,还可以让个人计算机成为一台高性能的工作站。此外,OpenBSD也比较流行。OpenBSD是在1996年被推出的,它的设计理念是创造一个注重安全性的操作系统。与此同时,OpenBSD极度重视源代码的质量,内核源代码的任何修改都需要经过审阅。
除了以上3个主流的BSD操作系统,还有两个基于FreeBSD的衍生操作系统。一个是DragonFly BSD,它的设计目标是提供一个比FreeBSD更优秀、支持对称多处理器的操作系统,并使内核能直接支持通用集群系统,以取得更好的计算效果。另一个是大家熟知的macOS操作系统,该系统的核心被称为Darwin,它内部的部分组件源自BSD(主要是FreeBSD),如文件系统、网络组件和POSIX接口等。由于macOS操作系统引用了FreeBSD的源代码,因此从技术上来说,一部分macOS操作系统衍生于FreeBSD。当然,现在的macOS操作系统已经超出了FreeBSD的代码框架,完全进行了个性化设计。macOS操作系统不仅具备和FreeBSD一样的高性能和高可靠性,而且提供了简洁易用的图形用户界面,得到了很多用户的青睐。
到了19世纪80年代中后期,UNIX操作系统逐渐形成了两大流派:一支是商业派,另一支是非商业派。商业派是以AT&T公司为代表的System V,不公开源代码的商业派视源代码为商业机密,甚至不允许大学使用UNIX操作系统源代码。非商业派则是以加利福尼亚大学伯克利分校为代表的BSD,本着学术交流的目的,拥护软件开源,鼓励代码共享,促使UNIX操作系统广泛传播。当然,在BSD上开发商业版也是被允许的,比如苹果公司的macOS操作系统就是基于BSD被开发的,但是macOS操作系统是闭源的。
伴随着UNIX操作系统的商业化,AT&T公司规定大学不允许把UNIX第7版及以后版本的源代码开放给学生学习和使用。对于AT&T公司的这种规定,不仅是学生,甚至连很多开发人员都感到失望和遗憾,因为他们都认为过度的商业化并不利于UNIX操作系统的发展,更不利于操作系统领域的发展。这也间接导致了非商业派和商业派围绕UNIX操作系统进行的版权斗争。
当时,对广大个人用户而言,版权战争的最终结果其实并不重要,重要的是学生在学校上课时不再能够使用UNIX操作系统,因此对操作系统的教学只能停留在原理层面,实际操作很难展开,这无疑让想要学习操作系统的学生感到十分沮丧。1987年,为了能让学生学习并开发操作系统,阿姆斯特丹自由大学的安德鲁·S. 塔能鲍姆(Andrew S. Tanenbaum)教授编写了主要用于教学的Minix操作系统。为了避免版权纠纷,安德鲁教授没有使用UNIX操作系统的核心源代码,所以Minix操作系统是一个类UNIX操作系统。由于该操作系统主要用于教学,因此这个系统很简单,却并不实用。
Minix操作系统
Minix操作系统的第1个版本发布于1987年,安德鲁教授创建Minix操作系统的目的是让学生学习UNIX操作系统。为了保证兼容性,Minix操作系统使用和UNIX操作系统一样的系统调用,但没有使用UNIX操作系统的任何源代码。出于学术的严谨性,安德鲁教授采用微内核来编写Minix操作系统,这使得Minix操作系统的设计思想非常先进,并且安德鲁教授开放了Minix操作系统的完整源代码,因此Minix操作系统从一开始发布就吸引了很多用户。
UNIX第6版发布于1975年,一经发布,该版本就在高校内部迅速传播开来。1977年,来自新南威尔士大学的约翰·莱昂斯(John Lions)教授逐行为UNIX第6版的源代码写了评注。全世界有数百所大学开始把约翰·莱昂斯教授的评注作为学习UNIX第6版的参考教程。后来在UNIX第7版推出后,AT&T公司的政策被改变了,禁止再将操作系统的源代码公开给学生,因此操作系统的教学也退回到了理论教学模式。出于对这种状况的失望,安德鲁教授才决定自己开发一个和UNIX操作系统类似的操作系统。1984年,安德鲁教授对将要创建的操作系统进行了详细的理论设计。在完成理论设计后,他就开始正式编写Minix操作系统。因为该操作系统的编写主要是出于教学目的,所以其基本内核非常简单,但是这并不意味着编写Minix操作系统是一件容易的事。经过两年的辛苦努力,前后花费数千个小时,安德鲁教授终于在1986年基本完成了Minix操作系统的编写。1987年,Minix操作系统随安德鲁教授的著作Operating Systems: Design and Implementation(《操作系统:设计与实现》)被一同发布了出来。
Minix操作系统一经发布,就取得了成功,不仅因为该操作系统提供源代码,还因为有一本详细介绍该操作系统工作原理的图书,用户在使用操作系统的同时,还能学习操作系统的设计和实现方法,这在当时是一个创举。Minix操作系统在学生、计算机爱好者和开发人员群体中都受到了极大的欢迎。后来,安德鲁教授和他的团队改进了Minix操作系统的网络通信等功能,使该操作系统能支持更多的处理器和计算机平台,兼容POSIX接口标准。他们于1997年发布了Minix 2,同时把《操作系统:设计与实现》也更新到了第2版。2006年,他们又把Minix操作系统和《操作系统:设计与实现》更新到了第3版(目前的最新版本),从第3版开始,Minix操作系统的重心转移到了科学研究,更关注嵌入式领域,不过它依然适合用来教学。
1980年之前,基本上只有大学、科研机构和大型企业才会拥有计算机,因此当时使用计算机的用户几乎都是“专家级”,他们一般都有高超的编程技巧,也都属于专业用户。此时的操作系统都是基于命令行用户界面进行开发的。随着集成电路的发展,大规模和超大规模集成电路逐渐普及,计算机在缩小体积的同时,其性能也越来越强。
1981年,IBM公司开发的个人计算机(personal computer,PC)诞生了,它面向个人用户,在个人计算机市场进行拓展,想要吸引到更多的普通用户。然而,普通用户并没有非常高超的计算机操作技巧,这就对操作系统的易用性提出了较高的要求。于是,基于图形界面的操作系统应运而生。
1983年,VisiCorp公司为IBM公司的PC设计了一款具有图形用户界面(graphical user interface,GUI)的VisiOn操作系统(VisiOn是可移植的操作系统,但是从未被移植过),其界面如图1-2所示。VisiOn操作系统简洁直观,易于操作,对普通用户非常友好。
1984年,苹果公司推出Macintosh操作系统(后来演变为macOS操作系统),System 1.0的界面如图1-3所示,它具备图形化操作界面的设计能力,用户可以使用鼠标进行操作,为操作系统产业界带来革命性的变化。
图1-2 VisiOn操作系统的界面
图1-3 System 1.0的界面
1985年,微软公司发布了Windows操作系统的首个公开发行版本(同样是为IBM公司的PC而设计的)。图1-4展示了Windows 1.01的启动界面和运行界面,它具有彩色显示功能,绝大多数操作都可以用鼠标来控制,不仅如此,该操作系统还提供了常用的应用程序,如计算器、记事本、时钟等小工具。
图1-4 Windows 1.01的启动界面和运行界面
在这些操作系统中,苹果公司的macOS操作系统实际上就是(部分)来源于UNIX操作系统的FreeBSD版本,是UNIX操作系统阵营向普通用户进军的主力。macOS操作系统的图形化操作界面和应用程序,降低了普通用户使用操作系统和计算机的门槛。
Windows操作系统
微软公司的Windows操作系统曾出现在1983年的BYTE杂志上,并在1983年秋季的计算机经销商博览会(COMDEX)上得到了大力推广。Windows操作系统的发行是对GUI环境(如VisiCorp公司的VisiOn操作系统、苹果公司的macOS操作系统)的一种响应。Windows 1.0具有协作式多任务处理、平铺窗口、兼容DOS(磁盘操作系统)程序等功能,可以在当时的DOS上运行。到了1987年,微软公司发布了Windows 2.0。Windows 2.0在Windows 1.0的基础上添加了重叠窗口、菜单快捷键、VGA支持,以及受IBM公司的界面设计原则影响而更改的用户界面。在Windows 2.0之后,微软公司曾考虑过放弃Windows系统,并和IBM公司合作开发OS/2(OS/2是IBM公司为其第二代个人计算机PS/2研制的新一代操作系统)。由于很多方面的理念存在不同,因此微软公司最终放弃了OS/2的开发,与IBM公司的合作宣告失败。
后来,微软公司利用与IBM公司合作获得的系统开发经验和技术,开发了自己的Windows 3.0。Windows 3.0是第一个获得重点开发和商业推广的系统,它将Windows 2.0的8086、80286和80386模式组合到一个软件包中,用类似于OS/2的程序管理器和文件管理器代替了MS-DOS Executive(程序管理器)。Microsoft Office的方便易用和成功表现也使得Windows 3.0的市场反应更加出色。从这时开始,用户逐渐转向Windows平台,OS/2的市场份额不断被Windows操作系统蚕食。在此之后,微软公司相继推出了Windows 95、Windows 98和Windows Me等操作系统,带来了更强大、更稳定、更实用的桌面图形用户界面,Windows操作系统成为有史以来最成功的操作系统之一。
1993年,微软公司推出了Windows NT,最初面向服务器市场的第一个版本是Windows NT 3.1。Windows NT与通信服务紧密集成,提供文件和打印服务,能运行客户端/服务器应用程序,也内置了Internet/Intranet功能。Windows NT的其他改进包括新的辅助功能选项、新增语言和区域设置、NTFS文件系统和加密文件系统等。Windows NT 4.0和Windows NT 5.0是Windows NT 3.0系列的后续产品。从Windows NT 5.0开始,微软公司不再使用“NT”作为操作系统的名称,而将“NT”作为内核名称隐藏起来(如Windows 2000就是基于Windows NT 5.0开发的)。目前很多用户所使用的Windows操作系统基本上都是基于Windows NT架构设计的,如Windows XP(基于Windows NT 5.1),Windows Vista(基于Windows NT 6.0),Windows 7(基于Windows NT 6.1)和Windows 10(基于Windows NT 6.4,后改为Windows NT 10.0)。
Windows操作系统具有现代化的设计风格,界面整洁美观,尽量简化了各类操作,确保用户可以轻松使用计算机。同时,Windows系统也具有相当高的可靠性和良好的兼容性,能够在多种硬件平台上安全、稳定、高效地运行。
随着大量基于可视化操作界面的操作系统问世,个人计算机(PC)迅速发展,不仅性能越来越强大,而且普及度也越来越高。不过,可视化操作系统由商业公司开发,大多是直接安装在计算机上的,在降低了用户使用门槛的同时,也封闭了内在的复杂软件设计。由于这些可视化操作系统都是商业软件,因此操作系统的设计原理和源代码无法被学生和开发人员学习或使用。要想学习操作系统的具体实现,Minix操作系统仍然是当时的第一(甚至是唯一)选择。
1991年,这一情况发生了改变,在这一年,林纳斯·托瓦兹拥有了他人生中第一台配有Intel 80386中央处理器的个人计算机。他在新电脑上安装了Minix操作系统的386版本用于学习,但是他很快就发现该操作系统的虚拟终端无法满足他的要求。因此,托瓦兹决定自己编写一个终端仿真程序,顺便学习一下这台计算机的硬件工作原理。一段时间后,终端仿真程序就完成了。托瓦兹马上又对它进行改进,加入了磁盘驱动和文件驱动等功能。随着对终端仿真程序的不断改进,托瓦兹意识到自己不仅是在编写应用程序,而是在开发一个操作系统。
出于对编程的热爱,以及对Minix操作系统在功能新增上过于保守的不满,托瓦兹萌生了一个想法—— 开发一个比Minix操作系统更好、功能更全面的操作系统。因此,托瓦兹在借鉴和学习Minix操作系统的基础上,从终端仿真程序开始,逐步编写出了一个新的操作系统内核,最终推出了Linux操作系统。尽管Linux操作系统在一定程度上学习和借鉴了Minix操作系统,但是两者在设计思想上并不相同。Minix操作系统是微内核的设计,而Linux操作系统则采用与UNIX操作系统一样的宏内核设计方式。关于微内核与宏内核的区别,将在本章的1.2.2节中进行阐述。
利用大学的暑假时间,托瓦兹正式开始了“开发一个比Minix操作系统更好的操作系统”的编程之旅。经过几个月的全身心投入,1991年9月17日,托瓦兹完成并首次公开了Linux的第一个版本,版本号是0.01,编写该操作系统大部分都采用了C语言,其main函数如图1-5所示。
图1-5 Linux 0.01中的main函数
Linux 0.01是第一个可以运行的Linux操作系统,但是它还存在着很多bug,比如当内存消耗过大系统就会死机等。因此,1991年10月初,托瓦兹独自把这个内核开发到0.02版。除了修复上一版的bug,这个版本已经可以运行GCC、Bash和一些应用程序了。1991年11月初,他又发布了Linux 0.03。后来,由于一个小小的失误,托瓦兹的计算机中原本安装的Minix操作系统无法启动了,因此他就把11月底发布的新版本定为0.10版,并且安装到了自己的计算机上。几周后他又发布了Linux 0.11,操作界面如图1-6所示,该版本的已经在某些功能上强于当时Minix操作系统的386版本,而且已经被认为是一个类UNIX的内核。直到今天,依然还有很多人学习并研究Linux 0.11,通过它来了解现代操作系统,学习操作系统的设计思想。
图1-6 Linux 0.11的操作界面
1992年1月,托瓦兹在发布Linux 0.12的时候,除了改进代码,还更改了版权声明,自此,Linux操作系统开始使用通用公共许可证(GPL)。原来的许可规定不允许用户在把Linux操作系统复制或拷贝给他人时收取任何费用,改用GPL后则取消了这方面的限制,在更利于系统传播的同时也更能保证Linux操作系统自由和开源的属性。在此之后,Linux操作系统就被很多爱好者所共同开发,成为一款开放的操作系统。1992年3月,继Linux 0.12之后,托瓦兹直接发布了Linux 0.95,因为他感觉距离正式的Linux 1.0已经十分接近了。1992年5月,Linux 0.96发布,该版本首次包含了对X Window(UNIX操作系统上的一个图形界面,本书第6章将会详细介绍这些内容)的支持。1992年10月发布的Linux 0.98.2支持了部分TCP/IP协议。至此,Linux操作系统拥有了网络连接的功能。Linux 0.99发布于1992年12月,从版本号上看,它已经和1.0正式版非常接近了。托瓦兹希望Linux 1.0拥有一个能可靠运行的TCP/IP模块。但是在1993年初,TCP/IP开发并没有像预期的那样顺利,内核的更新和发布变得相对缓慢。自1993年9月底开始,Linux操作系统的版本不断更新,平均每几天就有一个新版本发布。
终于,到了1994年3月13日,Linux 1.0正式发布,该版本为Linux操作系统加入了完整的网络联网功能,并且能够支持基于i386单处理器的计算机系统。Linux内核的大小也从刚开始的63 KB变成了1 MB。不到1个月,托瓦兹推出了Linux 1.1,从这时开始,内核开始有稳定版和开发版的区分。稳定版是小数点后面为偶数的版本,如 1.0、1.2,稳定版会修补一些明显的错误,而没有添加新的特征。开发版是小数点后为奇数的版本,如1.1、1.3,该版本通常带有一些新功能。1995年3月,Linux 1.2问世。
在Linux 1.3.x系列之后,托瓦兹直接发布了Linux 2.0,而不是Linux 1.4。该版本发布于1996年,相比更早的版本,该版本支持多体系,也支持多处理器,有了一次重大意义上的提升。多体系意味着Linux操作系统可以从英特尔平台转向更广泛的平台,多处理器则可以让Linux操作系统的应用范围拓展到微型计算机、大型计算机甚至超级计算机。Linux 2.0的发布,意味着Linux操作系统已经逐渐走上成熟。从一开始Linux操作系统只能运行在个人计算机平台,到现在发展成为一个几乎完整的类UNIX内核。Linux 2.0拥有TCP/IP联网技术,支持X Window(图形环境)系统,也支持多处理器和几种完全不同的体系结构。
此后,托瓦兹于1999年和2001年分别发布了Linux 2.2和Linux 2.4。在整个Linux 2.x系列中,Linux 2.6的时间跨度非常大,从2.6.10(2003年12月发布)到2.6.39(2011年5月发布),涉及30个大版本。总的来说,从Linux 2.6开始,每个大版本的开发时间跨度大概是2~3个月,每个大版本中都有或多或少的功能改变。Linux 2.6.x系列在不断提高性能和安全性,如具备多处理器配置、64位计算和高效率线程处理等能力。
2011年7月,为了纪念Linux操作系统诞生20周年,托瓦兹宣布在Linux 2.6.39发布之后,内核版本号将提升到3.0。从Linux 3.0开始,版本号的命名规则发生了变化。内核版本号采用“X.Y.Z”的表示方法,其中X表示主版本号,Y表示次版本号,Z则表示修订号。次版本号的奇偶数不再代表开发版或稳定版,而是随着版本更新而自然增加。此后内核的开发版会以“-rc”结尾,而稳定版则只有数字。
Linux 4.0发布于2015年4月。2019年3月,托瓦兹在内核邮件列表上发布了Linux 5.0,邮件内容如图1-7所示。
图1-7 托瓦兹发布Linux 5.0的邮件内容
截至2021年12月,最新的稳定版版本号是Linux 5.15.9,如图1-8所示。根据Linux基金会(Linux Foundation)的《2020年Linux内核历史报告》,Linux 0.01包含88个文件和10,239行代码,Linux 5.8则包含了69,325个文件和28,443,673行代码。由此可见,Linux操作系统的发展是非常迅速的。
图1-8 kernel.org网站的Linux内核下载页面
其实在Linux 1.0以后,大部分代码就不再由托瓦兹本人编写,他的角色已逐渐从开发人员变成了技术领导者。不过,对于版本号的发布以及代码的整合,托瓦兹都有着最终的决定权。到目前为止,有数以万计的开发人员为Linux操作系统编写过代码,他们有的是个人开发人员,有的是来自1,700多家不同公司或机构的开发人员。有关内核的最新信息,读者可以访问Linux内核官网来获取。
在刚发布Linux之前,托瓦兹给他的内核起了一个奇怪的名字,叫作“Freax”,它是自由(Free)和古怪(Freak)的结合体,由于这个名字从来没有被正式启用过,因此内核就被命名为托瓦兹开发时使用的名字—— Linux。在Linux 2.0发布的时候,还有一个官方吉祥物—— 一只名为“Tux”的企鹅,从此Linux操作系统拥有了自己的标识,如图1-9所示。
图1-9 Linux操作系统的标识和官方吉祥物Tux
该标识由平面设计师拉里·尤因(Larry Ewing)创作。该标识的由来众说纷纭,有一种说法是托瓦兹曾被澳大利亚动物园里的一只企鹅咬了一口,由托芙(托瓦兹的妻子)提出用企鹅作为Linux操作系统的标识,也有一种说法是该标识是由托瓦兹的女儿提出的。还有一种“民间”的说法是:企鹅来自南极,而南极又是全世界所共有的一块陆地,这也代表Linux操作系统是所有人的操作系统。然而据托瓦兹所说,开发操作系统“只是为了好玩”(来自于托瓦兹的自传书《只是为了好玩》)。
Linus Torvalds
托瓦兹的全名是林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds),他设计并开发了Linux内核,被人们称为“Linux之父”。1969年12月28日,托瓦兹在芬兰的赫尔辛基市诞生。在他大约10岁左右,托瓦兹就接触到了计算机,这台计算机是他的外公为了工作需要而购买的。随着使用的深入,他开始学习BASIC和汇编语言。1988年,托瓦兹进入赫尔辛基大学学习计算机科学。1990年,托瓦兹第一次接触到UNIX操作系统,并且学习了关于UNIX操作系统的课程,这门课程配备的教材就是安德鲁教授的《操作系统:设计与实现》,托瓦兹通过这门课程学习了编写操作系统的基本思想。
1991年,还是大学生的托瓦兹自己编写了Linux操作系统内核,并把它的源代码公布到学校网站上,并通过用户的反馈来持续更新它。30多年过去了,Linux操作系统已经成为目前最大的开源操作系统之一,而且它还在不断进步、不断更新,托瓦兹也仍然领导着Linux项目。现在,几乎在所有的计算领域中都可以看到Linux操作系统的身影,大到超级计算机、服务器等设备,小到智能手机、智能穿戴设备。托瓦兹创造了一个时代,他让开源软件被人们熟知,让更多的人为开源软件做出贡献,开源的路也走得越来越远、越来越平稳。
Linux操作系统是开源软件,每个人都可以免费使用,尽管有很多基于Linux操作系统的商业化产品,但是托瓦兹对于Linux操作系统本身却没有任何商业化的想法。托瓦兹说:“我没有考虑过让Linux操作系统商业化。目前,开源对Linux操作系统的发展贡献很大,开发人员社区也很成熟。坦白讲,我也不擅长做这个。我喜欢通过开源让各地的开发爱好者们参与其中,做他们擅长做的事。这也意味着我可以专注于技术,而其他人可以帮忙推广。在很长一段时间里,我不让自己进入跟Linux操作系统有关的营利性公司,于是进入了一家跟Linux操作系统毫无关联的创业公司,这样就不会让我的个人主观偏好影响到工作。过去10年,尽管我做的是跟Linux操作系统相关的工作,并且也因此获得薪水,但是为了不参与到带有倾向性的竞争中,我加入了一家非营利组织(Linux基金会)。这样,我的‘维护者’的角色就能得到大家的认可。”
尽管托瓦兹已经为Linux操作系统持续工作了30多年,但是他依然对这个项目充满热情,并对内核中持续出现的新技术和新创新感到兴奋和惊叹。我们在学习Linux操作系统的同时,也应该学习托瓦兹这种一直向前的精神。
1.1.2 Linux操作系统的特点
Linux操作系统能够在服务器上长时间保持稳定而高效的工作,同时,Linux操作系统也受到PC端的持续关注。近年来,随着图形用户界面的不断改进,Linux的易用性也变得越来越好,许多用户都在学习使用Linux操作系统。综合来看,Linux操作系统有如下7点突出优势。
● 获取成本低。Linux内核是免费发布的,基于Linux内核开发的各类发行版基本上也是免费发布的。尽管也有商业化的Linux操作系统,但是它们一般是按需收取技术支持和服务费用的。哪怕是运行在服务器上的Linux操作系统,也基本上不向用户收取或少收取费用。
● 稳定和可靠。Linux操作系统的内核和系统组件不仅能在工作的数月内保持稳定,而且在长时间的运行中也能保证性能没有明显下降。同时,Linux操作系统也能够在CPU满负荷状态下持续工作,极少出现系统故障。另外,Linux操作系统在进行系统升级、驱动安装、参数配置等操作之后,除非要用到某些关键词的内核功能,否则在正常情况下无须重新启动系统。
● 多用户和多任务。Linux操作系统支持多个用户使用同一台计算机,并且通过权限来保护不同用户的文件,防止相互影响。多任务则是现代操作系统的一大特点,Linux操作系统允许多个程序(进程)同时且独立地运行。
● 多种用户界面。Linux操作系统可以支持纯命令行界面(也称为字符界面)的操作,一般适用于经验丰富的用户,这对于远程控制、服务器操作都非常便利。同时,Linux操作系统也支持图形用户界面的操作,且适用于任何用户,方便用户通过鼠标点击、触摸屏的方式操作计算机,对用户很友好。不论是命令行界面还是图形界面,用户都可以对Linux操作系统进行自由配置,满足用户的个性化需求。
● 支持多种平台。Linux操作系统可以在多种平台上运行,如x86、x64、ARM、LoongArch64、Alpha等多种计算机处理器平台,小到笔记本计算机,大到特大型机、超级计算机,都能运行Linux操作系统。此外,它也支持各类嵌入式平台,如机顶盒、路由器、交换机、掌上游戏机等。
● 开放源代码。Linux操作系统是开源系统,任何人都可以方便地从网上免费获取Linux内核源码。人们可以自由地修改代码、添加功能,通过编程来进一步了解操作系统的工作原理,遇到困难时还可以通过指导手册、帮助文档、论坛和网络资源来寻求答案。通过学习Linux源代码,很多使用C语言进行开发的工程师、学生、研究人员可以快速提高开发能力。开源Linux操作系统适用于用C语言进行开发的用户,它是一个极好的C语言进阶编程教学示例。不仅如此,Linux操作系统也接受任何人提交的修复和升级补丁,使得整个系统更加稳定和先进。
● 可定制性。Linux的一大特色就是它的可定制性,用户可以根据自身需求来定制自己的操作系统,简单的有桌面布局、图标、菜单选项的搭配,专业的有计算机脚本、虚拟终端、硬盘文件系统的配置,甚至连内核的运行参数、计算机的启动引导方式等都可以进行修改。
任何人都可以提交修复补丁
在很多人的理解中,提交补丁是程序高手才能做到的事。实际上,任何有用的、具有修复或改进功能的补丁都会被接受,甚至不一定是代码本身,所以并不一定是会写程序的人才能提交补丁。2014年,一个4岁的小女孩提交了Linux操作系统的补丁邮件(如图1-10所示),并且这个补丁已被合并到代码中。她所提交的补丁其实只是代码注释中的一个“-”字符,虽然这只是一个很小的修改,但是修改的意义却非常大。这说明了Linux操作系统有两个很重要的特征:
(1)Linux内核的代码修改可以让所有人参与进来;
(2)Linux内核非常严谨,只要有错误,任何人都可以修改它。
图1-10 4岁的小女孩提交的补丁邮件