设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

知识回顾:Linux 2.6内核的精彩世界

2007-9-3 14:08| 发布者: joejoe0332| 查看: 11268| 评论: 3

  尽管我们第一次启动Linux 2.4似乎只是昨天的事,时间已经流走,内核开发团队的2.6版内核开发工作已经接近完成了。本文将试图描述2.6内核中的许多新特性(侧重i386平台的Linux)。

  2003年岁末,Linux社区最鼓舞人心的消息莫过于期盼已久的Linux内核2.6版正式推出。作为一个主要发布版本,2.6相对于2.4有很大的改动;它引入了许多新的特性,同样也去除很多过时的特性。

  它在哪些方面有大的改动?它对Linux的开发人员以及其他层面的Linux用户可能有什么样的影响?阅读本文,您将得到答案。--译者

  尽管我们第一次启动Linux 2.4似乎只是昨天的事,时间已经流走,内核开发团队的2.6版内核开发工作已经接近完成了。本文将试图描述2.6内核中的许多新特性(侧重i386平台的Linux)。和封闭源码的软件的预发布不一样的是,这里所描述的所有特性当前都是2.5版内核开发树中可用的(其中一些的bug少一些,另一些bug 多一些)。(按照Linux的传统,偶数版本的内核是稳定的,奇数版本的只是开发用的)。也就是说,这里所描述的一些特性在实际的2.6版本中仍可能被去除或标志为"experimental"(试验性)。然而内核当前处于特性冻结(feature-freeze)时期,最终的发行版本应该不大可能过于偏离这里的描述。同时也应该清楚这里描述的一些"新"特性在第一次出现在2.6系列内核后,可能被向后移植到了官方的或者发行版供应商的2.4版内核之中。

  或许使得这篇文章更为晦涩的是,即将到来的内核的版本号至今仍未确定。最可能使用的版本号是2.6,但是一些人提议版本号可以使用3.0,因为这个版本中包含了NUMA以及无MMU系统的支持。为论述方便,本文将一直使用2.6作为即将到来的内核的版本号。

  您正在阅读的是本文档(《Linux 2.6内核的精彩世界》)非正式版的第一版,完稿于2003年7月13日,基于2.5.75开发版内核。随着Linux内核最后工作的完成,这份文档将发布其他非正式版,但是这份文档的正式版直到2.6的最后发布才宣告完成。由于本文是非正式版的第一版,其中可能有错误或者疏漏;如果您发现了它们,请告诉我,我将很高兴地去修正它们。

  到目前为止的故事...

  Linux内核始于1991年由Linus Torvalds为他的386开发的一个类Minix的操作系统。Linus初始曾想命名为这个系统为Freax,但很幸运的是最后他最后没有那样做。 Linux 1.0的官方版发行于1994年3月,包含了386的官方支持,仅支持单cpu系统。Linux 1.2发行于1995年3月,它是第一个包含多平台(Alpha,Sparc,Mips等)支持的官方版本。Linux 2.0发行于1996年6月,包含很多新的平台支持,但是最重要的是,它是第一个支持SMP(对称多处理器)体系的内核版本。Linux 2.2在1999年1月到来,它带来了SMP系统上性能的极大提升,同时支持更多的硬件。最后,Linux 2.4于2001年1月发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等。Linux 2.6不仅包含了这些特性,同时也是一个无论对相当大的系统还是相当小的系统(PDA等)的支持都有很大提升的"大跨越"。
  多种平台支持

  能够支持相当广泛的硬件和平台,是采用Linux作为内核的操作系统(比如 GNU操作系统,系统和环境常常是和Linux一块分发。Linux一般不被认为是独立的操作系统,只是操作系统的内核。)的优势之一。Linux自 1.2版就开始包含对新的处理器类型和特性的支持,最新的Linux 2.6内核发布版本也不例外。这种趋势不会直接影响到Linux在Intel平台下的使用,同时使得Linux能在尽可能大的范围内被使用,这一点非常重要。

  小规模-嵌入式系统中的Linux

  Linux 2.6 扩展多平台支持的一个主要途径就是把uClinux的大部并入了主流内核(mainstream kernel)。uCLinux(可以发音为"you-see-Linux",但更正确的拼写,首字母应该式希腊字母"mu")是将Linux应用在微控制器平台的项目。很多年来,这个Linux分支为许多嵌入式芯片提供了支持,把它更多的集成到主流内核中是一件非常有意义的事。

  不像通常的Linux移植版本,这里描述的嵌入式移植版由于硬件限制和通常的Linux相比,不具有所有类似的特性。主要的区别在于:这些移植版是针对于没有内存管理单元(MMU)的处理器的(Intel的CPU从386开始就有MMU了)。缺少MMU的支持,运行真正的多任务系统时,任务之间没有内存保护机制(因此任何程序都可以使得其他程序崩溃),一些有关进程派生的系统调用也无法实现。正是因为没有内存保护机制(或者说,没有任何安全性可言),它们不适用于多用户系统。

  在对嵌入式处理器支持上,Linux 2.6有四个主要的新进步。首先是对Motorola的新型嵌入式m68k系列处理器移植。这些被命名为Dragonball或是ColdFire的处理器可以在Motorola,Lineo,Arcturus或是其他厂商生产的系统或是评估板上找到。大多数Linux用户应该对这些处理器相当熟悉,因为从Palm 1000到最新的Palm III,他们一直是Palm Pilots的心脏。不幸的是,对早期没有MMU的m68k处理器(比如早期苹果机上使用的68000系列)还没有支持。最新支持的嵌入式平台还包括日立(Hitachi)的H8/300系列(不包含H8S,但可能会尽快地集成进来)以及NEC v850处理器。

  无论怎么强调Linux 2.6旨在支持无MMU系统的主要体系结构变化,都不为过分。所有Linux的前期版本,不论直接或是间接,都起源于Linus最初在Intel 80386上的工作,局限性是固有的。沿着这个方向(对无MMU系统的支持),将来也许会有更多的其他早期的硬件被支持(事实上,已经有关于此目的的项目启动)。但是,不像为现代的以及仍在生产中的嵌入式处理器的提供支持,对早期的硬件的支持被更多地认为是基于某种爱好,并且对于最终用户而言很可能是无用的(因此在今后的Linux的官方发布版本也许不会将其包含在内)。

  最新的Linux版本包含了对Axis通信公司的ETAX CRIS("Code Reduced Instruction Set")处理器的支持(更确切地说,支持ETRAX 100LX及更新的产品),它从技术的角度而言不是uCLinux合并的一部分(因为它包含MMU单元)。实际上对这款处理器的支持在2.4开发周期就已经有了,但它在2.4.0以后才被引入,所以现在应该提到它。它是主要用于网络设备的嵌入式处理器。与此相关的ETRAX 100,是得到uClinux支持的无MMU处理器,但是在主流的Linux内核中相关支持却没有集成进来。
  Opteron支持-消费级的64位Linux

  另一个在2.4.x开发环节就已经并入但这里仍然值得提及的是对AMD Opteron芯片(基于AMD64体系结构)的支持。Opteron向后与Intel-clone的处理器兼容,并且,甚至可能得到微软的支持。是它还 是Intel的Itanium家族的某一成员成为64位消费级产品的事实标准现在还很难下定论。

  尽管2.4系列内核的后期版本已经可以在该芯片上运行,但作为产品应用仍受到了很大限制。对高端用户来说,最严重的问题是,每个应用程序的RAM的使用都被限制在512MB以内。另一方面,新内核对在该平台上运行x86(32位)的程序的支持得到了改进。

  子体系结构(Subarchitecture)支持

  Linux 2.6除了对许多新的处理器体系结构外,还包含了一个称为子体系结构(Subarchitecture)的新概念。以前,Linux通常假设处理器和其他 硬件是配套的。也就是说,i386系列处理器只会在PC/AT服务器上使用。这条针对i386的假设在Linux 2.4中就被打破,因为i386的额外支持使其可以在SGI的视频工作站(Visual Workstation)中使用。(事实上,在其他非i386体系结构上,这个假设早被打破了。比如,m68k很早就支持Amiga, Michintosh等平台。)Linux 2.6对于此最大的变化就是,让这个特性以及概念成为标准,以便所有的体系结构都可以用相似而健全的方法来处理,以便更清晰地划分模块。

  标准的确立使得i386可以运用于两个新的平台。第一个是NCR的Voyager体系。这是一个对称多处理器(SMP)系统(在Intel的 MP规范标准确定之前就已经开发出来了),它支持多达32个486-686的处理器配置。实际采取这种体系结构的产品处理器的配置数目要相对少一些,而且 目前并不是所有的型号都得到了Linux的支持(最早的就不支持)。第二种得到最新支持的体系结构是更为广泛使用的由NEC开发的PC-9800平台,它 曾是日本市场占统治地位的PC平台,一直到最近几年。最初的PC-9800装载的是8086处理器,最终发展到奔腾级处理器和SMP支持。(当然, Linux对它的支持局限在386以上。)尽管在美国它完全不为人所知,微软的Windows 95之前的版本曾移植到这个平台上。该平台由于生产商对标准PC的偏爱,生产已经中止。

  Linux对差异细微的硬件类型支持的形式化,使得操作系统能更容易的移植到其他平台上,比如移植到专为存储设计的硬件或者是使用在工业领域 的主流处理器。需要澄清的是,子体系结构也不是任何时候都管用的,它能够发挥作用是因为这些可移植的系统非常底层构件(比如IRQ路由)有或多或少的不 同。比起在X-box上运行Linux的差别来说,驱动程序等相对小的差别还不足以把它们从传统的i386系统中分开。Linux对X-box的支持,就 不是子体系结构的问题。
  大规模 - 非一致存储访问体系结构(NUMA)和大型机

  除了以上所提及的新硬件类型的支持之外,新的Linux内核发行版也包含了对大型服务器(一些运行i386处理器,也有些运行其他处理器)更 多的支持。对Linux来说,这样的特性是新近加入的,还有许多优化工作需要完成。这是一个Linux发展相当迅速的领域,我们能够预计在不久的将来, Linux将成为此领域的有力竞争者。

  在此方面最大的改变就是Linux对NUMA服务器的最新支持。NUMA(非一致存储访问)在多进程世界里是超越SMP以及提升多处理器系统 效率的一个进步。SMP系统的设计上有着许多和对应单处理器系统类似的局限性。其中最大的设计局限之一就是系统中只有唯一的一块内存区,所有的处理器对它 都平等地对它进行访问。在多处理器系统里,这样会在同一条内存总线上的多处理器之间引起相当高的竞争,导致性能瓶颈。NUMA服务器,通过引入了以下的理 念解决了这个问题:对于某个特定的处理器,一些内存比其他一些的更为接近(close)。可以这样简单地设想(同时技术上也不会有严重错误),你的系统有 许多包含了处理器、内存以及其他元件(比如I/O扩展卡)。系统中有很多这样的卡,它们可以相互通讯;显而易见,相对其他卡上的内存,每块卡上的处理器能 更快的访问本地内存(自己的卡上内存)。从许多角度上看,NUMA体系结构就是一个紧密耦合的集群特例。

  为了给NUMA主机提供良好的支持,Linux十分必要在许多方面进行调整,以使新模型更具效率。首先,建立了一个内部拓扑API,以使内核 知道处理器和内存以及其他IO设备间的相互关系。有了内部拓扑API的支持,Linux的进程调度器可以理解这些关系,并且会尝试优化任务以达到最佳的本 地资源使用。此外,许多NUMA主机在各个节点(nodes)的线性内存区域之间存在空洞(holes)。新内核已经能够合理的处理这种不连续情况。内核 还有许多其他使得Linux可以支持高端(high-end)主机的变化,这也是内核发展的一个明确方向。再过一年,我们可以期待Linux在高端机型上 效率以及其他方面的进步。

  深入Linux

  除了横向支持越来越多的硬件,Linux 2.6还在已支持的平台上根据硬件的性能提升进行了改进。这些针对特定CPU的优化包括:Transmeta的Crusoe系列,Intel's Pentium 4 Xeon、Pentium 3-M、Pentium 4-M 和AMD移动处理器。新版本Linux还解决了某些Athlon处理器自身的bug导致的问题。Linux 2.6还解决了在某些多于16个处理器的系统启动时偶尔会挂起的问题,尽管这个bug不会影响大多数用户的正常使用。

  超线程

  在Linux 2.6中不算新鲜,内核在2.4.17发布中就已经开始包含对Intel P4处理器的超线程(Hyperthreading)的支持(在这里提及它,一是因为它并没有包含在2.4最初的发布中,二是自那以后内核又有了很大的改 变)。超线程使得单个的处理器可以伪装成操作系统看来二个或更多的多个处理器。最令人激动的是,Linux是第一个把超线程特性引入市场的操作系统,尽管 早在一年前Intel就发布了兼容的处理器。有传闻说,微软在对支持超线程的CPU按一个CPU还是按两个CPU收取授权费(license)的问题上拿 不定主意。Linux的开放模型(以及没有基于cpu的授权)使得Linux操作系统第一个支持这个新特性。显然,一个处理器就算扮作两个处理器工作,它 还是一个处理器,性能并不能因此增加很多。2.5中调度器和其他一些部分在有了新的优化,使得处理器的超线程可以真正的发挥作用。如果是在2.4下加入超 线程支持,结果就不一定了,有时性能还会下降。
  容量 -- 可扩展性的进展

  除了对NUMA的支持,Linux 2.6在处于食物链顶端的Intel服务器方面,也有一些变动。最重要的就是对Intel的物理地址扩展(PAE)的完全支持,使得较新的32位的x86 系统可以访问高达64GB的内存,但仅仅限于页面映射模式。另外,通过加强对高级可编程中断控制器(APIC)的支持,多处理器系统之上的IRQ均衡 (balancing)大大提升。

  在许多其他方面,内部限制在可能的地方都有所放松。Linux系统上用户和用户组的数目从65000越升到了超过40亿(实际就是16位到 32位的变化)。这使得Linux在之前可能超越限制的大型文件和认证服务器上更加实用。类似的,进程标识号(PID)的数目也从32000升到10亿。 这个改变,与其他PID子系统优化一起,将提高在十分繁忙或是长期工作的系统上的应用程序的启动性能。尽管同时打开的文件最大数目并没有增加,但是 Linux 2.6不会再要求你预先设定限制值;限制值会随着系统的运行自动调整。最后,Linux 2.6包含了改进的64位的块设备支持(当然块设备本身应当支持64位模式),即使是在i386这样的32位平台。这样一来,文件系统的存储上限可达 2TB。

  内核互动性以及响应性

  Linux 2.6中一个受关注的焦点就是使得系统对于桌面用户以及其他一些需要对事件进行高度人为控制的应用具有更具响应性(responsitive)。这其中各个不同的目标系统具有很不同的挑战,但内核中包含了很多改变,使得它们同时受益。

  2.6中一个必须理解的主要内部改变是现在内核自身是可抢占的。在所有之前的Linux版本中,当系统运行内核的相关事务时,它不能被打断 (在多处理器系统中,基于各cpu的角度这也是成立的)。Linux 2.6中,内核现在允许自身在执行任务时被打断,这样用户任务可以继续运行即使内核正在做一些复杂的事情。(为了避免明显这可能带来的竞争情况,内核中含 有一些具有锁的代码段,运行于这样的代码段的时候,内核不能被打断。)这个改变的主要好处是系统的可交互性(比如,对于桌面用户)大大提升,系统对于用户 输入这样的事件感觉起来快多了。

  其他使得Linux成为一个更加具有响应性系统的改变是并入对新的"futexes"("Fast User-Space Mutexes")的支持,这项支持发挥作用需要用户程序的支持(使用futex实现互斥)。Futexes是一种序列化(serialize)事件使得 它们不会相互冲突的机制。与传统的多数的线程库锁支持的mutex操作不同,这是部分基于内核的(partially kernel based),同时它也支持设置优先级使得高优先级的应用或线程优先获得竞争的资源。通过使用一个程序去指定一个等待的任务比其他的更重要,它带来了可能 是一个应用的时序--关键区域更佳的响应性。

  Linux的I/O子系统也经历的很大的修改,使得它在各种工作负荷下都更具响应性。这个变化包括I/O 调度子系统--决定何时、哪一进程去读一个设备的内核代码的完全重写。重写的I/O层现在可以更好地保证没有进程过长时间地停留在I/O等待上,同时不排 斥以前的优化工作使得读等请求以最有效的次序操作硬件的优化工作。

  尽管实时操作系统(RTOS)的开发者可以从这些改变中受益,Linux 2.6将不会成为一个实时内核。然而,这些以及其他相关的背景工作使得将Linux转变为RTOS成为可能。为用户或开发者提供这样的支持的外部 patch(尚未合并到官方的内核版本)已经出现了。
  模块子系统 - 设备驱动程序

  在 Linux 2.6的开发历程中,模块子系统是另一有重大改进的部分。许多代码被重写,以提高稳定性,并使系统更加透明。除了这些明显的表层的变化之外,还有更多背后的内核如何看待以及使用模块的改变。

  首先,Linux 2.6中内核驱动程序最显而易见的(虽然并没有太大作用)的变化是文件扩展名改变了。".ko"(kernel object,内核目标文件)取代了".o"(这是一目标文件的常见扩展名,通常在程序编译期间,链接生成可执行应用程序之前创建)。与其说这使得模块并 不是真正的中间文件这一点更为清楚,还不如说这仅仅是一个装饰性(cosmetic)的改动。

  完完全全实质性的改进在于消除存在于很多内核版本中的竞态的多方面工作。问题的关键在于,如果卸载发生在模块检查并确认没有其它的设备正在使 用它之后,使用一个正在被卸载的模块来启动设备是有可能的。新的内核模块代码应使得这一条件更难被触发。更进一步,现在简单地完全禁止模块卸载也是有可能 的。

  更加透明是新的模块子系统另一特性。在此之前,几乎所有的 Linux版本中,模块是足够智能的,它们可以通过扫描总线寻找它识别(recognized)的设备ID号,检测到它所能够支持的设备(比如PCI, ISA PnP以及PC卡)。Linux 2.6标准化了这种支持,使之对内核来说外部化,外部程序以及模块加载器判断一个特定的模块可以支持哪些设备将更为容易。这将允许各种硬件管理程序(比如 Redhat的kudzu)对硬件作出智能化的判断,即使他们本身对自己所处理的硬件设备并不熟悉。如果你的知识超越了当前版本的驱动程序,你可以(通过 新的 sys文件系统中的一个接口)强制一个驱动程序工作于某一特定的设备,即使驱动程序并不知道自己可以支持该设备。

  其他改进

  除了上述的许多改变之外,还有很多其他可以提升系统性能的普遍性的改变。这其中包括更多的去除了"Big kernel Lock"(早期Linux用于支持SMP系统时所采用的非细粒度锁),以及针对文件系统预读、回写和小文件操作的优化等。

  Linux 2.6还解决了一个更为深刻的稳定性问题:内核将不会分配多于系统中RAM(加swap)数量的内存。此前,Linux在一些即使系统内存耗尽的情况下, 仍然允许malloc操作分配内存成功。过量分配(overcommitment)逻辑得到修改,使得这种情况现在不再可能出现。(当然,如果你耗尽了系 统的RAM,即使没有超越最大可用数量--你需要担心更更严重的问题。)

  Linux总是一个开放标准的支持者。内核内部的大改变之一就是Linux的线程框架被重写,以使NPTL(Native POSIX Thread Library)可以运行于其上。对于运行负荷繁重的线程应用的Pentium Pro以及更先进的处理器而言,这是一个主要的性能提升;它也是企业级应用中的很多高端系统一直以来所期待的。(实际上,RedHat已经将它向后移植到 了Linux 2.4,从RedHat 9.0中开始包含)线程框架的改变包含LInux线程空间中的许多新的概念,包括线程组、线程各自的本地存储区、POSIX风格信号以及其他改变。主要的 缺点之一是依赖于老式的Linux-isms而没有遵循POSIX标准的应用程序(比如Sun Java)将不能运行在支持新式线程的系统之上。鉴于使用新的线程模型利远大于弊,很明显,新的内核发布不久,最为重要的那些应用都将会支持这个改变。

  最后,2.6可以支持编译时关闭内核对存储交换(swap)的支持,尽管对于绝大多数Linux之上的应用而言,没有直接的益处。这使得Linux可以在相对小的内存足迹(footprint)内运行,对于不大可能使用交换设备的嵌入式系统可能也是有益的。
  统一设备模型

  作为操作系统中的一个相对独立的组件,设备模型对于那些被设计运行于用于多种硬件之上的操作系统而言是至关重要的。简单地说,设备模型是内核 中的基础设施,用于检测和决定系统中所有可选模块的资源使用。所有的操作系统(包括各版本的Linux)都固有一些设备的概念。老版本的Linux (2.2或更早)仅使用一种直接的方法操作设备。系统为不同种类的硬件总线提供驱动程序,各式各样的设备驱动程序知道如何探测它们所支持的设备总线以寻找 对应的硬件设备。这种系统非常分散,各种各样的总线提供许多互不兼容的API,用于处理各种不同的操作。Linux 2.4通过使用一组通用接口将PCI,PC卡以及ISA PnP 整合到一个单一的设备结构中,完成了构建统一设备模型的第一步。Linux 2.6更进一步地推进了这方面的努力,力求在整个系统的范围内,内核以一种新的统一的视角看待它所依赖的硬件。

   内核对象抽象

  新设备模型基础的核心是一个所有底层设备类型都需使用的新的面向对象的接口。这个内核设备对象结构(称为"kobject")包含用于引用计 数和操作子设备的所有接口。底层设备(例如系统总线)利用这一公共接口层,向内核以及用户空间提供统一的系统视图。现在,所有这些都被放在了中心位置,这 使得Linux可以使用这些信息作许多有用的事。

  在内核中完整地保存这些新的信息,使得Linux可以更好的支持那些需要有深入的硬件知识的系统。一个明显的例子就是电源管理。近几年新出现 的电源管理标准是ACPI。ACPI,即高级电源配置管理界面,最早是在Linux 2.4中有支持。不同于APM(高级电源管理),拥有这种接口的系统在改变电源状态时需要分别通知每一个兼容的设备。新的内核系统允许子系统跟踪需要进行 电源状态转换的设备。另一个例子是支持热插拔的总线。机器启动后依然可以添加设备的能力在现在看来显得很普通,但Linux直到2.2版本才提供相关支 持。到了Linux 2.4,这种支持得到进一步的加强,范围也扩大到可热插拔的PCI、PC卡、USB以及Firewire设备。通过从根本上消除热插拔设备和传统设备的差 异,新内核的集中化设备系统扩展了这一支持。当你启动计算机的时候,设备检测例程将"插入"系统中的设备。无论在系统启动时,或是启动以后,系统发现系统 中的某个设备时,都会相应创建一个相同的内核对象,这就使得处理可插拔设备的底层结构简单化了。

  sys文件系统

  最明显的用户可见的改变可能是新的sysfs文件系统的出现,它集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的 devfs文件系统以及针对伪终端的devpts文件系统。该文件系统(安装在/sys目录)是核心看到的设备树的一个直观反映。核心通过紧密合作的核心 对象(kernel object)子系统来建立这个信息:当一个核心对象被创建的时候,对应的文件和目录也被创建。(必要的话,也有可能一个核心对象被创建的时候并不在 sysfs文件系统中有记录。)

  既然每个设备(或者说内核对象)在sysfs中都有唯一对应的目录结构,那么下一步可以把设备的属性(设备名,电源模式,中断处理等)信息输出到这个目录树中以供系统管理员读写。相应的,很多跟设备相关的/proc/sys的用法已经或者将要移到/sys目录下。
   核心硬件支持

  随着Linux的这些年的发展并逐步进入主流行列,从内核所支持的设备类型来看,每一次的内核发布,都像是一次跳跃:支持新兴的技术(2.4 的USB),支持古老一些的传统技术(2.2的MCA)。发展到Linux2.6,不被Linux支持的设备已经相当少了。PC机上的主流硬件没被支持的 很少。正是由于这个原因,多数(显然不是所有)关于硬件支持方面的改进(包括上面所说的设备模型)围绕对已有支持的加强。

  内部设备总线

  位于系统底层的总线几乎与处理器同样重要;这些总线就像胶合剂,将系统的各个部件连到一起。在PC世界中,这些总线一直是不可或缺的,无论是 老的ISA(在最初的IBM PC机中可以找到)总线,还是现在的外部串口以及无线(wireless)总线。一旦新的总线及设备变成流行的消费产品,Linux总是能以很快的速度去 适应它;而对于不很流行的设备,情况则差很多。

  一个能说明这一情况的例子就是ISA总线的PnP(即插即用)特性,Linux直到2.4版本才支持ISA总线的即插即用扩展,比其他流行的 商业操作系统要晚很多(在内核支持ISA PnP之前,你或许可以勉强使用一些用户态的实用程序使它工作)。Linux 2.6对这个子系统做了一个重要的改进,使它更完善、更好地集成于新的设备模型之中。新特性包括完整的PnP BIOS支持、设备名称数据库以及一些其他的使系统更加健壮的特性。这些改进的结果,是使得Linux成为一个真正意义上的即插即用操作系统,并且可以被 设置成就像那些兼容机的BIOS达到的那样。

  ISA时代ISA-PnP的两个可选的替代方案是MCA(微通道体系)和EISA(扩展ISA),尽管它们不那么流行。在Linux2.6的 开发周期中,这两个子系统都做了一些改进以支持新的设备模型。此外,通过引入设备名称数据库,EISA与其他子系统一起获得了更进一步的标准化。

  除了刚才提到的几个重要特性,Linux对硬件总线的支持也做了许多其它值得关注的改变。PCI总线是所有总线中最流行也是最重要的总线, Linux 2.6极大地提升了对它的支持,包括改进的热插拔和电源管理支持。新版本同样也支持包含多个AGP总线(即加速图形端口――基于PCI协议的一种独立高速 总线)的系统,如高端图形工作站。就对PC硬件的支持而言,Linux紧紧跟随着硬件市场的潮流。

  除了这些实际的设备总线,Linux2.6也增加了一个概念上的Legacy总线。这种总线对每种体系结构都是专有的,这些体系结构包含所有 你可能想到的设备。例如,在一台PC机上,可能会有板上(on-board)的串口、并口、以及PS/2端口,这些设备实际存在着,但不被系统中的任何一 个实际总线所枚举(enumerated)。在其他的一些平台上,这种Legacy支持可能包含更复杂的事情(如查询固件)。但一般来说,这只是一层包 装,使得设备驱动程序在新的驱动模型视图下能以标准的方式操作这些设备。

  外部总线

  虽然早先的设备标准成熟并鲜有新的特性增加,但USB是一个例外。USB的支持在最近的内核开发周期中有了许多改进,其中最为显著的是新内核 将支持USB 2.0设备。USB2.0是一种新的标准,支持设备带宽高达480M bps(当前的USB只有12Mbps)。支持此标准的设备通常被称作高速USB设备,它们正逐步占领市场。另外一个新的相关标准叫做USB On-the-Go(或称作USB OTG),它是USB协议中一个点到点的变种,用以直连设备;Linux 2.6尚未支持它(2.6的补丁是可以支持的)。除了设备支持外,多数USB设备的枚举方式都作了修正,使得Linux能访问现今许多同类型设备的所有实 例(instance)。这一点对于大型打印机或存储设备来说相当有益(虽然后者可能更倾向于使用专用存储总线)。很明显,这一领域的技术最近几年成长显 著,Linux对相关设备的支持也是紧跟市场的步伐。
  无线设备

  过去的几年,无线技术在公众应用中真正起飞了。看起来,在不远的将来,线缆(非电源)将成为历史。无线设备既包括网络设备(目前最常见的无线设备),也包括更通用的设备,比如PDA。

  在无线网络空间中,设备可以大致分为长距(如基于业余无线设备的AX.25)和短距(通常是802.11,但一些旧式协议也存在)。从很早的 时候(v1.2)起,对这两者的支持就成为 Linux的一个特征。在 2.6 的开发中,它们又都得到了更新。这里最大的改动是,用于支持各种板卡、协议的短距子系统的主要组件合并为一个单一的"无线"子系统以及 API。通过提供一组能工作于所有支持的设备的用户空间工具来实现不同的设备统一处理。这种方式解决了原先的不同设备不同处理所带来的很多小的兼容性问 题。除了这种标准化之外,Linux 2.6版内核还有很多全局性的改进,包括当状态发生改变(比如一个处于"漫游"状态的设备)时更好的通知能力,以及对旨在更好地处理无线设备中周期性的延 迟波动的一个TCP相关的改动。由于人们对2.4版内核中无线支持的期望,上述的很多特性已经包含在2.4版内核中了。

  在无线设备空间,有着类似的主要改进。IrDA(以 Infrared Data Associates group命名的红外线协议)部分自上一主要发布以来有一些改进,比如电源管理、集成进了新的内核驱动模型。真正的改进还在于提供了对蓝牙设备的支持。蓝 牙是一种新的无线协议,它设计为短距,功耗很低,也没有 IrDA 中的"视线"的限制。作为一种协议,蓝牙被设计为"到处可用"。它已被应用于多种设备,如 PDA,移动电话,打印机,以及更为怪异(bizarre)的设备如车载设备。协议本身由两种不同的数据连接类型组成:用于有损音频应用的SCO (Synchronous Connection Oriented,面向同步连接);以及可以支持重传等更为强壮的连接L2CAP(Logical Link Control and Adaptation Protocal,逻辑连接控制和适配协议)。L2CAP 还进一步的支持各种子协议,包括用于点对点网络的 RFCOMM 以及用于类以太网的 BNEP。Linux对采用蓝牙技术的设备的支持在不断提升,我们可以相信,当足够多的采用蓝牙技术的设备被使用时,这种支持将会非常成熟。值得一提的 是,对蓝牙最初的支持已经集成到了2.4系列内核后几个版本中。

  块设备支持

  存储总线

  在2.6的开发中,IDE/ATA、SCSI等存储总线也都得到了主要的更新。最主要的改变集中于被重写(再一次被重写)的 IDE 子系统,解决了许多可扩展性问题以及其他限制。比如,现在 IDE CD/RW 设备可以直接通过IDE磁盘驱动程序进行写操作,这种实现方法比过去的方法要简洁的多。(在以前,需要再使用一个特别的SCSI模拟的驱动程序。这样显得 很混乱,而且实现起来有困难。)现在,遇到一个不能识别的控制器时,IDE 层可以查询机器的 BIOS 信息,从而获取时序操作所需数据或其他数据。SCSI部分有不少散布于系统中的小的改进,使之能支持更多的设备,同时提升了可扩展性。一个针对旧式系统的 特别改进是,现在的 Linux能够支持 SCSI-2多通道设备(这种设备在单个设备上有多于2个的 LUN)。另一个重要的改进则是现在 Linux 能够默像 MS Windows那样检测介质的变动,以更好地兼容那些并不完全遵照标准规范的设备。既然这些技术历经时间的考验稳定下来,那么 Linux 也提供对它们的支持。

  Linux现在也包含对新一些的机器的EDD(Enhanced Disk Device) BIOS进行直接访问的支持,这样便可以获得服务器中的磁盘设备视图。EDD BIOS包含所有连接到系统的、BIOS识别的存储总线(包括IDE以及SCSI)的信息。除了获得连接设备的配置以及其他信息之外,它还有另外几个优 点。比如,这种新的接口使 Linux 能够知道系统是从哪一个磁盘设备上启动的。这在新一些的系统上非常有用,因为这样的系统中到底是从哪一个设备启动的常常不明显。智能安装程序也可以考虑使 用这些信息,比如在决定把GRUB(一种Linux启动装载器)安装在哪里时。

  所有这些改动之外,这里需要再次强调的是,所有的总线设备类型(硬件、无线和存储)都集成到了Linux新的设备模型子系统中。一些改动仅仅是"装饰性"的,另一些则包含了非常显著的改动(比如,甚至是如何检测设备的逻辑都需要修改)。
  文件系统

  Linux(或其他一些系统)下块设备的最常见用法是在块设备上面建立一个文件系统。相对Linux 2.4而言,Linux 2.6对于文件系统的支持在很多方面都有大的改进。关键的变化包括对扩展属性(extended attributes)以及POSIX标准的访问控制(access controls)的支持。

  EXT2/EXT3文件系统作为多数Linux系统缺省安装的文件系统,是在2.6中改进最大的一个。最主要的变化是对扩展属性的支持,也即 给指定的文件在文件系统中嵌入一些元数据(metadata)。一些扩展属性被系统使用,只能由root用户进行读写。很多其他操作系统,如 Windows和MacOS系统已经大量地使用了这种扩展属性。不幸的是,UNIX系的操作系统一般都还没有很好地支持扩展属性,很多用户级的程序(比如 tar)需要进行更新才能保存和转储这些扩展属性信息。这是Linux成长的又一方面;Linux对扩展属性的支持正在成熟。

  新的扩展属性子系统的第一个用途就是实现POSIX访问控制链表。POSIX访问控制是标准UNIX权限控制的超集,支持更细粒度的访问控 制。必要的话(比如从NFS输出文件的时候),这些访问控制可以被映射到标准的user/group权限控制上。除了以上,EXT3还有其他一些小的变 化。文件系统日志提交(commit)的时间能够进行调整得更加适合于笔记本电脑(处于省电模式时,可能会加速驱动器);缺省的加载选项可以保存在文件系 统自身之中(这样不用每次加载时都输入加载选项);可以标记一个目录为"indexed"以加速在这个目录中的文件查找。

  Linux对文件系统层还进行了大量的改进以兼容PC机的主流操作系统。首先,Linux 2.6支持Windows的逻辑卷管理器(即动态磁盘Dynamic Disks)。这个是Windows XP及后续版本中新的分区表机制,能够很方便的支持多分区系统中的分区大小的调整以及新分区的创建。(当然,Linux系统不一定会马上使用这一机制)其 次,Linux 2.6对NTFS文件系统的支持也进行了重写,现在能以读/写模式安装一个NTFS卷。写支持仍处于试验阶段,在逐步改进;最终的内核发布版中可能含有也 可能不含有写支持这一部分。最后,Linux对FAT12(很老的系统或软盘上使用的DOS文件系统)的支持中消除了使用一些MP3播放器时所遇到的 bug。跟踪PC领域的其他一些技术将一直是Linux核心向前发展的一个重要环节。

  文件系统部分在与其他操作系统的兼容性方面也有改进。对HPFS文件系统(OS/2和其他系统中使用)的扩展属性的支持有了改进。OS/2风 格的扩展属性被分离到另一个的名字空间中。XFS文件系统也得到了更新,以达到与IRIX操作系统的磁盘级(on-disk)兼容。

  此外,Linux文件系统中还有很多分散的变化。配额(quota)管理进行了重写以便系统可以支持更多的用户;用户可以标记目录为同步,从 而所有变化(增加文件等)都是原子的(这一点对于邮件系统和基于目录的数据库系统尤为重要,而且在磁盘故障的恢复方面也更好一些);透明压缩功能(仅 Linux支持的扩展)被加到ISO9660文件系统(CD-ROM中使用)中。最后,一个新的基于内存的文件系统(hugetlbfs)被创建;创建该 文件系统旨在更好地支持基于共享内存的数据库。

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部