- Linux的诞生和发展
Linux操作系统是UNIX操作系统的一种克隆模式。它诞生于1991年10月5日(这是第一次正式向外公布时间)。此后借助Internet,经过全世界各地计算机爱好者的共同努力,现已成为当今世界上使用最多的一种UNIX类操作系统,并且使用人数还在存猛增长。
Linux操作系统的诞生、发展和成长过程依赖于以下五个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet。
目前2017年11月Linux内核版本已经开发到4.14.2版,Linux内核版本号命名的规则:r.x.y
* r:表示目前发布的内核主版本。
* x:x是偶数表示稳定版本; 若是奇数表示开发中版本。
* y: 修订版本号,表示修改的次数。
- UNIX操作系统的诞生
UNIX操作系统是美国贝尔实验室的Ken Thompson和Dennis Ritchine于1969年夏天在DEC PDP-7小型计算机上开发的一个分时操作系统。当时是使用BCPL语言(基本组合编程语言),后经Dennis Ritchie于1972年用移植性很强的C语言进行了改写,使得UNIX系统在大专院校得到推广。
- MINIX操作系统
MINIX系统是由Andrew S.Tanenbaum开发的。Tanenbaum在荷兰阿姆斯特丹的Vrije大学数学与计算机科学系工作,是ACM和IEEE的资深会员(全世界也只有很少的=人是两会的资深会员)。共发表了100多篇文章和5部计算机著作。
MINIX是他1987年编制的,主要用于学生学习操作系统的原理。当时该操作系统在大学使用是免费的。对于Linux系统,他后来曾表示对其开发者Linus的称赞。但他认为Linux的发展很大的原因是由于他为了保持MINIX的小型化,能让学生在一个学期内就能学完,因而没有接纳全世界许多人对MINIX的扩展要求。因此在这样的前提下Linus编写了Linux系统。
作为一个操作系统,MINIX并不是优秀者,但它同时提供了用C语言和汇编语言编写的系统源代码。这是第一次使得有抱负的程序员或黑客能够阅读操作系统的源代码。在当时,这种源代码是软件商们一直小心守护的秘密。
- GNU计划
GNU计划和自由软件基金会FSF(the Free Software Foundation)是由Richard M.Stallman于1984年一手创办的。易在开发一个类似UNIX并且是自由软件的完整操作系统:GNU系统(GNU是”GNU’s Not UNIX”的递归缩写,他的发音为“guh-NEW”)。各种使用Linux作为Linux作为核心的GNU操作系统正在被广泛使用。虽然这些系统通常被称作“Linux”,但是Stallan认为,严格地说,他们应该被称为GNU/Linux系统。
到20世纪90年代初,GNU项目已经开发出许多高质量的免费软件,其中包括有名的emacs编辑系统、bash shell程序、gcc系列编译程序、gdb调试程序等等。这些软件为Linux操作系统的开发创造了一个合适的环境,是Linux能够诞生的重要因素。
- POSIX标准
POSIX(Portable Operating System Interface fir Computing Systems)是由IEEE和ISO/IEC开发的一簇标准。该标准基于现有的UNIX实践的和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植和运作。它是在20世纪80年代一个UNIX用户组(usr/group)的工作基础上取得的。该UNIX用户组原来试图将AT&T的System V操作系统和Berkeley CSRG的BSD操作系统的调用接口之间的区别重新调和集成。
在1991年7月3日,Linus在comp.os.minix上提到,他正在搜集POSIX的资料。其中透露了他正在着手一个操作系统的开发,并且在开发之初已经想到要实现POSIX兼容的问题。
- Linux操作系统的诞生
在1981年,IBM公司推出了享誉全球的微型计算机 IBM PC。在1981~1991年间,MS-DOS操作系统一直是微型计算机操作系统的主宰。此时计算机硬件价格虽然逐年下降,但软件价格仍然居高不下。当时Apple的 Mac操作系统可以说是性能最好的,但是其天价使得没人能够轻易靠近。
当时的另一个计算机技术阵营就是UNIX世界。但是UNIX操作系统就不仅是价格昂贵的问题了。为了寻求高利润率, UNIX经销商们把价格抬得极高,PC小用户根本不能靠近它。一度得到Bell Labs许可而能在大学中用于教学的UNIX源代码也一直被小心地守卫着不许公开。对于广大的PC用户,软件行业的大型供应商们始终没有给出有效的解决这个问题的手段。
正在此时,出现了MINIX操作系统,并且有一本描述其设计实现原理的书同时发行。由于Tanenbaum的这本书写得非常详细,并且叙述得有条有理,于是几乎全世界的计算机爱好者都开始看这本书,以期能理解操作系统的工作原理。其中也包括Linux系统的创始者Linus Torvalds。
当时(1991年),Linus是赫尔辛基大学计算机科学系的二年级学生,也是一个自学的计算机hacker。这个21岁的芬兰年轻人喜欢鼓捣他的计算机,测试计算机的性能和限制。但当时他所缺乏的就是一个专业级的操作统
在同一年间,GNU计划已经开发出了许多工具软件。其中最受期盼的GNU C编译器已经出现,但还没有开发出免费的GNU操作系统。即使是教学使用的MINIX操作系统也开始有了版权,需要购买才能得到源代码。虽然GNU的操作系统HURD一直在开发之中,但在当时看来不能在几年内完成。
为了能更好地学习计算机知识(或许只是出于兴趣),Linus使用圣诞节的压岁钱和贷款购买了一台386兼容电脑,并从美国邮购了一套MINIX系统软件。就在等待MINIX软件期间,Linus认真学习了有关Intel 80386的硬件知识。为了能通过Modem拨号连接到学校的主机上,他使用汇编语言并利用80386 CPU的多任务特性编制出一个终端仿真程序。此后为了将自己一台老式电脑上的软件复制到新电脑上,他还为软盘驱动器、键盘等硬件设备编制出相应的驱动程序。
通过编程实践,并在学习过程中认识到MINIX系统的诸多限制(MINIX虽然很好,但只是一个用于教学目的简单操作系统,而不是一个强有力的实用操作系统),Linus已经有了一些类似于操作系统硬件设备驱动程序的代码,于是他开始有了编制一个新操作系统的想法。此时GNU计划已经开发出许多工具软件,其中最受期盼的GNU C编译器已经出现。虽然GNU的免费操作系统HURD正在开发中。但Linus已经等不急了。
从1991年4月份起,他通过修改终端仿真程序和硬件驱动程序,开始编制起自己的操作系统来。刚开始,他的目的很简单,只是为了学习Intel 386体系结构保护模式运行方式下的编程技术。但后来Linus却完全改变了初衷。根据Linus在comp.os.minix新闻组上发布的消息,我们可以知道他逐步从学习 MINIX系统阶段发展到开发自己的Linux系统的过程。
Linus第一次向comp.os.minix投递消息是在1991年3月29日。所发帖子的题目是“gcc on minix-386 doesn’t optimize”,是有关gcc编译器在MINIX-386系统上运行优化的问题(MINIX-386是一个由Bruce Evans改进的利用Intel 386特性的32位MINIX系统)。由此可知,Linus在1991年初期就已经开始深人研究了MINIX系统,并在这段时间有了改进MINIX操作系统的思想。在进一步学习MINIX系统之后,这个想法逐步演变成设计一个基于Intel 80386体系结构的新操作系统的构思。
他在回答有人提出MINIX上的一个问题时,所说的第一句话就是“阅读源代码”。他认为答案就在源程序中。这也说明了对于学习系统软件来说,我们不光需要懂得系统的工作基本原理,还需要结合实际系统,学习实际系统的实现方法。因为理论毕竟是理论,其中省略了许多枝节,而这些枝节问题虽然没有太高的理论含量,却是一个系统必要的组成部分,就像麻雀身上的一根羽毛。
从1991年4月份开始,Linus几乎花费了全部时间研究MINIX-386系统(Hacking the kernrl),并且尝试着移植GNU的软件到该系统上(GNU gcc、bash、gdb等)。并于4月13日在comp.os.minix上宣布自己已经成功地将bash移植到了MINIX上,而且己经不能离开这个shell软件了。
第一个与Linux有关的消息是在1991年7月3日在comp.os.minix上发布的(当然,那时还不存在Linux这个名称,当时Linus脑子里想的名称可能是FREAX,FREAX的含义是怪诞的、怪物、异想天开等)。其中透露了他正在进行Linux系统的开发,并且已经想到要实现与POSIX兼容的问题了。
在Linus发布的另一个消息中(1991年8月25日,comp.os.minix),他向所有MININ用户询问“你最想在MINIX系统中见到什么?”(“What would you like to see in minix?”),在该消息中他首次透露出正在开发一个(免费的)386(486)操作系统,并且说只是兴趣而已,代码不会很大,也不会像GNU的那样专业。希望大家反馈一些对于MINIX系统中喜欢哪些特色不喜欢什么等信息,并且说明由于实际和其他一些原因,新开发的系统刚开始与MINIX很像(并且使用了MINIX的文件系统)。并且已经成功地将bash(1.08版)和gcc(1.40版)移植到了新系统上,而且再过几个月就很实用了。
最后,Linus声明他开发的操作系统没有使用一行MINIX的源代码;而且由于使用了386的任务切换特性,所以该操作系统不好移植(没有可移植性),并且只能使用AT硬盘。对于 Linux的移植性问题,Linus当时并没有考虑。但是目前Linux几乎可以运行在任何一种硬件体系结构上。
到了1991年的10月5日,Linus在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核系统的诞生(Free minix-like-kernel sources for 386-AT。这段消息可以称为Linux的诞生宣言,并且一直广为流传。因此10月5日对Linux社区来说是一个特殊的日子,许多后来Linux的新版本发布时都选择了这个日子。
- Linux操作系统版本变迁
Linux操作系统从诞生到1.0版正式出现,共发布了下表中所示的一些主要版本。Linus在2003年9月份开始学习使用版本管理工具BitKeeper时又把以上这些1.0之前的所有版本浏览了一遍。实际上,Linux系统并没有0.00这个版本,但是自从Linus在自己的80386兼容机上尝试在时钟中断控制下两个任务相互切换运行并获得成功时,在某种程度上更增强了他开发自己操作系统的想法。因此我们也列为一个版本。Linux0.01版内核于1991年9月17日编制完成。但是Linus还根本没有版权意识,所以仅在该版的include/string.h文件中出现一次版权所有信息。该版本内核的键盘驱动程序仅硬编码进芬兰语代码,因此也只支持芬兰键盘。也只支持8MB物理内存。由于后Linus一次操作失误,导致随后的0.02、0.03版内核源代码被破坏丢失。
版本号 | 发布/编制日期 | 说明 |
---|---|---|
0.00 | 1991.2~4 | 两个进程,分别在屏幕上显示“AAA…”和“BBB…”(注:没有发布) |
0.01 | 1991.9.17 | 第一个正式向外公布的Linux内核版本。多线程文件系统、分段和分页内存管理。还不包含软盘驱动程序 |
0.02 | 1991.10.5 | 该版本以及0.03版是内部版本,目前己经无法找到。特点同上 |
0.10 | 1991.10 | 由 Ted Ts’o发布的Linux内核版本。增加了内存分配库函数。在boot目录中含有一个把as86汇编语法转换成gas汇编语法的脚本程序 |
0.12 | 1992.1.15 | 主要增加了数学协处理器的软件模拟程序。增加了作业控制、虚拟控制台、文件符号链接和虚拟内存对换(swapping)功能 |
0.95.x (即0.13) | 1992.3.8 | 加人虚拟文件系统支持,但还是只包含一个MINIX文件系统。增加了登录功能。改善了软盘驱动程序和文件系统的性能。改变了硬盘命名和编号方式。原命名方式与MINIX系统的相同,此时改成与现在Linux系统的相同。支持CDROM |
0.96.x | 1992.5.12 | 开始加人UNIX socket支持。增加了 ext文件系统测试程序。 I驱动程序被正式加人内核。软盘类型自动识别。改善了串行驱动、高速缓冲、内存管理的性能,支持动态链接库,并开始能运行 x· Wind“程序。原汇编语言编制的键盘驱动程序已用 c重写。与0,95内核代码比较有很大的修改 |
0.97.x | 1992.8.1 | 增加了对新的SCSI驱动程序的支持;动态高速缓冲功能; msdos和ext文件系统支持;总线鼠标驱动程序。内核被映射到线性地址3GB开始处 |
0.98.x | 1992.9.28 | 改善对TCP/IP(0.8.1)网络的支持,纠正了extfs的错误。重写了内存管理部分(mm),每个进程有4GB逻辑地址空间(内核占用1GB)。从0.98.4开始每个进程可同时打开256个文件(原来是32个),并且进程的内核堆栈独立使用一个内存页面 |
0.99.x | 1992.12.13 | 重新设计进程对内存的使用分配,每个进程有4GB线性空间 |
1.0 | 1994.3.14 | 第一个正式版本 |
现存的010版内核代码是 Ted Ts’o当时保存下来的版本, Linus自己的也已经丢失。这个版本要比前几个版本有很大的进步,在这个版本内核的系统上已经能够使用GNU编译内核,并且开始支持加载/卸载(mount/umount)文件系统的操作。从这个内核版本开始,Linus为每个文件都添加了版权信息:“(C)1991 Linus Torvalds”。该版本的其他一些变化还包括:把原来引导程序boot/boot.s分割成boot/bootsect.s和boot/setup.s两个程序;最多支持16M物理内存;为驱动程序和内存管理程序分别建立了自己的子目录;增加了软盘驱动程序;支持文件预读操作;支持dev/port和dev/null设备;重写了kemel/signal.c代码,添加了对sigaction()的支持等。
相对0.10版来说,Linux0.11版的改动较小。但这个版本也是第一个比较稳定的版本,并且开始有其他人员参与内核开发。这个版本中增添的主要功能有:执行程序的需求加载;启动时可执行/etc/rc初始文件;建立起数学协处理器仿真程序框架程序结构;Ted Ts’o增加了对脚本程序的处理代码;Galen Hunt添加了对多种显示卡的支持;John T.Kohl修改了kernel/console.c程序,使控制台支持鸣叫功能和 KILL字符;提供了对多种语言键盘的支持。
Linux012是Linus比较满意的内核版本,也是一个更稳定的内核。在1991年的圣诞节期间,他编制完成了虚拟内存管理代码,从而在只有2MB内存的机器上也能使用像gcc这种“大型”软件。这个版本让Linus觉得发布1.0内核版本已经不是什么遥遥无期的事了,因此他立刻把下一个版本(013版)提升为0.95版。Linus这样做的另一个意思是让大家不要觉得离1.0版还很遥远。但是由于0.95版发布得太仓促,其中还包含较多错误,因此0.95版刚发布时曾有较多Linux爱好者在使用中遇到问题。当时Linus觉得就好像遇到了一个大灾难。不过此后他接受了这次的教训,以后每次发布新的内核版本时,他都会进行更周密的测试,并且让几个好朋友先试用后才会正式公布出来。0.12版内核的主要变化之处有:Ted Ts’o添加了终端信号处理支持;启动时可以改变使用的屏幕行列值;改正了一个文件IO引起的竞争条件;增加了对共享库的支持,节省了内存使用量;符号连接处理;删除目录系统调用;Peter MacDonald实现了虚拟终端支持,使得Linux要比当时的某些商业版UNIX还要更胜一筹;实现对select()函数的支持,这是Peter MacDonald根据一些人为MINIX提供的补丁程序修改而成的,但是MINIX却没有采纳这些补丁程序;可重新执行的系统调用;Linus编制完成数学协处理器仿真代码等。
0.95版是第一个使用GNU GPL版权的Linux内核版本。该版本实际上有3个子版本,由于1992年3月8日发布第1个0.95版时遇到了一些问题,因此此后不到10天(3月17日)就立刻发布了另一个0.95a版,并在1个月后(4月9日)又发布了0.95c+版本。该版本的最大改进之处是开始采用虚拟文件系统VFS结构。虽然当时仍然只支持MINIX文件系统,但是程序结构已经为支持多种文件系统进行了大范围调整。有关MINIX文件系统的代码被放进了单独一个MINIX子目录中。0.95版内核的其他一些变化部分有:增加了登录界面;Ross Biro添加了调试代码(ptrace);软盘驱动器磁道缓冲;非阻塞管道文件操作;系统重启(Ctrl-Alt-Del);swapon()系统调用,从而可以实时选择交换设备;支持递归符号链接;支持4个串行端口;支持硬盘分区;支持更多种类键盘;James Wiegand编制了最初的并行口驱动程序等。
另外,从0.95版开始,对内核的许多改进工作(提供补丁程序)均以其他人为主了,而Linus的主要任务变成对内核的维护和决定是否采用某个补丁程序。到现在为止,最新的内核版本是2017年11月24日公布的4.14.2版。在4.14.2版本中包括65000多个文件,其源代码压缩包linux-4.14.2.tar.xz文件有97MB。
- Linux名称由来
Linux操作系统刚开始时并没有被称作Linux,Linus给他的操作系统取名为FREAX,其含义是怪诞的、怪物、异想天开的意思。在他将新的操作系统上载到ftp.funet.fi服务器上时,管理员Air Lemke很不喜欢这个名称。他认为既然是Linus的操作系统就取其谐音Linux作为该操作系统的名称吧,于是linux这个名称就开始流传下来。