方 帆
(巢湖学院 教务处, 安徽 巢湖 238000)
随着半导体技术的不断进步[1],嵌入式处理器的性能日益提高,嵌入式平台上可管理的硬件资源也随之增加.若仍采用基于处理器直接编程的模式进行嵌入式系统的开发,需了解硬件平台底层结构,增加了开发难度;若在硬件平台上引入嵌入式操作系统对各种硬件进行管理,并为用户提供硬件操作接口和编程接口[2],则可大大降低设计人员的工作强度,优化系统软件结构,提高嵌入式系统开发的便捷性和灵活性.
Linux是遵循通用公共许可证GPL协议的开源操作系统[3],因其代码可靠性高,内核可根据需要任意裁剪,支持大部分的32位、64位CPU和大部分网络通信协议等诸多优势而被广泛应用于嵌入式系统.目前已有很多文献和技术文档介绍Linux操作系统在ARM9、ARM11甚至最新的Cortex-A系列处理器上的移植[4-6].目前很多高校设计的嵌入式系统课程,对嵌入式系统的开发仍采用基于处理器直接编程的开发模式,缺乏嵌入式系统课程所需的科学性和先进性.本实验从嵌入式系统课程的实践教学需求出发,以ARM9架构的32位系统级芯片S3C2440A为硬件平台核心,进行嵌入式Linux操作系统的移植实验设计,使学生深入理解Linux操作系统的内核架构,掌握嵌入式Linux应用开发平台的构建方法,有效提高学生的实践动手能力和创新能力.
本实验选用友善之臂公司的Micro2440开发板作为嵌入式Linux系统移植实验的硬件平台.该开发板采用三星公司的S3C2440A微处理器作为CPU,S3C2440 A是基于ARM920T核设计的嵌入式微处理器,主频为400 MHz[7],具有低功耗、高集成度、片内资源丰富等特点,支持ARM-Linux、WindowsCE5.0/6.0等多种操作系统,被广泛应用于手持数码设备.硬件平台环境如图1所示.平台的主要硬件资源有64 MB的SDRAM、2 MB的NOR FLASH、256 MB的NAND FLASH,提供多个串口、USB接口和1个RJ-45接口,支持JTAG调试[8],为便于后续实验进行图形用户界面Qtopia的移植,还配备了3.5寸的TFTLCD.
嵌入式系统的开发需采用交叉开发环境[9],即编写、编译和链接软件采用的开发环境与软件的运行环境不同,通常采用宿主机-目标机开发模式[10],如图2所示.采用通用PC机作为宿主机,在宿主机上通过虚拟软件机安装并运行Linux系统,在Linux环境下使用交叉编译工具对引导加载程序、嵌入式Linux内核进行编译,并构建文件系统,编译成功后将镜像文件通过串口和网络下载到目标机的FLASH存储器中,并上电运行.
交叉编译环境的搭建包括以下步骤:
(1) Linux的安装.安装Linux通常有两种方法:硬盘直接安装和虚拟机安装[2].目前普遍的做法是安装虚拟机,利用虚拟机软件安装新的操作系统,对原有Windows系统没有影响,便于进行实验开发.常用的虚拟机软件有VMware和Virtual PC.本实验要求学生先安装VMware软件,新建并配置一个新的虚拟机,给虚拟机安装Linux操作系统.由于在嵌入式系统开发过程中需要根用户root权限支持,因此在命令行执行$sudo su,以保证本实验所有的配置操作和命令行编译均在根用户root下进行.
(2) 安装Linux开发工具链.在Linux平台下,为进行交叉编译,需安装源码编译交叉工具链或二进制工具链,建立GUN交叉开发环境.安装二进制文件方式对编译器各组成部件的版本号要求较高,因此本实验使用源码编译方式.在官网下载arm-linux-gcc-4.3.2版本交叉编译工具进行源程序的编译.gcc编译器适用于多种硬件平台,通过调用软件对源代码进行预处理、编译、链接等操作,生成完整的可执行文件.
(3) 安装Minicom仿真终端.在Linux环境下利用交叉编译环境对目标机进行调试,命令的输入和结果的输出通常采用串口工具.Linux下的串口通信使用最广泛的工具是Minicom仿真终端——一个串口通信工具,可用于串口设备的通信,具有强大的功能.
嵌入式系统软件体系架构如图3所示.其中,基于嵌入式Linux的系统软件由3部分组成:系统引导程序、嵌入式Linux内核和文件系统[11].引导程序Bootloader在硬件层之上,高度依赖嵌入式平台上的硬件,需用户根据嵌入式平台所采用的处理器架构和硬件电路结构进行设计,是用于对硬件平台进行初始化和引导操作系统内核启动的程序,根据所需实现的功能Bootloader大小一般为几KB至100 KB.嵌入式Linux内核是操作系统的核心,具备操作系统的基本功能,包括进程调度、内存管理、设备管理、网络接口和进程通信等,其大小为400 KB至900 KB.文件系统主要用于存储用户应用程序、系统配置文件、系统程序和部分驱动程序,其大小取决于用户设计的应用程序规模,从几百KB至几MB不等.
随着航天发射场规划建设水平的不断提高,发射场的发展进入了一个新时期,必然呼唤与之适应的设备体系.发射场机械设备推进“三化”(通用化、系列化、组合化),实现特种设备的装备化管理成为了发射场建设的新目标.模块化设计的总体目标是以较少的资源满足多样化的需求,将可靠性、维修性和保障性为核心的先进理念应用于设计阶段,实现发射场机械设备的顶层规划和一体化规划.依据变型设计的有关原理,进行通用化设计,运用功能模块置换,使特种机械设备种类大大减少,提高设备的互换性与适应性,促进设备的装备化保障管理,从而推进实现装备的通用化、模块化、系列化.
BootLoader是嵌入式系统上电后运行的第一段软件代码[12],负责硬件设备的初始化及操作系统内核的载入和启动.Bootloader高度依赖硬件电路结构和处理器的架构,没有通用的BootLoader,需用户根据硬件平台和微处理器架构进行特定的BootLoader设计和实现.但很多芯片厂商出售的嵌入式开发板会直接提供Bootloader,用户可以直接编译后写进FLASH,不需要自行编写.常用的BootLoader包括GRUB、RedBoot、uboot和vivi等[9],其中uboot是最常见的BootLoader,用于启动Linux系统的加载程序,其功能简单,能够帮助学生掌握引导加载程序编译和移植方法,也适用于该实验.
配置和编译Vboot的步骤:
(1) 创建工作目录/opt/fangfan/micro2440,并在命令行执行:
#mkdir-p cd/opt/fangfan/micro2440之后所有的源代码都解压安装到此目录下.
(2) 在/tmp目录下,创建临时目录/tmp/fangfan,用于存放下载的各种源码包,创建的命令为:
#mkdir-p/tmp/fangfan
(3)下载Vboot源代码,并在当前工作目录下进行解压,代码为:
#cd/opt/fangfan/micro2440
#tar xvzf/tmp/fangfan/vboot-src-201204.tar.gz
解压后会自动在当前目录下创建uboot目录.该目录下保存了uboot的源代码和makefile文件.
(4) 编译uboot并下载到嵌入式硬件平台,代码为:
#cd/opt/fangfan/micro2440/uboot
#make
编译后,如果源代码没有任何错误,会在当前工作目录下生成uboot.bin的目标文件,可直接通过串口下载到嵌入式硬件平台的Nand FLASH中[13],重启开发板可在minicom仿真终端看到相关信息,如图4所示.该源代码适用于micro2440开发板,无须修改.若要修改配置文件,可通过make指令修改vboot目录下的makefile文件.
嵌入式操作系统是嵌入式系统软件架构中最主要的组成部分,而操作系统内核的配置和编译是操作系统能否构建成功的关键步骤.Linux内核主要由内存管理、进程调度、设备驱动、虚拟文件系统和设备驱动等组成[10],其相互关系如图5所示.
操作系统内核移植是嵌入式系统开发人员在系统开发时必须考虑的.本实验系统选择Linux-2.6.32.2内核进行移植.该内核是目前针对micro2440开发板最新版本的内核,很好地实现了操作系统的大部分功能.下载到目标机前针对处理器架构对源代码进行修改,根据目标开发板的硬件架构配置和编译内核,使内核能够在定制的硬件平台上控制外设,便于应用程序通过系统调控外设工作.首先下载并解压Linux-2.6.32.2内核源码,创建生成的Linux-2.6.32.2目录如图6所示,执行#cp config_mini2440_t35.config,针对目标板LCD液晶屏的型号复制相应的内核配置文件.
执行#make menuconfig命令,可获取内核配置菜单,如图7所示.在该界面中,可对常规设置、处理器类型及其特性、文件系统类型选项等内容进行配置.本实验主要对该嵌入式系统后续需要用到的几个主要外设进行驱动配置,包括LCD驱动配置、DM9000网卡驱动、NAND FLASH驱动配置.对DM9000网卡的配置如图8所示,配置完成后保存设置并退出.确定所有的配置正确后,运行#make zImage进行内核编译,生成Linux镜像文件,并用串口和网络下载镜像文件到目标机.
文件系统是操作系统的重要组成部分,负责存储和组织计算机文件和数据.根文件系统是一种目录结构,专门用于存放Linux启动所必需的目录和关键性文件,嵌入式Linux系统加电时必须首先从指定位置挂载根文件系统,才能保证系统的正常启动.Linux支持多种文件系统类型,包括YAFFS系统、CRAMFS系统、ROMFS系统、NFS系统等.其中YAFFS文件系统是专为嵌入式系统使用Nand Flash而设计的一种日志型文件系统,包含YAFFS和YAFFS2两个版本,具有良好的可移植性、较快的速度和较短的挂载时间,占用的内存较小,适用于低功耗嵌入式系统.由于YAFFS2比前一版本支持更大的NAND FLASH芯片,而本实验采用的Micro2440开发板具有256 MB的Nand Flash,选用YAFFS2文件系统,可直接采用Busybox构建嵌入式平台的根文件目录系统.
Linux下一个基本功能的根文件系统通常包含以下几个目录:dev目录、etc目录、lib目录、mnt目录、proc目录、sys目录、tmp目录、var目录、opt目录.根据嵌入式系统设计的需要可对根文件系统的目录进行调整,移除一些不需要的目录,如为多用户提供可扩展环境的目录、/home、/mnt等.构建目标机根文件系统的步骤如下:
首先,在Linux虚拟机中创建根文件系统目录roofs,以及该目录下所需的子目录,包括dev、etc.
其次,安装编译Busybox.Busybox是搭建嵌入式Linux系统经常安装的一个非常有用的工具,集成了很多标准Linux工具的程序,包括常用的cat、echo以及http服务器、telent服务器等,但整个Busybox的大小却只有1 M左右[7].Busybox的发布形式是一个压缩包,可在官网www.busybox.net免费下载,在Linux系统下解压缩后进行配置.与一般Linux内核编译配置方式相同,Busybox采用ncurse动态库,提供了一个基于文本的窗口,用户可在该窗口下配置需要用到的Busybox功能.在busybox路径下使用make menuconfig命令,进入Busybox的配置窗口,如图9所示.
最后,选择Build options.为完成交叉编译,使Busybox了解交叉编译工具链的位置,需选择Cross Compiler prefix,在其中填好交叉编译工具链的位置.配置好所需的全部功能后,保存并退出配置窗口;使用make命令,用make install命令完成编译和二进制文件的安装.最后完成文件系统的制作.在dev子目录中创建主设备结点和从设备结点,在etc子目录下添加并配置文件[14],制作文件系统映像,并用串口和网络下载镜像文件到目标机,完成目标机上嵌入式Linux平台的搭建.
本实验采用2人一组的方式,实验过程分为理论知识学习、实验操作和实验总结3个阶段[15],其中实验操作又分基础部分、扩展部分和创新部分.具体的实验流程和实验内容见表1.
表1 实验流程和实验内容Tab.1 The process and content of the experiment
本实验基于ARM9嵌入式硬件平台设计嵌入式Linux操作系统的移植实验,硬件平台采用ARM9内核S3C2440A微控制器为主控芯片,Linux-2.6.32.2内核在该平台上的移植步骤包括:BootLoader移植、Linux内核的配置和移植、Busybox的配置和安装,以及根文件系统的构建.该实验不仅实现了嵌入式Linux平台的构建,还根据学生的完成情况及能力对实验系统的软硬件进行了扩展,以及进行驱动程序的开发和qt用户界面的移植[16],并在此基础上开发GUI程序.该实验既能让学生深入理解Linux内核的架构和移植方法,又进一步地进行了嵌入式Linux系统的应用开发,有效地培养了学生的工程实践能力和创新意识,为培养高素质应用型人才奠定坚实的基础[17].