Linux 2.6
内核的精彩世界
(
三
)
整理:
Ackarlix
核心硬件支持
随着
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
)被创建;创建该文件系统旨在更好地支持基于共享内存的数据库。