基于ARM 920T S3C2440AL—40的EOS移植研究
2017-05-17胡恩博
胡恩博
摘要:首先简要阐述了Linux OS的內核目录及结构,之后详细描述将嵌入式Linux OS移植到SAMSUNG ARM 920T为内核的S3C2440AL-40芯片上的流程。通过移植流程的分析与研究,总结及优化了基于此类芯片向该类硬件平台移植Linux内核的方法,为改进OS的设计提供了重要参考,具有重要的应用价值。
关键词:移植;ARM;嵌入式;嵌入式操作系统;Linux
中图分类号:TP311.52 文献标识码:A 文章编号:1007-9416(2017)03-0044-02
1 引言
EOS(Embedded Operation System,EOS),即嵌入式操作系统。是一种用途广泛的系统软件,是基于软、硬件的广义概念,它负责分配软件与硬件资源、进行任务调度、控制协调并发活动等任务,具有强实时性、代码固化、可裁剪、便于移植等特点。当前比较流行的EOS主要有Linux、uCLinux、WinC、VxWorks、uC/OS-Ⅱ QNX等,而尤以Linux的通用与应用性最为突出。在嵌入式芯片上则以ARM为代表。故以下研究的是将嵌入式Linux OS移植到SAMSUNG ARM 920T为内核的S3C2440AL-40芯片的硬件平台上,与传统的移植方式不同之处在于BootLoader独立编写,并且给出了有针对性的、完整的编写流程,而非直接使用系统U-Boot。
2 Linux内核源码目录结构
Linux内核为系统核心组件,虽然版本众多,但主要模块不外乎内存管理、进程调度、文件系统、设备驱动及网络和进程间通信等。其一级目录结构如图1所示,二级及以下目录并未列出,在后续的移植过程中如有用到可根据所列目录推导其所属一级目录。此次移植研究使用的Linux版本号为 2.6.23。各级目录含义版本差异并不明显,这里不做过多阐述。
3 建立GCC编译环境
Linux系统开发方式多样,一般采取宿主机-目标机方式,其硬件连接示意如图2所示。此次移植Linux系统版本为Red Hat Linux 9,移植方式及流程与系统开发方式类似,在宿主机上裁剪及编译好所需的Linux系统,然后通过双绞线tftp传输完成移植,其流程如图3所示。
此次GCC编译器采用arm-linux-gcc-4.3.2版本,需要解压编译环境压缩包arm-linux-gcc-4.3.2.tgz来实现,其流程为:下载压缩包到任意目录→解压(/usr/local)→复制 arm 至 /usr/local,使编译环境集中在/usr/local/arm/4.3.2/bin→修改环境变量→重启。
经过以上流程后此次移植所需的GCC编译环境就建立起来了。不论采用那一个版本的编译器,编译环境的建立都大同小异。
4 BootLoader
在EOS中,一般并无和BIOS相似的固件程序,但有的ECPU内也会含有一段精简的启动程序,这里不作讨论。因此EOS的加载启动任务全部由BootLoader完成。BootLoader是EOS在加电后执行的首段代码,它运行在操作系统内核之前,在它完成CPU和相关硬件的初始化之后,即将操作系统映像或固化的嵌入式应用程序装载至内存中,然后跳转到操作系统所在的空间,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境,从而启动操作系统运行[1]。
ARM 920T的异常向量表有两种存放方式,一种是从0x00000000处开始的低端存放,另一种从0xfff000000处开始的高端存放,选择低端存放,建立异常向量表。S3C2440的看门狗在上电启动时默认为开启状态,所有要先关闭看门狗,否则代码运行不完全就会强制复位。重定位代码的目的是使代码的运行地址与链接地址相对应,之后就可以直接使用绝对地址。用C语言实现使用绝对跳转指令跳转到第二阶段。初始化串口可方便调试及为内核启动时打印信息做好准备。初始化Nand Flash时需注意将其内核镜像拷贝到内存。
5 Linux内核修改与编译
Linux内核移植前得先进行内核的修改,而后进行配置与编译。内核修改流程为:指定硬件与编译器→添加Header file→建立Nand flash分区表→加入Nand flash分区→J建立芯片支持→加入芯片支持至驱动→指定启动时初始化→禁止FlashECC校验。具体的修改命令与对应参数这里不做过多阐述。在完成针对性的内核修改后,需要对修改后的内核进行配置与编译,以便于后期的移植。配置方式相对简单,可使用makeconfig、makeoldconfig、makemenuconfig、makexconfig中的任意一种[2]。在配置做好后,需要对Linux 2.6.23的内核进行编译,方法相对简单,执行make即可编译内核与模块。
6 制作根文件系统
根文件系统是一个系统运行时必须且存储数据文件的外部设备。Linux内核代码映像文件便保存其中。BootLoader会从这个根文件系统设备上把内核执行代码加载到内存中去运行。可见其重要性[3]。
在Linux下输入ls 命令见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版本在对根文件系统布局上都遵循FHS标准的建议规定,该标准规定了根目录下各子目录的名称及其存放的内容,制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其通用流程一般为先编译、安装busybox,生成bin、sbin、usr/bin、usr/sbin目录;然后依次GCC构建lib目录;手工构建etc及dev目录;在创建其它空目录后对系统自动生成的proc目录进行配置;最后利用udev构建完整的dev目录并制作根文件系统的映像文件。
采用busybox制作cramfs文件系統的流程为:制作根文件系统→修改Makefile→去警告信息→配置busybox→编译busybox→创建cramfs所需目录→创建节点→目录对拷→创建cramfs→执行。制作过程中要注意,由于采用静态编译,故需去掉applets/ap-plets.c中的警告信息。配置busybox要选择静态编译并修改其属性。若假设创建cramfs所需目录均创建在rootfs下,则在目录对拷时在busybox中 install目录下除linuxrc目录外的其它全部目录均需拷贝到rootfs目录下,同时复制常用的lib文件,可稍微精简。创建节点前需要准备启动所需的linuxrc、rcS、inittab和fstab四个文件,创建两个节点console、null时必须以root身份。假设创建的cramfs文件系统压缩包名为ramdisk.gz,执行必须在rootfs上一级目录下。
7 Download
使用串口通过超级终端下载烧写编写好的BootLoader,通过网络tftp下载烧写修改及编译后的内核及根文件系统。若在虚拟机下移植,可使用Windows自带的通讯工具超级终端,或 Linux Vim 下使用Minicom。使用双绞线连接宿主机与硬件平台或开发板,在确保网络硬件连接无误的前提下设置好IP,通过指令"tftp a0008000(虚拟)zImage"下载烧写内核,成功后输入指令"tftp a0500000(虚拟) ramdisk.gz,若通过命令"go a0008000(虚拟)"可查看到移植内核及文件系统,则移植成功并完成。
8 结语
EOS的移植过程繁琐复杂,涉及到很多方面的知识,包括移植方式、移植核心的体系架构及硬、软件平台的搭建等,它要求实践者熟悉Linux命令及相关第三方软件的配置,对Linux内核及文件系统熟悉,对移植硬件平台或目标板的结构了如指掌。随着Linux内核不断升级完善及快速发展,硬件平台及目标板的结构的更新也异常迅猛。此次移植对以ARM为内核的EOS移值具有非常实用的应用价值,其本身即可作为一个实际应用案例。移植后的Linux系统在以ARM 920T为内核的S3C2440AL-40硬件平台上运行稳定、性能优良,达到了预期目标,满足后续在此平台上开发应用程序的实际应用要求。同时此次移植过程对采用不同硬件与软件平台的移植具有很好的参考价值。
参考文献
[1]李广军,阎波,林水生.微处理器系统结构与嵌入式系统系统设计[M].电子工业出版社,2011.
[2]向涛,吴光敏,李兰.基于S3C2410的嵌入式Linux操作系统移植[J].微机处理,2010(6):41-44.
[3]赵明鑫.Linux内核在ARM上的裁减与移植[J].计算机与数字工程,2009(7):81-84.