前文中我们曾经说过,Linux操作系统的架构属于“复杂内核”(Monolithic Kernel),而不是“微内核”。有很多人都在探求这之间究竟存在什么哲学道理,然而很显然这只是来自于“工科男”的直白思想:我才不管什么样的架构设计从理念上最美,能用的才是最美的。
讽刺的是,Linus Torvalds所借鉴的Minix,恰恰是基于“微内核”理念设计实现的。也许这仅仅是因为基于微内核架构编写出来的代码更容易阅读和理解吧。
那一年,Torvalds 21岁。在瑞士赫尔辛基大学求学的他开始了“编写操作系统内核”的践行之路。在一开始的时候,他手头能用的只有80386的汇编语言、CPU内置的任务切换器,以及一个终端驱动程序。他的工作从1991年的四月开始,持续到了8月。在那之后,Torvalds 在Minix的新闻组论坛上提交了一篇小短文,他是这么说的:
我正在为386(486)平台开发一个免费的操作系统(这只是个爱好,不会像GNU那么专业)从4月酝酿,到现在它已经初露端倪了。我想要从喜欢或不喜欢Minix的人当中得到一些反馈(比如文件系统啦什么的)。我现在已经移植了bash(1.08)与gcc(1.40),似乎都挺顺利。这意味着几个月内,我就能拿出点东西来了。是的,它没有照抄任何Minix的代码,并且文件系统支持多线程。它不是跨平台的(因为它使用了386的任务切换等机制),也许它永远也不会支持除AT硬盘之外的任何设备,因为那就是我所拥有的全部器材了。
1991年9月,Torvalds向FUNET的FTP上传了0.01版的Linux内核源码。它甚至是不能独立运行的,它依然需要Minix作为编译与运行环境。
然而一个月之后,Torvalds 就对外宣布了第一个“官方”版本--Linux 0.02。在这个版本中,Linux已经可以运行Bash,GCC以及其他GNU工具了。
从那开始,越来越多的人开始为项目贡献代码,贡献者甚至来自于Minix的社区。与此同时,为GNU缺少自家操作系统内核而愁眉不展的“黑客”们仍然在捣鼓着他们遥遥无期的"Hurd"。而伯克利软件公司也没有开放他们的免费Unix版本。在这个间歇期内,Linux的声势愈发高涨,收获了很多开发中坚力量与铁杆用户。
事情发展的很快,到了1991年的12月,0.11版的Linux发布了,它终于脱离了Minix“妈妈”的怀抱,成为一个能够自己编译并运行自己的内核。
1992年的2月,0.12版的Linux发布。Torvalds 将他的源码以GPLv2协议开源。从那时起,任何人都可以免费得到Linux的源码,包括驱动程序。这一切都归功于世界各地为Linux贡献力量的程序员与测试员。后来,Linux还支持了标准的POSIX API,这样很多Unix程序就可以在Linux上面运行了。
1992年1月,LInux的新闻组被创立起来了(在国外,有了新闻组好像是件很牛逼的事情)。在那之后,发生了一件有意思的事情。代表“微内核”的Minix创始人Tanenbaum与代表“复杂内核”的Linux创始人Torvalds通过新闻组展开了一场“唇枪舌战”。
如果感兴趣的话,你可以从网上找到这些“新闻组”的内容,阅读起来还蛮有意思的。这里节录并翻译一段:
Tanenbaum
我最近在美国待了一段时间,所以对Linux没怎么发表看法,但对于它的价值,我现在倒想说道说道。
你们大概都知道,MINIX操作系统只是我的业余爱好,只有我写书写烦了,电视上又没什么大事让人操心的时候,我才有兴致码两句代码。我的真正职业是教授,专业研究操作系统的教授。
基于我职业方面的原因,我对操作系统未来十年的发展,还是有自己的看法的:
绝大多数老牌操作系统是复杂内核,这意味着,整个操作系统就是一个以“内核态”运行的a.out文件。这个二进制文件包含进程管理、内存管理、文件系统及其他。像这样的操作系统我可以列举出一堆:UNIX, MS-DOS, VMS, MVS, OS/360,MULTICS等等。
而另外一种选择就是基于“微内核”的操作系统,在这之间,系统是以不同的“进程”运行的,大多数独立于内核之外。进程之间通过消息进行通信。而内核的工作,就是处理消息传输、系统中断、低级别的任务管理,还可能包含一些IO操作。这样的操作系统包括 RC4000, Amoeba, Chorus, Mach,以及尚未发表的 Windows/NT。
关于这两种系统内核设计上的优劣,我可以说上一年都说不完,但我觉得我已经说得够多了,对于从事这两种系统设计的人来说,争端应该结束了。微内核已经胜出。复杂内核的那些人还在纠缠于它们有更好的性能表现,然而很多证据已经打了他们的脸,微内核在性能方面能够跟复杂内核一样优秀(详情请参考Rick Rashid发布的参数报告)。所以一切都结束了,你们再叫唤也没用。
MINIX是基于微内核的操作系统。文件系统与内存管理独立于不同的进程中,在内核之外运行。同样,I/O驱动程序也拥有独立的进程(在内核中,只是因为IntelCPU的“脑死亡”特性,让我们很难把它移植出去)。Linux是复杂内核的系统,这是向1970年操作系统的大幅回退。这就好比你非得把C语言的程序,用BASIC语言重写一遍。对我来说,1991年还写复杂内核的操作系统,简直逊爆了。
Tanenbaum 教授特有的发际线
原文:
I was in the U.S. for a couple of weeks, so I haven't commented much on LINUX (not that I would have said much had I been around), but for what it is worth, I have a couple of comments now.As most of you know, for me MINIX is a hobby, something that I do in the evening when I get bored writing books and there are no major wars,revolutions, or senate hearings being televised live on CNN. My real job is a professor and researcher in the area of operating systems.
As a result of my occupation, I think I know a bit about where operating are going in the next decade or so. Two aspects stand out:
Most older operating systems are monolithic, that is, the whole operating system is a single a.out file that runs in 'kernel mode.' This binary contains the process management, memory management, file system and the rest. Examples of such systems are UNIX, MS-DOS, VMS, MVS, OS/360,MULTICS, and many more.
The alternative is a microkernel-based system, in which most of the OS runs as separate processes, mostly outside the kernel. They communicate by message passing. The kernel's job is to handle the message passing,interrupt handling, low-level process management, and possibly the I/O.Examples of this design are the RC4000, Amoeba, Chorus, Mach, and the not-yet-released Windows/NT.
While I could go into a long story here about the relative merits of the two designs, suffice it to say that among the people who actually design operating systems, the debate is essentially over. Microkernels have won.The only real argument for monolithic systems was performance, and there is now enough evidence showing that microkernel systems can be just as fast as monolithic systems (e.g., Rick Rashid has published papers comparing Mach 3.0 to monolithic systems) that it is now all over but the shoutin`.
MINIX is a microkernel-based system. The file system and memory management are separate processes, running outside the kernel. The I/O drivers are also separate processes (in the kernel, but only because the brain-dead nature of the Intel CPUs makes that difficult to do otherwise). LINUX is a monolithic style system. This is a giant step back into the 1970s.That is like taking an existing, working C program and rewriting it in BASIC. To me, writing a monolithic system in 1991 is a truly poor idea.
Torvalds
好吧,话都说到这个份上了,我恐怕必须得回击一下了。
MINIX的铁粉们,最近你们老是听到Linux一些传闻,真是对不住啊。我本来不想搭理某些人带节奏的。但是..你叔能忍你婶也不能忍了啊!
你就用这些借口来回复MINIX局限性的问题?(指业余时间开发,写书和看新闻才是主业云云...)对不起,这个借口弱爆了。我本应该比你更有借口,但是Linux仍然在各个领域全方位碾压了MINIX。更不用说那些高质量的MINIX代码,都是 Bruce Evans写出来的。
你说你用业余时间开发MINIX,看看是谁在用MINIX赚钱,谁又毫无保留的把Linux开源免费吧。从这点上来说,到底谁是“爱好”,明眼人一看就知道。你有本事把MINIX免费啊,那样我对MINIX的抱怨能消去一大半。我对Linux才是业余爱好:我对它分文不取,它也不是我在学校里的研究方向。我开发Linux用尽了我的业余时间,并且还是使用我的个人电脑。
你说你是一个专业搞研究的教授:这才是MINIX真正让人觉得让人吊胃口的地方。我真希望自己看到MINIX时不会像看到变形虫那么恶心。
(对于你对微内核与复杂内核之间的比较)
确实,Linux是复杂内核,我也同意微内核是个好主意。作为一个不太有争议的话题,我对你的大多数意见表示同意。从理论和美学角度,Linux的确有点欠缺。如果GNU的内核去年春天就搞出来了,我还用这么大费周章吗:然而事实是,到现在都没有。Linux胜就胜在现在就有能拿得出手的东西。
(对于MINIX是微内核,而Linux是复杂内核)
如果选对了内核就该自嗨,那你就自鸣得意去吧。你咋不提MINIX把微内核实现成什么熊样了,连多任务处理都有问题。如果我连多线程文件系统都没完全做好的话,我不会这么快就板起脸来教训别人。我会拼命修正这些问题,避免让别人揪住这个短处说三道四。
Torvalds 工程师的气质
原文
Well, with a subject like this, I'm afraid I'll have to reply.Apologies to minix-users who have heard enough about linux anyway. I'd like to be able to just "ignore the bait", but ... Time for some
serious flamefesting!
You use this as an excuse for the limitations of minix? Sorry, but you loose: I've got more excuses than you have, and linux still beats the pants of minix in almost all areas. Not to mention the fact that most of the good code for PC minix seems to have been written by Bruce Evans.
Re 1: you doing minix as a hobby - look at who makes money off minix,and who gives linux out for free. Then talk about hobbies. Make minix freely available, and one of my biggest gripes with it will disappear.Linux has very much been a hobby (but a serious one: the best type) for me: I get no money for it, and it's not even part of any of my studies in the university. I've done it all on my own time, and on my own machine.
Re 2: your job is being a professor and researcher: That's one hell of a good excuse for some of the brain-damages of minix. I can only hope (and assume) that Amoeba doesn't suck like minix does.
True, linux is monolithic, and I agree that microkernels are nicer. With a less argumentative subject, I'd probably have agreed with most of what you said. From a theoretical (and aesthetical) standpoint linux looses.If the GNU kernel had been ready last spring, I'd not have bothered to even start my project: the fact is that it wasn't and still isn't. Linux wins heavily on points of being available now.
If this was the only criterion for the "goodness" of a kernel, you'd be right. What you don't mention is that minix doesn't do the micro-kernel thing very well, and has problems with real multitasking (in the kernel). If I had made an OS that had problems with a multithreading filesystem, I wouldn't be so fast to condemn others: in fact, I'd do my damndest to make others forget about the fiasco.
回到Linux内核版本的发布情况。
到了0.95版,Linux上可以运行X Windows了。
1994年3月,Linux的1.0.0发布版拥有超过十七万行的代码。它成为了可用于生产环境的第一个稳定版本。
从那开始,Linux的版本格式有了自己的规划。它由三段数字组成。其中第一段数字是主要版本号,第二段数字是小版本号,而第三段数字是修订版本号。其中,奇数小版本是用来开发与测试的,而偶数小版本则是正式的生产化版本。后来,又引入了第四段数字,用来代表对修订版本的修补(补丁)。
然而那都是过去式了,现在版本号的意义与之前有很大的不同。首先,通过奇数偶数来区分测试开发还是正式版的方式,已经被废弃了。现在的版本号规则很迷,但我们只要知道,除了明显标注的“候选版”(在后面加上rc1、rc2...),其他都是正式版本就好了。
在1.3版本之后,Torvalds觉得Linux已经有了足够的提升,可以升级一个大版本号了,于是1996年就有了Linux2.0.0。
从2.0版本开始,Linux可以根据不同的硬件环境设置不同的编译开关选项了。kbuild下的make config家族支持成千上万个配置项,用于让使用者决定是否加载内核的各种特性。
内核支持的文件系统也越来越多。有些是专门为Linux设计的,比如ext3、ext4,Btrfs,而其他的则是为了和别的操作系统兼容,比如来自于Minix、Xenix、Irix、Solaris、System V、Windows甚至是MS-DOS操作系统的文件系统。
2005年,“版本维稳小组”成立了,他们的职责就是组织一个“内核树”,从而方便人们为Linux修改Bug。同时他们还会持续更新稳定的版本。2008年2月,Linux的内核树上生长出来一个重要的分支--Linux Next。这是用来服务于Linux的下一个版本迭代周期的。很多的子系统维护者也纷纷采用了 -next作为后缀,这意味着这些代码将会在下一个版本周期中被提交。2014年1月,Linux开发版正式与这个专用的不稳定的内核树分支--Linux-next关联起来了。
Linux曾经没有任何自动化的源代码管理工具,到了2002年,开发者们开始使用BitKeeper进行源代码管理。Bitkeeper是可以免费下载到的工具,但它从来没有申明可以被免费使用。2005年,由于很多人尝试反编译Bitkeeper,Bitkeeper的开发者表示要对Linux社区开始收费了。作为回应,Torvalds 担纲开发出了Git。整套Git系统不过用了几周开发完成,两个月后,第一个使用Git发布的Linux内核版本就诞生了。
Torvalds在2011年7月为Linux举办了20周年庆典,在庆典上,Torvalds公布了3.0.0的内核版本。而到那时,Linux2.6已经服役8年了。
在2015年4月,Torvalds 又公布了4.0。至此,已经有将近来自于超过一千家公司的一万两千名程序员为Linux贡献了代码。
虽然说Linux是复杂内核,但它有一项非常前卫的设计,就是可以在运行时加载或卸载LKM。
那么什么是LKM呢?LKM是 loadable kernel module的缩写,也就是可加载模块。可不要小瞧LKM,它里面包含了一些对于内核的扩展程序。这样我们就可以在运行时动态的为内核加入一些新的功能或特性了。LKM通常被用来支持新的硬件设备或文件系统,甚至你可以通过它来添加更多的system calls。LKM可以按需加载,也可以按需卸载。这样,当你的新设备移除时,相关内核模块完全可以从内存中释放出去,这样在资源调配上就更加灵活了。
这在当时是比较先进的技术和理念,当然现在的大多数操作系统都支持了,只不过是换了不同的称谓。比如FreeBSD的KLD(kernel loadable module),macOS的KEXT(kernel extension),AIX的kernel extension module,Windows下的kernel-mode driver,VxWorks的DKM( downloadable kernel module)等待。它还有一个广为人知的名字,就是KMOD。
(如果你想深入研究Linux下如何动态加载内核模块,请搜索一下modprobe、insmod等相关工具)
Linux内核的很多功能特性,这里就不一一展开了(水平有限,也展开不了):
并发运算与多进程的并行运行
可配置功能(configurable features)及运行时可控策略(controllable policies at runtime)
基于分页虚拟内存的高级内存管理技术
多进程间通信与同步机制
基于文件系统的虚拟化文件系统
可配置的I/O调度(configurable I/O schedulers)
内置的虚拟化技术
安全管理机制
多种协议栈的实现
驱动程序在内核态运行(CPU保护环的0环)
以文件层级结构对硬件进行规划和管理(The hardware is represented in the file hierarchy) |