当前位置:嗨网首页>书籍在线阅读

05-Linux内核

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

1.2.2 Linux内核

1991年,Linus Torvalds,一位芬兰赫尔辛基大学的学生,在外界的激励下为自己的Intel 80386 PC开发了一个操作系统。在一门学习课程中,Torvalds开始接触Minix——由荷兰大学教授Andrew Tanenbaum于20世纪80年代中期开发的一款小型、类UNIX的操作系统内核。Tanenbaum将Minix连同源码完全开放,作为大学操作系统设计课程的教学工具。人们可以在386系统上构建并运行Minix内核。当然,正因为其主要用于教学,Minix在设计上几乎独立于硬件架构,故而也未对386处理器的能力充分加以利用。

因此,为了开发出一个高效而又功能齐备的UNIX内核,Torvalds开始“自力更生”。数月之后,Torvalds开发出一个内核“雏形”,可以编译并运行各种GNU程序。随之,于1991年10月5日,为求得其他程序员的帮助,Torvalds在Usenet新闻组comp.os.minix上就其内核0.02版发表了如下申明,如今已被广为引用。

还在念叨 minix1.1 的好日子——人人都能给自个儿写设备驱动,不用看别人的脸色?手头没有称心的项目?是不是特想有一个操作系统,能依着自个的想法来回折腾,还能长见识?瞧瞧 minix 上面跑的那些玩意吧,是不是挺没劲?不想再为调个酷毙了的程序,一宿一宿熬个没完?真这样,那我可找对人了。一个月前在帖子里就提过,我正在写一个操作系统,在AT-386上面跑,免费的,挺像minix。现在总算到了这份上,凑合能用(当然,这得看您想干吗)。现在,我愿意公布系统的源码,请大家多瞅瞅,多用用。系统版本只是0.02,不过bash、gcc、gnu-make、gnu-sed还有compress等等倒是都跑通了。

为了传承UNIX历史悠久的光荣传统,在为UNIX系统克隆命名时,总以字母“X”结尾,故而,人们最终将这一内核命名为Linux。最初,Linux的使用许可协议要严格得多,但Torvalds很快就将其归于GNU GPL阵营。

Torvalds做到了一呼百应。其他程序员与Torvalds一起加入到Linux的开发行列,添加了很多新特性,诸如:改进型的文件系统、对网络的支持、设备驱动程序以及对多处理器的支持等。到了1994年3月,开发者们发布了Linux 1.0版本。随之,Linux 1.2发布于1995年3月,Linux 2.0发布于1996年6月,Linux 2.2发布于1999年1月,Linux 2.4发布于2001年1月。对内核2.5版本的开发始于2001年11月,并最终于2003年12月发布了Linux内核2.6。

题外话:BSD

值得一提的是,20世纪90年代初,另一种可以免费获得的UNIX也能在x86-32硬件架构上运行。Bill和Lynne Jolitz将业已成熟的BSD系统移植到32位的x86 cpu上,命名为386/bsd。这项移植工作基于BSD Net/2(发布于1991年6月),即4.3BSD源码的版本之一,该版本中残存的所有AT&T专有源码要么被全部替换,要么予以删除——主要针对6个无法轻易更换的源码文件而言。Jolitzes夫妇将Net/2代码移植到了x86-32硬件架构,重写了缺失的源码,并于1992年2月发布了386/BSD的首个版本(0.0版本)。

在初战告捷后,对386/BSD的开发工作便出于各种原因而停滞不前。面对日渐积压的大量补丁程序,另外两组开发团队相机而动,基于386/BSD分别创建了自己的版本:NetBSD和FreeBSD。前者侧重于对大量硬件平台的可移植性;后者则主要关注性能,并成为如今应用最为广泛的BSD。1993年4月,NetBSD首版(版本号为0.8)发布。FreeBSD的首个CD-ROM版本(版本号为1.0)则发布于1993年12月。1996年,OpenBSD在从NetBSD项目分离出去之后,也发布了最初版本(版本号2.0)。相比较而言,OpenBSD偏重于安全性。2003年中段,在与FreeBSD 4.x分道扬镳之后,一款新型BSD——DragonFly BSD又浮出水面。DragonFly BSD采用的设计方法与FreeBSD 5.x有所不同,能够支持对称多处理器(SMP)架构。

若是不提及20世纪90年代初UNIX System Laboratories(USL,派生自AT&T的子公司,专门从事UNIX的开发和销售)和Berkeley之间的那场官司,那么对BSD的介绍恐怕就算不得完整。1992年初,Berkeley Software Design, Incorporated公司(BSDi,如今隶属于Wind River公司)开始发行受商业支持的BSD UNIX——BSD/OS——以Net/2发布版以及Jolitze夫妇所开发的386/BSD特性为基础。BSDi的发布版包含二进制和源代码,售价995美元,此外,BSDi还建议潜在客户使用其电话号码1-800-ITS-UNIX。

1992年4月,USL对BSDi发起诉讼,诉状称BSDi售出产品中含有USL专有源码及商业机密,要求其停止销售。此外,诉状还指称BSDi的电话号码容易误导消费者,要求BSDi停止使用。这场诉讼愈演愈烈,最终还加入了对加州大学的索赔请求。法院最终驳回了USL几乎所有的诉讼请求,仅对其中的两项请求予以支持。随后,加州大学又针对USL发起发诉,诉称:USL没有为System V中使用的BSD代码支付费用。

这场诉讼悬而未决之际,USL 已被Novell收购,Novell时任CEO——Ray Noorda公开声称:较之于法庭辩论,自己的公司更愿意参与市场竞争。双方最终于1994年1月达成庭外和解。在删除Net/2 release 源码18000个文件中的3个文件,对若干其他文件做出细微改动,并为其他大约70个文件添加USL版权注意事项后,加州大学仍可继续自由发布BSD。1994年6月,经过修改的系统以4.4BSD-Lite之名发布(1995年6月,加州大学发布了最后一版4.4BSD-Lite,版本号为Release 2)。此时,根据和解条款,BSDi、FreeBSD以及NetBSD纷纷以经过修改的4.4BSD-Lite源码替换了各自的Net/2基础源码。据[McKusick et al., 1996]一书记述,尽管这在一定程度上延误了BSD衍生系统的开发,但也有其积极意义。加州大学计算机研究组(Computer Systems Research Group)自Net/2发布后3年的开发成果,被重新同步到上述系统中。

Linux内核版本号

与大多自由软件项目一样,Linux也遵循及早、经常的发布模式,因而对内核的修订会频繁出现(有时甚至是每天都有)。随着Linux用户群的激增,对这一发布模式有所调整,意在降低对现有用户的干扰。具体来说,在Linux1.0版本之后,内核开发者针对每次发布所采用的内核版本编号方案为x.y.z。x表示主版本号,y为附属于主版本号的次版本号,z是从属于次版本号的修订版本号(细微的改进和BUG修复)。

采用这一发布模式,内核的两个版本会一直处于开发之中。一个是用于生产系统的稳定(stable)分支,其次版本号为偶数;另一个是经常变动的开发(development)分支,其次版本号为奇数(当前稳定版次版本号+1)。指导思想是(在实践中并未严格执行)应将所有新特性添加到内核当前的开发分支系列中,而对内核稳定分支系列的修订应严格限定为细微的改进及bug修复。当开发者认为当前的开发分支已宜于发布时,会将该开发分支转换成新的稳定分支,并为其分配一个偶数的次版本号。例如,内核开发分支2.3.z会“进化”为内核稳定分支2.4。

随着2.6内核的发布,内核开发模式再次发生改变。稳定内核版本之间发布间隔过长,因而导致诸多问题和不便,这是内核开发模型改变的主要原因(从Linux 2.4.0到2.6.0的发布历时近3年)。虽然还会就该模型的微调定期开展讨论,但基本细节已经确定如下。

  • 不再有稳定内核和开发内核的概念。每个新的2.6.z发布版都可以包含新特性,其生命周期始于对新特性的追加,然后历经一系列候选发布版本让新特性稳定下来。当开发者认为某个候选版本足够稳定时,便可将其作为内核2.6.z发布。一般情况下,发布周期约为3个月。
  • 有时,也可能需要为某个稳定的2.6.z发布版打上些小补丁程序,以修复bug或安全问题。如果这样的修复工作具有足够高的优先级,并且补丁程序的正确性也“毋庸置疑”,那么无需等待下一个2.6.z发布版,可以直接应用补丁创建一个版本号形如2.6.z.r的发布版本,其中,r作为该2.6.z内核版本的次修订版序号。
  • 额外责任将转嫁给Linux发行厂商,由他们来确保随Linux发行版一同发行内核的稳定性。

本书后续各章有时会提及API发生特定变化(比如,新增了系统调用或者系统调用发生变化时)的相应内核版本。在2.6.z系列之前,虽然大多数内核变化都见诸于具有奇数版本号的开发分支,但本书通常所指的是那些变化初次出现的稳定内核版本,这是因为大多数应用开发者一般都会使用稳定版的内核,而非开发版本。很多情况下,手册页会注明某一具体特性出现或发生变化时开发版内核的确切版本号。

对2.6.z系列内核所发生的改变,本书会注明确切的内核版本号。当书中言及2.6版本内核的新特性,且版本号又不带“z”这一修订版本号时,意指该特性是在2.5开发版内核中实现,并首度出现于稳定内核版本2.6.0。

写作本书之际,Linux内核2.4的稳定版尚处于维护期,维护者们仍在将关键性的补丁和缺陷修正合并起来,定期发布新的修订版。这使得已安装系统能继续使用2.4内核,而不必非要升级到新的内核系列(有时候,升级起来并不轻松)。

向其他硬件架构的移植

Linux开发之初,主要目标是针对Intel 80386的高效系统实现,而非向其他处理器架构迁移的可移植性。然而,随着Linux的日益普及,针对其他处理器架构的移植版本开始出现,首先就是向Digital Alpha芯片的移植。Linux所支持的硬件架构队伍在持续壮大,其中包括:x86-64、Motorola/IBM PowerPC和PowerPC64、Sun SPARC和SPARC64(UltraSPARC)、MIPS、ARM(Acorn)、IBM zSeries(formerly System/390)、Intel IA-64(Itanium,请参阅[Mosberger & Eranian, 2002])、Hitachi SuperH、HP PA-RISC,以及Motorola 68000。

Linux发行版

准确说来,术语Linux只是指由Linus Torvalds和其他人所开发出的内核。可是,也常使用该术语来指代内核外加一大堆其他软件(工具和库)所构成的完整操作系统。Linux草创之际,需要用户自行组装上述所有软件,创建文件系统,在文件系统上正确地安置并配置所有软件。用户不但要具备专业知识,还需为此耗费大量时间。如此一来,这便为Linux发行商们开启了市场,他们创建软件包(发行版),来自动完成大部分安装过程,其中包括了建立文件系统以及安装内核和其他所需软件等。

Linux的发行版最早出现于1992年,包括MCC Interim Linux(英国,曼彻斯特计算机中心)、TAMU(德克萨斯A&M大学)以及SLS(SoftLanding Linux System)。至今健在的商业发行版Slackware诞生于1993年。几乎与此同时,也诞生了非商业的Debian发行版,SUSE和Red Hat紧随其后。时下最流行的Ubuntu发行版问世于2004年。如今,对于那些在自由软件项目中表现活跃的程序员,许多Linux发行公司也会加以雇佣。