Linux2.4内核为我们带来了什么?
□ 中科红旗软件技术有限公司技术副总监 叶以民
支持更多的体系结构
以纯代码行的观点来看,Linux内核主要是一些驱动程序。事实上,对于最近发行的几个版本来说,Linux核心的容量增加得并不太多。有些驱动程序具有独立的结构,例如IDE驱动程序。也就是说,这些程序可以在多个平台上运行。其他的驱动程序则依赖于一个特定的结构。例如,ADB(苹果桌面总线)鼠标驱动程序就不适用于也不支持i386端口。Linux内核开发者努力使驱动程序尽可能通用化,以便获得一个设备时,很容易就能使驱动程序在不同的平台上重复利用。将Linux内核视为一个整体是最方便的,不过有些功能会根据平台的不同而不同。
Linux2.4增加了对三个新架构的支持:IA64(Itanium)、S/390和SuperH(WindowsCE硬件)。Linux2.4也包含了对更新的64位MIPS处理器的支持。
Linux2.4能支持最新的PentiumIV处理器,也支持MMX和MMX2。并且还增加了对所有处理器的最优化指令来加速Linux,尤其对较新的处理器,如PentiumIII处理器的优化。它还支持与Intel兼容的芯片,例如那些由AMD和Cyrix生产的CPU。另外,Linux2.4将包含对其他硬件的支持,这些硬件经常出现在更新的芯片上,包括非Intel的各种各样的MTRR(Memory Type Range Registers),这些MTRR将在一些高带宽的设备上改进性能。Linux2.2包含了在多处理器系统上对于IO-APIC(高级可编程的中断控制器)的支持,Linux2.4也将支持这些在多功能处理器系统上的新技术,并且也支持带有多IO-APIC的机器。对于多IO-APIC系统的支持将允许Linux2.4具有比先前的基于高端硬件的Linux版本更好的量身定制的功能。
随着处理器的不断升级,Linux内核也需要随之发展。2.4内核中新添加的功能是对2G以上处理器的支持。
在产品发布给期待已久的用户之前,Intel的64位处理器芯片就已经开始取代X86生产线了。在没有得到芯片以前,支持这些芯片以及它们后续芯片的补丁已经被包含在Linux的主流内核版本中了,同时Linux也移植了一些对64位芯片(如康柏的Alpha和SPARC64)的支持。
内部功能的扩充与优化
Linux 2.2是在Linux 2.0和Linux1.x基础上的重大突破。它支持许多新的文件系统,一个新的文件缓冲系统,并且容易升级。Linux 2.4就是在这样的基础上建立起来的,几乎是可以运行在各种环境中的内核。
Linux的内核可以看作是各种模块和子系统的集合,这些模块和子系统包括驱动程序、协议以及其他部件。它们通过API和编程接口,粘合在内核周围,然后由API和编程接口提供调用内核的标准方法。本文的大部分篇幅将集中在Linux的这些部件上,因为大部分任务都是由这些部件完成的:驱动磁盘、读取文件和其他显然是物理性的工作。Linux2.4还远不止这些,这些模块围绕在Linux内核的中心周围。这个中心结构的基本特征就是调度、内存管理、虚拟文件系统和资源分配。
Linux2.4是第一个具有全功能的资源管理子系统的Linux版本。我们现在熟悉的“即插即用”的功能在以前的Linux版本中被认为是很不支持或者仅仅有一点支持的痕迹。跟其他的内部变化不同,很多用户可以直接感受到这种变化使内核分配资源并报告的过程变得简单了。由于这个变化的缘故,在Linux2.2里不能识别的PCI卡数据库又被重新启用,因此所有的资源可以有一个与之相关联的设备名,而胜于只是一个关联的驱动程序。
Linux2.4修正了一些VFS层(虚拟文件系统)的问题并对文件缓冲区做了修改。在旧版本的Linux中,文件缓冲独立于一个双缓冲区系统之上,这个系统简化了很多问题,但是却使那些不得不保证缓冲区同步的程序员感到头痛。另外,冗余缓冲的使用加大了内存的开销,并且使系统不得不做额外的工作来保证这些缓冲的同步,降低了性能。Linux2.4用一个简单的单缓冲系统解决了这个问题。
很多Linux2.4的变化被称为是“企业级”的。这意味着这些加强系统整体的变化对于桌面系统的用户来说,不会立即体现出它们的效用。在大多数情况下,这些附加的性能不会明显降低Linux在普通环境下的性能。首先,Linux2.4可以通过升级到多处理器系统或者提供一个可配置的线程限制,处理更多的并发线程。其次,一个更新的更高效率的调度器能处理更多的并发线程。第三,更新的Linux内核可以处理惊人数量的用户和组――大约42亿。另外,新的内核支持更多强大的硬件。2G的文件大小的限制也被突破了。这一切变化都表明,Linux可以胜任更多的环境。
Linux2.4使改进后的共享内存的处理更加符合标准。改动后的副作用是,Linux2.4必须加载一个特殊的“共享内存”文件系统才能使POSIX类型的共享内存片断正常工作。而SysV型共享内存则不需要另外的文件系统。该文件系统的加载需要Linux2.4发行时提供。
Linux内核的这个新版本中的另一个“老”变动是对VFS层的改进。以前的版本甚至是Unix的每个版本,每次都只能加载一个文件系统,但Linux2.4现在则允许任何文件系统加载多次,并使所有改动立即显示在其他加载点上。这对像/proc这样需要在initrd中加载多次的文件系统是非常适用的。此外,它还允许统一加载,即同时加载包含多个文件系统的文件。
一个经常被提到的问题是Linux 2.4需要多少内存。很多操作系统似乎随着他们的成熟而需要越来越多的内存和资源。但是,Linux2.4有力地遏制了这种趋势。在特定的环境下,Linux2.4需要更少的内存。当然,Linux2.4包含了比Linux2.2更多的功能,而很多的新特性都需要资源。
支持更多的系统总线
Linux2.2支持Intel硬件内部的所有主要总线,包括(E)ISA、VLB、PCI以及MCA。Linux2.4除此以外还包括对ISA即插即用设备(这种方案使ISA设备几乎与PCI一样智能)和智能输入/输出(I2O)设备的支持。最重要的是,Linux2.4是首个提供资源管理的强大系统的Linux内核版本。在开发Linux2.4的过程中发现,要使Linux完全支持USB、PC卡或其他先进的硬件,这是Linux作为一个“现代的”操作系统所必需的。
ISA PnP一直是Linux用户的主要问题。虽然由于更强大的PCI硬件的出现,对ISA硬件的支持已经缩小,但使用ISA PnP的设备仍在销售。以前,Linux用户使用ISA PnP硬件都是用pnp实用程序,它通常需要几个小时才能完成。有些版本试图自动完成这个过程,但都没有成功。而Linux2.4将ISA PnP支持同资源管理器结合在一起,从而解决了这一问题。不过对不太普遍的PnP硬件来说,Linux 2.4对ISA PnP的内核级支持还没有实现。
Linux 2.4也包括对I2O的支持,I2O是PIC的超集,PIC提供对内存、寄存器的集中管理。而I2O设备更深一层,可以在设备级上提供API,从而为设备提供操作系统的独立驱动程序。底层的操作系统需要识别“通配”的I2O API,而不是指定的硬件。由于这项技术还比较新,没有多少设备使用了该项技术,但这种产品一旦投放市场,Linux能马上做好准备。
目前对设备进行的主要工作并不是内部总线,而是外部总线,如PC卡总线和各种串行总线。Linux2.4也增强了对外部设备的PC卡支持。很多发行版本已经包含它了。不过为了更好地使用这些设备,Linux 2.4仍然需要一个外部的daemon(进程)和其他一些部件。
USB是许多新设备很欢迎的选件,包括非Intel的硬件。虽然,Linux对这些设备的支持还处于初期阶段,但是Linux内核已经支持大部分的通用USB硬件(包括键盘、鼠标、话筒等)。
Linux 2.4还增加了对Firewire(IEEE1394)的支持,Firewire一直以来受到很多高带宽设备的青睐。然而,至今很多现有的驱动程序或者设备不支持这些硬件体系结构,但是随着时间的推移,当该体系结构成熟的时候,这些支持将很可能得到改善。
改进的块设备支持
在简单的列表中,块设备被描述为一个可以不连续访问的字节数组。这将包括磁盘(你可以读你想要的任何扇区),但不是串口(因为你只能在线的末端读取)。延伸这个概念(例如弹出磁盘等)在Linux中通过ioctls(I/O控制)变得很容易。但是块设备的概念很长时间没有改变,第一个Linux内核修订本就支持已存在的IDE和SCSI磁盘驱动器。
在Linux2.4中,所有块设备的驱动程序都重写了一些,块设备API从接口中去掉了一些遗留的垃圾,并在内核级将模块API完全同文件API分开。但是如果模块维护人员运用了主子目录之外的模块,则需要对源码进行更新(没有人假定API与主要修订版内核完全兼容)。
在台式机中,普遍使用的是IDE总线磁盘驱动器。Linux从早期内核就开始支持IDE,Linux2.4在许多方法上增强了对这些设备的支持。首先,拥有多个IDE控制器的高端系统,如果将IDE控制器数从4增加到10个,则效果会更好。大多数的主板最多只有2个IDE控制器,这并不会对台式机的使用者产生多大的影响。其次,这些IDE驱动程序的改动提高Linux2.4对PCI和即插即用IDE控制器的支持,包括IDE软盘和磁带机、DVD和CD-ROM;最后,Linux 2.4包括了可以逐步解决一些IDE芯片驱动程序更新的问题,并且更好地支持其他先进的特性,例如ATA66。
看起来似乎SCSI子系统没有IDE子系统改动的多,SCSI子系统在外壳中进行了大量的重写,另外,这个版本中支持了许多新的SCSI控制器。
Linux2.4内核中一个全新的特性是实现了raw I/O设备,raw设备不通过高速缓存层处理,自动寻找到低级设备。万一一个复杂的程序要求完全的控制,用缓存方式无法满足,这时可以使用raw设备。raw设备能够用于数据要求严格的情况下,例如:我们确保数据立即写入磁盘,系统失败时不会遗失数据。以前的版本没有合适的方法,包括它们字面上需要加倍设备节点数以使每个块设备都有一个raw设备节点(这是一些商业Unix使用的方法),本版本使用一组设备节点来实现,它可以连接任意的块设备。
Linux 2.4一个主要改进是在主流内核中加入了LVM(逻辑卷管理)子系统。这在一些企业级的Unix,如HP-UX和