1 μClinux简介
μClinux从Linux 2.0/2.4内核派生而来,沿袭主流Linux的绝大部分特性。它是专门针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作。适用于没有虚拟内存或内存管理单元(MMU)的处理器。由于μClinux在标准的Linux基础上进行了适当的裁剪和优化,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,但μClinux仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持、以及标准丰富的API等。
μClinux的主要特点如下:
(1)内存管理
这部分是μClinux与传统Linux区别最大的地方。对于μClinux来说,其设计针对没有MMU的处理器,即μClinux不能使用处理器的虚拟内存管理技术,μClinux仍然采用存储器的分页管理。系统在启动时把实际存储器进行分页,在加载应用程序时程序分页加载,但是由于没有MMU管理,因此实际上μClinux采用实存储器管理策略。这一点影响了系统工作的很多方面。
(2)μClinux的内核加载方式
μClinux的内核有2种可选的运行方式:可以在FLASH上直接运行,也可以加载到内存中运行。由于RAM的存取速率要比FLASH高,因此后者可以减少内存需要,运行速度也更快。
(3)μClinux的文件系统
μClinux系统采用romfs文件系统。这种文件系统相对于一般的ext2文件系统要求更少的空间。这是由于内核支持romfs文件系统比支持ext2文件系统需要更少的代码,而且romfs文件系统相对简单建立文件系统超级块(superblock)需要的存储空间更少。
(4)μClinux的应用程序库
μClinux小型化的另一个做法是重写应用程序库。相对于越来越大且越来越全的库glibc μClibc对libc做了精简。
(5)可执行文件格式
μClinux系统使用flat可执行文件格式。另外,μClinux还提供通用的Linux API支持完整的TCP/IP协议堆栈和大量其他的网络协议,支持包括NFSext2ROMfs等多种文件系统。
2 建立μClinux开发环境
嵌入式系统的开发与一般的应用开发最大的差别在于,前者需要建立特殊的硬件环境,而后者一般基于特定的操作系统或分布式平台。后者的平台已经对硬件或网络媒质做了抽象,从而不需要由系统开发者来完成这些工作。而在嵌入式系统开发中,这也由开发者完成。
嵌入式系统开发环境一般分成主机端(HOST)和目标板(TARGET)两个部分。主机端是开发平台,用于运行开发过程中的各种工具(如Linux操作系统和ADI提供的集成开发环境Visual DSP++等);目标板是运行和测试平台,是嵌入式系统的最终驻留环境。在主机端和目标板之间需要通过某种方式进行通信,如使用RS 232串口或网口。通信的目的在于发送控制指令和传输数据,同时获得反馈信息。图1是系统移植工作的硬件环境。
目标板的硬件平台如图1所示:
主机端的PC使用COM1和BF533的UART相连接,通过串口完成对目标板的必要控制功能。本文设计的ADSP-BF533目标板上配备有1块SMSC LAN91C111以太网卡芯片和主机端建立原始(raw)IP连接,使用链路层地址完成大批量数据的传送。
在硬件环境建立之后,就需要创建软件开发环境。软件环境主要是指Blackfin体系结构的交叉编译环境。建立交叉编译环境首先要有交叉开发工具。交叉编译工具是指一组运行在某一种处理器上,却可以编译出另一种处理器上执行的指令的工具。它由一套用于编译、汇编和链接内核及应用程序的组件组成,通过编译可以使μClinux内核和应用程序在目标设备上运行。
编译μClinux一般使用GNU开发套件作为交叉编译器工具链,它包括一系列的开发和调试工具。在官方网站http:∥blackfin.μClinux.org上提供了Blackfin系列处理器内核的交叉编译工具。下载后按照说明解压到Linux系统的相应文件夹里,并设置系统环境变量,使这些交叉编译工具所在的目录为全局环境变量。至此就建立好了μClinux的软件开发环境。
3 利用U-Boot引导内核
U-Boot(Universal Boot Loader)是当前比较流行的遵循GPL条件的开放源码项目。也是是嵌入式Linux系统常用的Boot Loader之一。其完成的功能是初始化硬件设备、改变处理器运行模式、重组中断向量和建立内存空间映射图,从而将系统的软硬件带到一个合适的状态或者用户定制的特定状态,以便为最终加载操作系统内核准备好正确的环境。
U-Boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持种引导方式;具有功能强大且成熟、稳定等诸多优点,故本文采用U-Boot引导μClinux内核。U-Boot严重依赖于底层硬件,不同的CPU或嵌入式板极设备需要不同的U-Boot,不过因为本文的重点是μClinux的移植,所以这里不再详述U-Boot的具体实现过程。
当系统上电后,U-Boot从地址OxO开始执行,将存储器映射重新配置,如图1所示,并会执行μClinux的固化内核。
U-Boot可以使用ADI的仿真软件Visual DSP++通过仿真器或JTAG口下载到目标板上。
4 μClinux内核的编译和移植
作为操作系统的核心,μClinux内核负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统,决定着系统的各种性能。μClinux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统的功能。
4.1 内核配置
虽然μClinux的内核代码大部分独立于处理器和其体系结构,但是最底层的代码还是基于特定系统的。虽然各个系统存在相同之处,但是它们的中断处理上下文、内存映射的维护、任务上下文和初始化过程是独特的。这些例行程序放置在μClinux代码树的arch/目录下。这里需要根据自己的硬件平台来配置内核代码。配置过程如下:
可以从官方网站http://blackfin.μClinux.org处下载μClinux-list的内核源代码。运行解压命令:将tar-xvfμClinux-dist.tar.gz解压完毕后,就会生成/μClinux-dist目录,加入该目录后按如下顺序编译内核:
(1)make menuconfig;进入菜单方式配置指令;
(2)选择所使用的平台类型和所使用的库
本文设计的目标板选择:AnalogDevices/BF533-EZ-KIT和μC-libc库。在配置栏中,选择Load an AlternateConfiguration File,按确认,退出配置栏;
(3)make dep;寻找依存关系;
(4)make clean;清除以前构造内核时生成的所有目标文件、模块文件和一些临时文件;
(5)make lib_only;编译库文件;
(6)make user_only;编译用户应用程序文件;
(7)make romfs;生成romfs文件系统;
(8)make image;生成镜像文件然后通过Jtag口输入到目标板;
(9)make;通过各个目录的makefile文件进行,会在各目录下生成一大堆目标文件。
在上述步骤完成后,就完成了对μClinux源码的编译工作。最后会在/μClinux-dist/images目录下看到3个内核文件:linux.dxe,linux.bin和zImage.bin。如果编译不成功,需要根据编译过程的提示信息找到错误并重新编译,直到成功为止。
4.2 修改配置内核代码
直接由源代码编译生成的内核映像文件一般不会启动成功,需要根据自己的目标板进行配置。需要修改系统启动初始化文件crt0_ram.s,sysinit.c和ram.ld。
在crt0_ram.s中需要根据自己的目标板修改基地址、存储器大小和起始地址。在sysinit.c中需要修改片选设置,分别对FLASH和SDRAM进行片选设置。在ram.ld中修改内核连接加载地址。做完上面的修改,重新编译生成linux.dxe等文件。
4.3 μClinux内核的下载与执行
μClinux内核有2种可选的运行方式:一种是在FLASH上直接运行;另一种是加载到内存中运行,系统启动时从FLASH中读取压缩的内核代码(存储器空间有限,所以一般需要压缩内核代码)到内存中解压,然后开始执行,这种方法比第一种的速度更快(RAM的存取速度比FLASH的快)。所以选取第二种方法。
编译好的内核文件可以由Visual DSP++开发装置,通过网口或串口把linux.dxe下载到目标板的FLASH中,从设定的入口地址(一般为0x1000)执行即可启动内核。
启动μClinux就可以在超级终端看到μClinux的欢迎信息和简单的shell提示符,界面如图3所示。
5 在μClinux下添加应用程序
为了方便,μClinux用户层的应用程序代码都放在/μClinux—dist/user/目录下,否则要自己重新定义很多宏,而且容易出错。具体实现过程如下:
(1)在工作目录的user目录下创建应用程序的文件夹user/app然后编写应用程序,编写方法和普通的应用程序一样;
(2)在文件/user/Makefile里添加如下一句以便把用户的应用加入到μClinux系统的编译列表中;
dir_MYM(CONFIG_USER_MYAPP)+=app
(3)在/config/config.in里加入如下语句:
这样在编译时会多1个配置选项,当选择这一选项时,字符串“CONFIG USER MYAPP”就会定义为“Y,参考上一个步骤,dir Y+=app,应用会被编译入内核
(4)为便于内核配置在/config/config.help中加入有关该应用的帮助说明;
(5)回到/μClinux-dist目录,执行make编译μClinux系统内核和这里的应用程序。
6 结 语
对于嵌入式系统开发人员来说,要将嵌入式操作系统应用到嵌入式系统中,首先要做的工作是根据不同的硬件平台移植操作系统,掌握移植的方法非常重要。
本文所述的移植方法已经成功应用于多个项目的开发。所述的移植虽然是针对Blackfin处理器芯片ADSP-BF533,但重点阐述的是移植的思路和方法。对将μClinux移植到其他处理器为核心的硬件平台也有借鉴作用。
本文从如何将嵌入式操作系统μClinux与特定硬件相结合出发,分析移植μClinux到ADSP-BF533的过程。