全面系统移植Linux
现在,Linux系统已广泛地应用于科技和商业领域。在中高端领域,Linux系统除了支持包括文件、电邮、网络服务器在内的企业架构外,还支持诸如防火墙、VPN服务器、路由器和网关等业务单元架构;在低端领域,Linux通常用于嵌入式系统中,例如进程控制系统、PDA、家用网关和机顶盒等。
在系统启动和管理方面,Linux系统在企业中的应用与桌面应用十分类似,它们使用同样的启动机制。这一点在下文中将予以介绍。
由于嵌入式系统需要迅速启动,因此它所启动的进程数量有限,操作的资源也有限。用于嵌入式系统的存储设备和小型硬件限制了系统的存储空间。有限的存储空间决定了嵌入式系统必须采用专门的文件系统和硬件解决方案,例如磨损持平技术(Wear-Leveling)。该系统并不适用于普通系统,只可在一些以特定存储设备为目标的文件系统中实施。这些存储设备的写入次数是特定的,因为磨损持平技术的目标就是确保所有的目标存储器的写入次数大体相同。
嵌入式系统核心构件
所有Linux套件都包含同样的核心构件:一个内核和一个根文件系统。后者包含着系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件。在标准的开发系统中,根文件系统中的许多应用软件都是编译软件和用于应用软件开发的相关软件(习惯上被称为工具链)。
嵌入式Linux系统通常也包括同样的核心构件,只是它们有一些特殊之处。由于嵌入式系统的开发通常是在桌面系统环境下完成的,并且它的目标是特定的嵌入式开发主板。诸如TimeSys Linux之类的嵌入式Linux套件为嵌入式主板提供了特殊的内核、根文件系统和多套工具链。其中一套工具链集成在文件系统的内部,另一套则安装在桌面系统的文件系统中。后者被称为交叉编译程序,可以产生可以在嵌入式主板上执行的二进制命令。TimeSys Linux还包括第三套工具链,可以在Windows系统中运行,并产生运行于嵌入式主板的二进制命令。
宿主系统和目标系统对于大多数嵌入式系统开发是十分重要的概念。交叉编译程序经常用于嵌入式系统开发的原因是嵌入式主板一般没有对应用软件进行编译和优化所需要的资源。同样,它们也没有足够的空间进行全面开发或纠错。常用的解决方案是使用诸如NFS (网络文件系统)之类的技术,获取实际上存储于桌面开发系统的文件系统。因为桌面系统可以提供交叉编译程序和用于开发的存储空间,该系统环境被称为宿主系统。由于嵌入式系统开发主板是应用程序最终的存储和运行场所,因此它又被称为目标系统。
总之,宿主系统用来建立最终用于嵌入式系统的文件系统。对于大多数嵌入式系统来说,它包括一些压缩的、存储于内存中的文件系统,通常被称为初始RAM磁盘,以及其它存储于闪存中的压缩文件系统镜像。这些可以加载到内存中,也可直接调用。
与嵌入式Linux套件相关的各类工具链和文件系统组件增加了嵌入式系统移植的复杂程度。例如,为了给嵌入式主板编译2.6内核,必须先升级用户使用的交叉编译程序。但是,在此之前用户也许还要先升级用来开发交叉编译程序的桌面系统编译程序。
升级嵌入式系统
如果用户安装了一个与TimeSys Linux 2.6一样的商业Linux套件,那么它能提供一整套已经过验证、可以共同工作的核心Linux组件。然而,即使是在这种情况下,用户在已有系统上所做的改动也无法全部自动移植给新的SDK(系统设计成套工具)。通常情况下向基于2.6内核进行系统移植包括以下过程:
◆升级所有强制性套装软件以适应编译程序,在与嵌入式系统相关联的任意桌面系统上建立系统环境。
◆升级所有强制性套装软件以适应为目标系统开发应用软件的所有交叉编译程序。
◆ 将已定制的内核设置移植到2.6内核下。
◆ 将所有硬件驱动程序修改为2.6内核下可用的驱动程序。
◆升级所有强制性套装软件,以便与用于现有根文件系统或初始RAM磁盘的应用软件和工具软件相适应。
◆ 将所有系统管理和设置变化由现有根文件系统移植到2.6内核下的新根文件系统中。
◆ 将已定制的应用软件由现有根文件系统移植到2.6内核下的新根文件系统中。
初始RAM磁盘和根文件系统
文件系统是供系统读写数据的存储媒介所在的区域。Linux系统使用文件系统的目的多种多样,即包括存储系统、用户文件和文件目录,也包括作为用来支持虚拟内存的对换空间。Linux系统中最主要的文件系统是根文件系统,用户可以通过“/ ”目录安装。
将内核加载入内存的第一步是Linux系统的启动。许多Linux系统在启动时,内核都会使用一个已存入内存的文件系统——初始RAM磁盘。初始RAM磁盘未经任何压缩,可直接加载入内存,并且在启动过程中可作为一个暂时的根文件系统使用。通过初始RAM磁盘用户可以执行命令,也可以在用户使用系统硬件前,预先加载后续步骤所需的模块。在桌面系统中,初始RAM磁盘几乎是一个通用的过度过程。在内存充足的嵌入式Linux系统中,初始RAM磁盘是Linux系统运行中实际使用根文件系统。
TimeSys的Target Configurator工具软件作为TimeStorm Linux开发套件中的一员,可以大大简化初始RAM磁盘的创建过程,Target Configurator创建的初始RAM磁盘包含有启动时间和运行时间所需的所有系统软件。Target Configurator还可以简化向用作根文件系统的初始RAM磁盘和诸如JFFS 2或ext 3等用于不同类型存储设备的文件系统增加应用软件的过程。
TimeSys Linux 2.6 Reference Distributions包含有预先汇编的、用于所有支持平台和架构的初始RAM磁盘。大多数Linux套件可提供一些小型程序(如用于Red Hat Linux的mkinitrd),以便用户建立自己的初始RAM磁盘。然而,如果用户正在向基于2.6的内核移植,并且想继续使用用户已编制好的初始RAM磁盘,那么用户需要对它的内容进行检验以便与新内核兼容。
用户可以将初始RAM磁盘作为一个Linux系统中的回送硬件进行安装,从而对它进行检验。虽然回送硬件是一种虚拟硬件,但是Linux系统可以像访问真实硬件一样访问它。在安装初始RAM磁盘前,用户必须确定当前的内核支持回送硬件设备。对于2.6内核来说,用户可以通过内核设置编译程序中的Device Drivers→Block Devices→Loopback device support选项为回送硬件提供支持。在2.4内核下,该选项在Block Devices→Loopback device support。
在使用GRUB引导程序的桌面Linux系统中,系统的初始RAM磁盘通常作为一个分离的内核外部文件而存储。该文件一般在/boot目录下,且可以在GRUB设置文件(/etc/grub.conf)中进行识别。在大多数的嵌入式系统中,初始RAM磁盘是作为内核外部文件创建的,但是却作为内核搭建的最后一步与内核捆绑在一起。
桌面Linux系统通常使用在初始RAM磁盘中使用ext 2文件系统,而大多数嵌入式Linux系统作用更小、更简单的文件系统,例如CRAMFS、ROMFS或Minix。无论初始RAM磁盘中包含的是什么类型的文件系统,初始RAM磁盘通常使用gzip对文件进行压缩,以便节省更多的空间。Linux初始RAM磁盘加载程序可以对压缩后的文件进行识别,并在安装前自动对其进行解压缩。
如果用户已有一个初始RAM磁盘并希望将它移植到2.6内核下,那么用户需要解压缩、安装并对其进行检测。因为初始RAM磁盘通常都是处于压缩状态的,所以用户需要对文件进行重命名才能成功解压。初始RAM磁盘常用的解压缩和安装命令如下: