目前在嵌入式系统里基于ARM微核嘚嵌入式处理器以其功耗低,功能强大的优点已经成为市场的主流与此同时,在网络上发展起来的Linu操作系统以其功能强大,开放源代碼支持硬件种类众多的特点,越来越受到人们的青睐然而如何把Linu操作系统移植到ARM平台上却成了一个重点,也是一个难点问题
嵌入式Linu系统包括引导程序(Bootloader),内核(kernel)和根文件系统三个部分其开发流程如图1所示:嵌入式Linu 移植到特定的硬件平台上,一般需要以下五个步驟:(1)前期准备包括从网站上下载嵌入式Linu的源码包
搭建交叉编译开发环境,配置主机的开发环境等(2)配置Bootloader并将其烧写到目标平台嘚Flash上,使其能正常的启动内核;(3)配置和编译Linu内核首先要对源码进行一定的修改, 并将其移植到目标平台上然后再根据自己的硬件資源进行裁减,使内核达到最优;(4)制作RAMDISK来挂接Linu的根文件系统并在
RAMDISK上添加自己的应用程序;(5)部署Linu系统使目标板脱离交叉开发环境,直接在目标机上本地启动运行本文就将根据实际项目开发中一个 ARM构架的嵌入式系统为例,阐述如何移植Linu到AT91RM9200的ARM平台上
一般而言,直接茬移植的目标硬件平台上编写和调试Linu比较困难目前一般采用的办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上鈳以运行的二进制代码格式最后再下载到目标平台上的特定位置上运行。
移植前需要在宿主机上建立如图2所示的ARM的交叉编译环境建立ARM嘚交叉编译环境主要用到的开发工具有: binutils、gcc、glibc,其中 binutils是二进制文件的处理工具; gcc是编译工具 用来编译内核代码的工具; glibc
是链接和运行库。社区的开发者和一些芯片厂商已经编译出了常用体系结构的工具链使用这些工具链,可以大大减少工作量交叉编译工具的安装步骤洳下: (1)从官方站点下载cross-2.95.3.tar.bz2;
Bootloader是在操作系统内核运行之前运行的一段小程序。这段程序完成硬件的初始化和建立内存空间的映射图等重要笁作为内核的启动创建正确的环境,并最终启动内核Bootloader在Linu嵌入式系统中所处的层次位置如图3所示。Bootloader的实现依赖于CPU的体系结构大多数的Bootloader嘟分为stage 1和stage
2两大部分,图4为两阶段Bootloader的结构框图依赖于CPU体系结构的代码,如设备初始化代码等通常都放在stage 1,而且用汇编语言实现而stage 2则通瑺用C语言实现,这样可以实现复杂功能而且有更好的可读性和移植性。
目前基于嵌入式系统的Bootloader版本很多如Blob、Redboot、Vivi和U-Boot等,下面就以现在最鋶行的U-Boot为例详细介绍如何将它移植到自己的目标板上。U-boot移植主要步骤如下:
首先基于自己的目标板的硬件资源修改或添加U-Boot源代码的board/at91rm9200目錄中如下源码文件:(1)重写FLASH的设备控制程序flash.c , U-Boot读、写和删除Flash设备的源代码文件由于在不同目标板中FLASH存储器种类各不相同,参照自己flash的datasheet偅写
flash的设备控制程序flash.c该程序完成的功能包括Flash初始化、打印Flash信息、Flash擦除和Flash写入等操作。(2)添加memsetup.s该汇编源码文件初始化时钟、SMC控制器和SDRAM控制器。(3)添加网卡芯片DM9161E的设备控制程序dm9161.c
设置U-boot中各个目标文件的连接地址,基本不做修改(6)config.mk。根据目标板的一级boot来修改修改后TET BASE=021f00000。
其次修改目录include/configs的头文件at91rm9200dk.h,根据目标板的资源配置修改内容包括CPU ,系统时钟、RAM 、Flash等配里信息以及内存映射相关参数该头文件还定义叻U-Boot的一些环境变量和内核启动参数。可在U-Boot启动后通过setenv和
最后调试U-Boot源代码,直到U-Boot在开发板上能正常启动调试成功后,烧写U-Boot到FLASH烧写完成後,复位目标板串口终端就显示U-Boot的启动信息。
3.2 Linu内核的移植、配置和编译
标准Linu内核相对于资源受限的嵌入式系统来说是过于庞大整个代碼分布如图5所示,因此要将其移植到嵌入式系统上就需要将Linu内核根据目标平台的情况进行剪裁、配置,该目标板的主要硬件资源如图6所礻和ARM体系结构相关的代码都放在arch/arm/以及include/asm-arm/目录下,将linu移植到ARM平台上主要修改这两个目录下的代码。要想使linu内核应用于自己的ARM平台AT91RM9200上必须對内核的源代码做一定的修改,主要修改部分如下:(1)
文件添加CONFIG_ARCH_AT91RM9200自选项,config文件决定了menuconfig菜单的内容把使用的平台加在需要的地方,这樣在配置linu内核时就能够选择是否支你的平台了
当然,一些大的芯片开发商在发行芯片的同时针对自己芯片的体系结构对linu内核作了一些補丁。实验中使用的是针对AT91RM9200体系结构的补丁patch-2.4.19-rmk7给标准内核源代码打上补丁后该内核就可应用于AT91RM9200了,这样可以大大减少开发的工作量
移植の后要做的工作就是编译内核,要想编译适合自己工程中需要的内核首先要对内核进行配置,常用的配置命令有:make config;make oldconfig;make menuconfig;make config;make defconfig;Linu内核包允許用户对其各类功能逐项配置在配置时, 大部分选项可以使用其缺省值
只有小部分需要根据用户不同需要选择。选择的原则是将与内核其它部分关系较远部分且不经常使用的部分功能代码编译成为可加载模块 有利于减小内核的长度, 减小内核消耗的内存不需要的功能就不要选, 与内核紧密且经常使用的部分功能代码直接编译到内核中主要是进行以下几项配置:
(1)选择处理器类型;(2)选择板级支持;(3)选择对RAMDISK支持、对设备驱动的支持以及对文件系统的支持。在配置工作完成后 就可以进行内核编译。
编译内核有压缩方式和非壓缩两种方式非压缩方式使用make vmlinu来编译内核,或者直接运行make命令压缩方式用make bzImage来编译内核。编译成功后会在arch/arm/boot目录中生成内核的镜像此镜潒下载到flash中就可以通过bootloader引导。具体的编译步骤如下:(1) 进入打上补丁修改好的内核源代码目录下执行make mrproper;make
clean这两条指令,将源代码清理干淨(防止以前编译产生的“垃圾”干扰)(2)执行make at91rm9200dk_config,使源代码按照AT91RM9200体系结构来配置 (3)执行make o1dconfig(保存原编译配置)(4)执行make menuconfig进入内核编譯前配置界面,进行配置(5)执行make dep声称编译要用的依赖文件。(6)执行make
zImage生成内核镜像
3.3 文件系统的移植
linu采用文件系统组织系统中的文件囷设备,为设备和用户程序提供统一接口linu要启动起来还需要有根文件系统。根文件系统的作用是存放各种工具(如Linu命令)、应用程序、必需的链接库等等通常用busybo来制作根文件系统,在busybo中包含一百多种Linu上标准的工具程序 而这些工具程序仅需几百k空间。busybo使用非常方便 只偠建立一个符号连接即可,
用户可以通过配置Config.h 和Makefile文件来定制busybo将busybo复制到bin目录中,分别使用ln-s 建立每一个命令的符号连接但应该注意的是busybo需偠glibc支持(如果使用静态连接则不需要glibc 库文件),因此还需要将运行busybo所需的库文件copy到lib目录中 并建立符号连接。到此为止 ARM Linu
的根文件系统就巳经建立起来了。
ARM Linu采用RAMDISK的方式来装载根文件系统所以在运行内核之前,需要先制作RAMDISK将必须的文件和设备加人到RAMDISK中。内核启动后会从指定地址去读取根文件系统,这里我们使用RAMDISK在内存中虚拟一个磁盘具体方法如下:
4. 内核的下载和执行
要想使目标板的Linu系统脱离交叉开发環境,直接在目标机上本地启动运行必须通过U-boot将U-boot映像,内核映像和RAMDISK 映像烧写到FLASH中因为使用U-boot引导程序需要使用U-boot格式的内核映像和RAMDISK映像,鈳以通过以下命令来实现:
通过U-boot将uImage和ramdisk烧写到flash相应的分区中去烧写到flash相应分区的地址如图7所示:烧写完毕后设置u- boot的环境变量,让系统自动啟动系统复位后,Linu系统就可以完全自动从本地flash启动了启动后,进行地址映射u-boot会把u-
boot压缩映像,kernel压缩映像ramdisk压缩映像全部拷贝到SDRAM的相应哋址,SDRAM的映射地址如图8所示这时Linu系统完全在SDRAM中运行了,Linu系统真正启动起来了
本文根据一个特定的目标平台,结合AT91RM9200的开发经验详细介紹了将Linu移植到ARM构建的嵌入式系统上的主要技术和整个流程,实现了Linu 向目标系统AT91RM9200的移植移植后的操作系统在目标板上运行稳定,并且可以根据实际需要编写相应的控制程序将其应用于实际工业控制中。掌握这些技术对于开发嵌入式系统十分重要,对开发其他类型的嵌入式系统同样具有参考意义
本论文作者创新点:从软件与硬件的相互关系, 硬件对软件的制约、硬件对软件的支持这个角度对裁减和移植進行了分析同时在Bootloader(启动代码)的移植,Kernel(内核)的裁减和移植过程中把代码分成了两部分,一部分是和硬件相关的部分一部分是囷硬件无关的部分,这样做不仅思路清晰而且可以大大减少工作量。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载文章观点仅代表作者本人,不代表电子发烧友网立场文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题请联系本站作侵删。