×
嵌入式 > 嵌入式开发 > 详情

嵌入式Linux在IOP331上的移植实现

发布时间:2020-05-21 发布时间:
|

引言

虚拟磁带库是指对于用户端(备份服务器/网络端)体现为常规磁带库,但是使用磁盘阵列为存储介质的备份设备。它不仅大大提高了系统的可靠性和可用性,而且对于那些主要使用磁带为数据存储介质、现在想更换为磁盘阵列但又不想全部更换原有设备的用户来说具有非常重要的意义。虚拟磁带库的实现,依赖于以下三项核心技术:嵌入式微处理器、存储协议微处理器和嵌入式操作系统。嵌入式微处理器作为系统的主控单元,实现人机交换及存储协议处理器的控制,同时也是嵌入式操作系统的运行平台;存储协议微处理器实现与存储介质之间的数据传输;嵌入式操作系统主要实现内存管理与进程调度,为设备驱动程序与用户应用程序提供软件平台。本文首先介绍Linux操作系统和Intel 高性能I/O处理器IOP331,然后详细分析移植的各个步骤,最后给出验证和结论。

1.Linux操作系统和IOP331

Linux操作系统源码开放,遵循GPL声明,可以自由修改和传播。由于专用实时操作系统价格昂贵及源码不公开,使Linux在嵌入式应用中占有一席之地。由于Linux自身有诸多优势,吸引了很多开发商的目光,成为嵌入式操作系统的新宠。其源代码可以从Linux的相关网站下载。

本设计使用的嵌入式微处理器是基于XScale的高性能I/O处理器。XScale是Intel公司定义的基于ARM V5TE(除浮点运算外),即支持Thumb模式及DSP扩充指令集的ARM V5体系结构。其硬件体系结构如图1所示。

图1 Intel 80331硬件体系结构图

2.Linux操作系统的移植

2.1 建立交叉编译环境

在移植前需要在主机上建立交叉编译环境。作者在使用的主机上安装了Fedora Core 4的系统,从网上获得了建立交叉编译工具链的软件包crosstool-0.42.tar.bz2。使用最新的binutils和kernel,gcc版本为4.0.2,glibc版本为2.3.6。

解压并修改相关的配置文件后运行demo-arm-xscale.sh脚本建立armv5l-linux的交叉编译工具。整个的建立过程可以分为如下几个阶段:

定义环境变量à解压linux内核并对内核打补丁à编译安装GDB for XScaleà编译安装bintuils工具集à编译安装有关基本的针对XScale CPU的gcc(只支持C语言编译)à编译生成Linux内核à编译用于用户程序的glibc程序库à建立完整功能的gcc。

2.2 配置和编译内核

下载Linux-2.6.15.4内核源代码和针对IOP331的补丁文件patch-2.6.15.4-iop1。解压内核后使用patch命令对内核打补丁。由于作者使用的是Ramdisk文件系统,故内核配置选项中应支持RamDisk support和Initial Ram disk (initrd) support选项。然后使用已经建好的交叉编译工具链进行编译。

内核编译完成后,从目标平台通过TFTP协议下载内核映像。如果是内核映像的最终版本,则使用RedBoot的fis命令将其烧入Flash中,之后每次启动时RedBoot将从Flash中装载内核映像至内存中并解压启动。

上面提到的主Makefile是指根目录下的Makefile。它的作用是:根据.config配置文件形成编译的源文件列表à使用CC对源文件进行编译à使用LD把目标代码链接到一起à形成Linux内核映像和相关文件。[page]

2.3 制作Ramdisk根文件系统

嵌入式系统通常不自带磁盘,这对于要使用文件系统的真正文件的情况来说是一个需要解决的问题。文件是需要存储介质的,所以需要以其它介质来充当磁盘。使用一部分内存空间来代替磁盘的方法就是所谓的“Ramdisk”技术。对此,Linux内核中有相关的支持。

本文使用Busybox工具制作Ramdisk根文件系统映像。首先下载压缩工具包busybox-1.01.tar.tar,解压后进行配置,使能Build BusyBox as a static binary (no shared libs)并配置交叉编译工具链的路径后编译,编译得到的文件在_install文件夹下。配合内核参数0x00800000,0x01000000使用下列命令创建16M的基本Ramdisk映像文件:

dd if=/dev/zero of=ramdisk.img bs=1k count=16k

mke2fs ramdisk.img

编写脚本文件在文件系统中生成基本的目录结构和设备节点。使用mount命令将其挂载到一个文件夹下,将busybox编译得到的全部文件复制到该文件夹下后根据实际需求加入其它内容后卸载映像文件,压缩该映像文件即可得到需要的Ramdisk根文件系统映像。

2.4 内核启动

嵌入式系统跟普通PC机的启动流程不同。PC机启动流程为:系统加电或复位à启动BIOS完成系统硬件启动并将硬盘(或软盘、光盘等)上的有关操作系统启动的系统软件调入内存à bootloader将系统代码读入内存à操作系统初始化àbootloader将控制权交给操作系统à操作系统启动。

图2 Linux移植流程图[page]

在本嵌入式系统中我们选择的是RedBoot,它是Red Hat的一个标准嵌入式操作系统引导和Debug环境。RedBoot在这里完成了BIOS和BootLoader的任务,所以使用exec命令启动操作系统时,控制权在操作系统手中。此时,操作系统进行了如下操作:使用0x00000100的boot标记à解压缩内核à显示版本信息à显示系统基本信息(CPU、内存等)à使用内核参数准备启动Ramdisk文件系统à初始化并注册系统设备à解压缩在block 0的Ramdisk根文件系统映像à解压并加载Ramdisk根文件系统à根据根文件系统中的初始化脚本文件运行。                                     

使用RedBoot的exec命令启动操作系统,则串口能够打印系统启动画面,由此可以验证移植成功。

在系统启动的时候使用initrd来实现由bootloader(RedBoot)挂载Ramdisk盘,该盘作为根文件系统被挂载,并且供其它程序在它上面运行。

至此,整个操作系统移植过程结束,其流程如图2所示。                                                 

3.移植验证

IQ80331是Intel公司针对IOP331设计的评估板。板上资源除8M Flash、256M内存、JTAG外,还有网口和串口与主机通信。通过网口和TFTP协议可以从主机下载文件到评估板,通过串口可以在Linux主机上的minicom中向评估板发送和接收评估板消息。

我们将嵌入式Linux操作系统移植至评估板,并在上述基础上搭建虚拟磁带库(VTL)。在IQ80331上连接一块双通道SCSI控制器 LSI53C1030T,1030T的一个通道连接SCSI磁盘,另一个连接到主机主板上的单通道SCSI控制器LSI53C1020T上。这样,在主机看来,IQ80331、1030T和SCSI磁盘就组成了一个设备,读写该设备跟直接读写一个磁带没有区别。这就实现了一个虚拟磁带库。加载相关的 SCSI设备驱动模块后系统可以正常运行。

在主机端使用tar命令将38.0M的linux-2.6.15.4.tar.bz2文件写入SCSI磁盘,耗时18.1s,平均速度2.1M/s,能够正常稳定工作。占用系统时间约0.1s,充分体现了I/O处理器对系统输入输出处理的重要作用。

4.结论

经验证,移植后的系统稳定可靠,以此为基础搭建的VTL系统能够正常稳定工作,满足设计要求。同时,本文对于同类XScale架构的处理器上的操作系统移植具有普遍意义。

本文作者创新点:首次在虚拟磁带库设计中,将标准Linux操作系统移植到Intel 80331 I/O处理器,并对其过程进行了详细地阐述。

参考文献:

[1] 毛德操,胡希明。嵌入式系统——采用公开源代码和StrongARM/XScale处理器[M].。浙江大学出版社,2003

[2] 马忠梅,李善平,康慨等。ARM & Linux嵌入式系统教程.。北京航空航天大学出版社,2004

[3] 林涛,孙鹤旭,云立军等。Linux在嵌入式系统中地实现。微计算机信息,2004

[4] 陈金明,潘国良,白英彩。基于Intel IOP处理器的存储网络技术的研究与实现。计算机应用与软件,2006


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
寻找半导体产业未来10年的驱动力