当前位置:Linux教程 - Linux - Linux2.4内核为我们带来了什么?

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和Tru64 Unix中是一个系统和标准,它完全重新考虑管理文件系统和卷的方法。不需要深入细节,LVM允许文件系统跨越磁盘,调整大小,用更多灵活方式管理。LVM子系统的一些特性能够用md(复合设备)驱动器或用户使用的工具复制。而且,LVM子系统以标准兼容的方式提供这种支持,让商业Unix使用者至少感到有些熟悉。
Linux2.4另一个主要改进是支持RAID(冗余磁盘阵列)设备,许多磁盘同时工作提供冗余存储或快速读访问。在新内核中,几乎所有的RAID子系统都被重写。性能作为完善的RAID实现最重要的一方面,在SMP(对称多处理器)和单处理器系统中得到提高(在对称多处理器中,如今可以更好支持多线程)。另外,使RAID阵列递归和不用虚拟磁盘映像安装设置根盘的能力的代码已经有了很大的加强。当很多企业级用户接触Linux时,有强大的RAID子系统的特性成为它们接受与否的选择要素。

文件系统的改进
本地文件系统
有多种方法访问块设备,最常见的方法是使用文件系统(内部实现上,文件系统就像是为这个块设备描绘的一张地图,通过这张地图你可以找到想要的任何内容)。另外的方法有使用分区的方法访问块设备(结构非常类似于文件系统,只是处理方法完全不同)或者直接访问它。
Linux 2.4支持Linux 2.2实现的所有文件系统。这些文件系统包括FAT(适用各种版本的DOS)、NTFS(适用Windows NT,Windows 2000的支持不完备)、VFAT和FAT32(适用Windows 9x)、HFS(适用MacOS)、HPFS(适用OS/2)以及其他各种文件系统。新增支持的文件系统中,引人注目的有DVD盘使用的UDF文件系统和旧版本IRIX使用的EFS文件系统。因为要支持新扩展的页面缓冲系统,全部文件系统的代码都已经重新写过,所以运行会更有效率。
还有不少改进有助于提高与其他操作系统的兼容性:OS/2用户终于可以在Linux上写入他们的文件系统了;NT用户暂时还不能享受这项特权,因为其驱动程序还在试用阶段;NextStep用户可以在支持NextStep使用的UFS文件系统的同时,在Linux下访问光驱了。但必须注意,Linux目前还不能支持HFS+这种新的Macintosh文件系统。
Linux2.4尚不支持日志文件系统,尽管几个提供此项功能的项目正在接近达到稳定的程度。日志文件系统的最大优点就是它的容错能力。一个设计精良的日志文件系统能比传统的日志文件更容易地将损坏恢复,并且fsck时间更短,返回服务功能更快。ReiserFS无疑是现在最成熟的日志文件系统,将很快在发行Linux2.4之后加入到内核中。Ext3文件系统,作为包含了日志支持的Ext2的扩展,也将会在某个Linux2.4.x版本中出现。
对于嵌入式设备,Linux2.4增加了对JFFS和RamFS的支持。前者为日志闪快文件系统(Journaling Flash File system),后者是可以在运行过程中调整大小的内存文件系统。这两种文件系统目前都有了各自的用户。
网络文件系统
并不是所有文件系统都是作为块设备被加载的。像进程、共享内存和devfs文件系统等完全都是虚拟的。还有其他一些文件系统是通过网络被加载的,完成这个任务有各种方法,许多操作系统都提供它们自己的方法来处理。而Linux可以识别当前的大部分网络文件系统。
Windows世界使用服务器消息块(Server Message Block,SMB)协议作为它们的网络文件系统。新的Linux内核放弃了在编译内核阶段手动选择是从Windows9x还是NT/2000加载的选项,它将能够自动检测远端操作系统的类型并可以进行必要的除错。
在Unix世界里,使用Network File system(NFS)协议来共享文件。Linux2.4在显著提高NFS加载目录的稳定性同时,还将提供对NFS协议最新版本NFSv3的支持。NFSv3能更好地支持文件系统同步、文件锁定以及对企业环境非常关键的一些概念(NFSv4的支持正在开发当中)。
分区表
Linux2.4增加了对外部分区表的支持。Linux2.2和Linux其他版本支持PPC或m68k对Macintosh分区的读取。在Intel硬件上,内核可以识别标准IBM格式、BSD磁盘标签及其他公用扩展区。而Linux2.4消除了端口直接的障碍,因而可以无缝地使用附加在Intel Linux机器上的外部Macintosh硬盘驱动器。一般来说,如果编译时装载了驱动程序,Linux就可以读取它在任何端口可以识别的分区表格式。

增强的字符设备支持
仅能够被连续访问的这一类设备就叫Character Device(字符设备)。这些设备,像串口设备,能够从流数据或者压入数据读入。Linux2.4内核最突出的表现就是对这些方面做了很多主要的改进。
Linux2.4内核在这些方面最大的改进之一就是对键盘和鼠标的支持。以前的Linux内核支持串口和PS/2鼠标、键盘,而Linux2.4很好地支持USB接口的鼠标和键盘。另外,Linux2.4也支持那些没有被BIOS初始化以及无论键盘是否配备但是已经出故障的系统上。而且,Linux2.4包括对数字Pad的扩展支持以及模拟允许它们作为一个正常的鼠标使用,甚至当这个不是在硬件中直接支持设备的时候。
自从Linux2.2发布以来,Linux对串口的支持并没有改变多少。Linux2.4支持共享PCI串口接线板的IRQ资源,以前ISA接口和主板上的串口限制了这些功能。此外,Linux2.4为多端口串行卡提供了一系列新的驱动程序。希望这些改变以及以后的改进,使用户在Linux2.4下比以前更加容易使用串口设备。
在一个独立部分中,从Linux2.2开始就对所谓的“WinModems”(软调制解调器,软猫)支持做了很多工作。这些“软猫”很大程度上是靠软件起作用的,但是,这些“软猫”的厂家通常只提供Windows的驱动程序,通常它的DSP(数字信号处理技术)和其他硬件部分的功能必须在软件中执行,而不是传统的电路板上。虽然这些“软猫”厂家没有向Linux提供驱动程序代码,但是,为了更好地支持这些惹人厌的""软猫"",几个独立的驱动程序计划一直在努力改变这一境况。
虽然,在Linux支持大多数这些设备之前,将还有很长的路要走,但是事实上由于开放源代码运动的迅速发展,从而掀起整个业界滚滚而来的开放源代码趋势。
Linux2.4也基本上重写了并行端口子系统。在这个方面一个最主要的改变是支持所谓的“普通”并口设备。程序通常使用特殊的方法访问并行端口,或者很有可能仅仅为取得即插即用信息而检测端口。另外,如果在硬件支持的条件下,这次重写允许Linux2.4用户以增强模式访问并行端口,为了提高输入/输出速度,还使用UDMA。在新的Linux内核中,它同样也能发送所有的控制台信息到打印机之类的并口设备上,这就使得Linux通过把内核和纠错信息添加在一台行式打印机上,其功能将和许多商业Unix操作系统相抗衡。

增强的显卡支持
另一个更为复杂多样的设备是帧缓冲——许多显示卡就是这种设备。帧缓冲是内存中的一块区域,它代表了(或本身就是)显示卡存储器中的相应内容。对这部分内存进行写操作会影响到屏幕上相应点的颜色。它比其他设备复杂得多的原因是它须要进行I/O操作来完成修改调色板及其他一些视频功能。 Linux2.4包含许多新的驱动和对老驱动的改进。特别重要的是,Linux支持更多的“标准”VGA卡及其设置,至少是某些模式(哪怕只是16色模式——至少它能工作)。请记住这项功能可以被略过,除非你确定没有其他方法能够支持这些设备(在i386机器上)。目前,相对于系统核心,XFree项目提供更多的驱动程序来支持更多的显示卡,所以没有必要使用这项功能来支持XWindow系统。SVGAlib和其他一些库都可以在支持的硬件上进行直接显存操作,但是使用这些库必须要小心谨慎,因为存在安全问题并可能导致竞争冲突。系统核心在这方面的最大改变是加入了Direct Rendering Manager(DRM),DRM负责管理对图像硬件的访问,为了防止系统崩溃,它禁止许多对显卡的立即写入操作,这将会在很多情况下提高系统的稳定性。另外,DRM还作为显卡DMA访问的入口。总的来说,这些改变将使Linux2.4(与XFree4.x及其他兼容程序一起)进行密集型图像操作时更加稳定和安全。同时这些改变也将使某些电视接收卡可以在Linux下工作。
改进的网络协议实现网络一直是Linux领先的主要领域之一。Linux2.4会包括非常多的对这一层的更新,比如新的驱动、BUG修补以及现有驱动上的新功能。网络套接字的Linux模型是和Unix标准相兼容的,但不幸的是,这一标准存在可修正的不足。Linux2.2或者再早些的版本中,如果有很多进程都在等待网络接口的一个事件(例如一个Web服务器),它们会在事件探测到时全部被唤醒。所以,对于每一个Web页的请求,Linux会唤醒大量试图接收请求的进程。而多个进程处理同一个请求是无意义的,只有一个应该得到数据;剩下的只有重回到睡眠状态。Linux按此方式在尽可能快处理这些事件时,仍然很有效率,但是如果能去掉多余的唤醒会得到更高的效率。Linux2.4实现了“唤醒一个”的改进,Linux将会允许我们完全移除这一多进程的“惊跑效应”。总之,“唤醒一个”正如它的名字一样:只唤醒针对事件的那一个进程。这样可以使象Apache这样的应用程序更加有效率,使Linux更好地成为Web服务器的选择。 Linux2.4还包括完全重写过的网络层。实际上,它被作的尽可能不连续,使它可以比Linux的以前版本更好衡量。另外,整个子系统都被重新设计过,目标是能在多处理器上尽可能稳定地运行,还有很多可能的崩溃被消除了(这就是所谓的“软网”变化的一部分,它是最近才被整合的)。而且,它被优化了,可以和特定的网络协议槽配合,他们可用于一些通用的操作系统里,包括Windows。在这里还有一点需要提一下,Linux仍然是唯一完全和IPv4定义一致的操作系统,而且Linux2.4有引以自豪的IPv4实现,比它的前辈更容易升级。作为这次主要重写的一部分,内核的防火墙和IP伪装功能已经被完全再次重写。新的子系统已经被分为了两个部分:一个包过滤层和一个网络地址翻译层(NAT)。这些新的子系统比起它们的前辈有相当好的普遍性,而且它现在可能在任何的Linux系统中实现各种复杂的路由(第三层)。以前,这些功能只有在复杂而且专用的路由硬件上才能实现。不幸的是,这个主要的重写仍然包括另外的用户层的工具来达到可能的功能。为了兼容性,现在允许你使用Linux2.0(ipfwadm)或者Linux2.2(ipchains)工具的模块,而不会有大的功能损失。这就可以从任何一个这种版本的内核进行相对无缝的升级。 Linux的网络堆栈中增加了ECN(显示阻塞通知)功能。ECN可以让相应的路由器通知Linux某个路由堵塞,然后Linux对其作出响应,减少文件包传送的速度。长远来说,可以使Linux减少在堵塞路由上发送文件包,从而减少信息包在中继站传送的时间和占用的带宽。对于企业级的用户,有很多特性使Linux更好地集成到现有网络架构的老式和新式组件中去。这方面的一个重要补充是Linux2.4新特性,即对DECNet和ARCNet协议和硬件的支持(部分)。这样允许更好地和专有系统交互,包括更老式的Digital/Compaq。考虑到某些用户的特殊兴趣,Linux2.4将对高速网络的ATM网络适配器提供支持。对于低端的桌面系统用户,PPP是一个日常生活中的重要部分。Linux2.4对其进行了一些重要的重写和大量代码的模块化,包括等候已久的ISDN的PPP层和串行设备PPP层的结合,例如用调制解调器拨号连接。除了模块化,ISDN已经能支持更多新卡了。PLIP层(使用并行口的PPP)也被改进了,使用新的并行口抽象层。最后,以太网的PPP(PPPoE,供一些DSL提供者使用)支持也被加入了内核。尽管在Linux2.4中还不支持NetBEUI协议,但未来可能会支持。虽然微软将把它移出产品而转向TCP/IP,这个协议对于很多基于Windows的网络环境来说仍然是重要的。