0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux向目标系统AT91RM9200的移植方法与应用优势分析

电子设计 来源:郭婷 作者:电子设计 2019-08-22 08:08 次阅读

1.引言

目前,在嵌入式系统里基于ARM微核的嵌入式处理器以其功耗低,功能强大的优点已经成为市场的主流。与此同时,在网络上发展起来的Linux操作系统,以其功能强大,开放源代码,支持硬件种类众多的特点,越来越受到人们的青睐。然而如何把Linux操作系统移植到ARM平台上却成了一个重点,也是一个难点问题。

Linux向目标系统AT91RM9200的移植方法与应用优势分析

嵌入式Linux系统包括引导程序(Bootloader),内核(kernel)和根文件系统三个部分,其开发流程如图1所示:嵌入式Linux 移植到特定的硬件平台上,一般需要以下五个步骤:(1)前期准备包括从网站上下载嵌入式Linux的源码包, 搭建交叉编译开发环境,配置主机的开发环境等(2)配置Bootloader,并将其烧写到目标平台的Flash上,使其能正常的启动内核;(3)配置和编译Linux内核,首先要对源码进行一定的修改, 并将其移植到目标平台上,然后再根据自己的硬件资源进行裁减,使内核达到最优;(4)制作RAMDISK来挂接Linux的根文件系统,并在 RAMDISK上添加自己的应用程序;(5)部署Linux系统使目标板脱离交叉开发环境,直接在目标机上本地启动运行。本文就将根据实际项目开发中一个 ARM构架的嵌入式系统为例,阐述如何移植Linux到AT91RM9200的ARM平台上。

Linux向目标系统AT91RM9200的移植方法与应用优势分析

2.建立交叉编译环境

一般而言,直接在移植的目标硬件平台上编写和调试Linux比较困难,目前一般采用的办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。

移植前需要在宿主机上建立如图2所示的ARM的交叉编译环境,建立ARM的交叉编译环境主要用到的开发工具有: binutils、gcc、glibc,其中 binutils是二进制文件的处理工具; gcc是编译工具, 用来编译内核代码的工具; glibc 是链接和运行库。社区的开发者和一些芯片厂商已经编译出了常用体系结构的工具链,使用这些工具链,可以大大减少工作量。交叉编译工具的安装步骤如下: (1)从官方站点下载cross-2.95.3.tar.bz2;

(2)在usr/local/arm下解压:#tar -jxvf cross-2.95.3.tar.bz2;

(3)在/etc/bashrc文件中修改PATH环境变量,加入export PATH=/usr/local/arm/2.95.3/bin:$PATH。

3. ARM Linux系统的开发

3.1 Linux启动代码Bootloader的移植

Bootloader是在操作系统内核运行之前运行的一段小程序。这段程序完成硬件的初始化和建立内存空间的映射图等重要工作,为内核的启动创建正确的环境,并最终启动内核,Bootloader在Linux嵌入式系统中所处的层次位置如图3所示。Bootloader的实现依赖于CPU的体系结构,大多数的Bootloader都分为stage 1和stage 2两大部分,图4为两阶段Bootloader的结构框图。依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage 1,而且用汇编语言实现。而stage 2则通常用C语言实现,这样可以实现复杂功能,而且有更好的可读性和移植性。

Linux向目标系统AT91RM9200的移植方法与应用优势分析

目前基于嵌入式系统的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 和dm9161.h,程序。(4)修改Makefile文件。对上述修改或添加的源代码文件编译后,在Makefile里面主要做如下修改: OBJS :=at91rm9200dk.c at45.o dm9161.o flash.o SOBJS:=memsetup.o(5) U-Boot.lds ,设置U-boot中各个目标文件的连接地址,基本不做修改。(6)config.mk。根据目标板的一级boot来修改,修改后TEXT BASE=0x21f00000。

其次,修改目录include/configs的头文件at91rm9200dk.h,根据目标板的资源配置,修改内容包括CPU ,系统时钟、RAM 、Flash等配里信息以及内存映射相关参数。该头文件还定义了U-Boot的一些环境变量和内核启动参数。可在U-Boot启动后通过setenv和 saveenv命令修改。U-Boot-1.1.2版本对at91rm9200处理器提供良好的支持,因此对于目录CPU at91rm9200中的源码基本不做修改。在U-Boot-1.1.2的Makefile中加入如下代码:

at91rm9200dk_config: unconfig@/mkconfig $(@: _config=) arm at91rm9200 at91rm9200dk

其中“arm”是CPU的种类,at91rm9200是ARM CPU对应的代码目录,at91rm9200dk是目标板对应的目录。由于交叉编译器安装在目录/usr/local/arm,应把环境变量 CROSS_COMPILE设置成相应路径:CROSS_COMPILE=/usr/local/arm/2.95.3 /bin/arm-linux-

最后,调试U-Boot源代码,直到U-Boot在开发板上能正常启动,调试成功后,烧写U-Boot到FLASH,烧写完成后,复位目标板,串口终端就显示U-Boot的启动信息。

3.2 Linux内核的移植、配置和编译

Linux向目标系统AT91RM9200的移植方法与应用优势分析

标准Linux内核相对于资源受限的嵌入式系统来说是过于庞大,整个代码分布如图5所示,因此要将其移植到嵌入式系统上,就需要将Linux内核根据目标平台的情况进行剪裁、配置,该目标板的主要硬件资源如图6所示。和ARM体系结构相关的代码都放在arch/arm/以及include/asm-arm/目录下,将linux移植到ARM平台上,主要修改这两个目录下的代码。要想使linux内核应用于自己的ARM平台AT91RM9200上,必须对内核的源代码做一定的修改,主要修改部分如下:(1) 修改根目录下的Makefile文件,确认ARCH和CROSS_COMPILE的定义:ARCH :=arm; CROSS_COMPILE :=arm-linux- (2)修改arch目录下的Makefile文件,根据自己的电路设置TEXTADDR变量,TEXTADDR决定内核起始运行地址,即 image.ram应下载的地址。(3)修改arch目录下的config.in 文件,添加CONFIG_ARCH_AT91RM9200自选项,config文件决定了menuconfig菜单的内容,把使用的平台加在需要的地方,这样在配置linux内核时就能够选择是否支你的平台了。

(4)修改arch/arm/boot目录下的Makefile文件,根据自己的电路设置ZTEXTADDR和ZRELADDR, ZTEXTADDR和ZRELADDR分别是自解压代码的起始地址和内核解压后代码输出起始地址。(5)修改arch/arm/boot /compressed目录下的Makefile文件,加入head-at91rm9200.S (6)修改arch/arm/kernel目录下的Makefile文件,增加AT91RM9200的支持,同时在 debug-armv.S中加入关闭全部外围设备,保证系统正常运行的代码,在entry-armv.S中加入关于CPU中断处理部分的代码。(7)修改 arch/arm目录下的mm-armv.c文件,将init_maps-》bufferable=0改为init_maps-》 bufferable=1;

当然,一些大的芯片开发商在发行芯片的同时,针对自己芯片的体系结构对linux内核作了一些补丁。实验中使用的是针对AT91RM9200体系结构的补丁patch-2.4.19-rmk7给标准内核源代码打上补丁后,该内核就可应用于AT91RM9200了,这样可以大大减少开发的工作量。

移植之后要做的工作就是编译内核,要想编译适合自己工程中需要的内核,首先要对内核进行配置,常用的配置命令有:make config;make oldconfig;make menuconfig;make xconfig;make defconfig;Linux内核包允许用户对其各类功能逐项配置,在配置时, 大部分选项可以使用其缺省值, 只有小部分需要根据用户不同需要选择。选择的原则是将与内核其它部分关系较远部分且不经常使用的部分功能代码编译成为可加载模块, 有利于减小内核的长度, 减小内核消耗的内存,不需要的功能就不要选, 与内核紧密且经常使用的部分功能代码直接编译到内核中。主要是进行以下几项配置: (1)选择处理器类型;(2)选择板级支持;(3)选择对RAMDISK支持、对设备驱动的支持以及对文件系统的支持。在配置工作完成后, 就可以进行内核编译。

编译内核有压缩方式和非压缩两种方式。非压缩方式使用make vmlinux来编译内核,或者直接运行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 文件系统的移植

linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。linux要启动起来还需要有根文件系统。根文件系统的作用是存放各种工具(如Linux命令)、应用程序、必需的链接库等等。通常用busybox来制作根文件系统,在busybox中包含一百多种Linux上标准的工具程序, 而这些工具程序仅需几百k空间。busybox使用非常方便, 只要建立一个符号连接即可, 用户可以通过配置Config.h 和Makefile文件来定制busybox。将busybox复制到bin目录中,分别使用ln-s 建立每一个命令的符号连接。但应该注意的是busybox需要glibc支持(如果使用静态连接则不需要glibc 库文件),因此还需要将运行busybox所需的库文件copy到lib目录中, 并建立符号连接。到此为止, ARM Linux 的根文件系统就已经建立起来了。

ARM Linux采用RAMDISK的方式来装载根文件系统,所以在运行内核之前,需要先制作RAMDISK,将必须的文件和设备加人到RAMDISK中。内核启动后,会从指定地址去读取根文件系统,这里我们使用RAMDISK在内存中虚拟一个磁盘,具体方法如下:

(1)首先创建一个2048k的虚拟磁盘,文件名为initrd.img:# dd if= dev/zero of=initrd.img bs= lk count= 2048 (2)将该虚拟磁盘文件格式化成Ext2格式:# mkfs ext2 -c initrd.img这就生成了一个支持Ext2文件系统的ramdisk (3)mount这个文件系统到/tmp下,# mount -o loop -t ext2 initrd.img /tmp (4)向/tmp中添加linux启动必须的文件和设备。 # cd /tmp; # mkdir bin dev etc lib mnt proc sbin sys usr 以上这几个程序和设备是启动Linux必须的,这样得到的ramdisk大约400k (5)创建设备节点,添加相应的程序,将已经订制好的一个文件系统全部复制过来。# cp –a myfs/* /tmp (6)压缩映像,把loop设备卸载下来,然后用gzip命令把映像压缩一下。# umount /tmp ; #gzip –best –c initrd.img 》 initrd.img.gz现在我们就得到了一个压缩的RAMDISK映像initrd.img.gz制作好了。

Linux向目标系统AT91RM9200的移植方法与应用优势分析

4. 内核的下载和执行

要想使目标板的Linux系统脱离交叉开发环境,直接在目标机上本地启动运行,必须通过U-boot将U-boot映像,内核映像和RAMDISK 映像烧写到FLASH中,因为使用U-boot引导程序需要使用U-boot格式的内核映像和RAMDISK映像,可以通过以下命令来实现:

($U-BOOT-PATH)/tools /mkimage -A arm -O linux -T kernel -C gzip –a 0x20008000 -e 0x20008000 –n “linux-2.4.19”-d linux.bin.gz uImage

($U-BOOT-PATH)/tools/mkimage-A arm -O linux -T ramdisk -C gzip –a 0x21100000 -e 0x21100000 –n “RAMDISK”-d ramdisk.bin ramdisk

通过U-boot将uImage和ramdisk烧写到flash相应的分区中去,烧写到flash相应分区的地址如图7所示:烧写完毕后设置u- boot的环境变量,让系统自动启动,系统复位后,Linux系统就可以完全自动从本地flash启动了,启动后,进行地址映射,u-boot会把u- boot压缩映像,kernel压缩映像,ramdisk压缩映像全部拷贝到SDRAM的相应地址,SDRAM的映射地址如图8所示,这时Linux系统完全在SDRAM中运行了,Linux系统真正启动起来了。

5. 总结

本文根据一个特定的目标平台,结合AT91RM9200的开发经验,详细介绍了将Linux移植到ARM构建的嵌入式系统上的主要技术和整个流程,实现了Linux 向目标系统AT91RM9200的移植,移植后的操作系统在目标板上运行稳定,并且可以根据实际需要编写相应的控制程序,将其应用于实际工业控制中。掌握这些技术,对于开发嵌入式系统十分重要,对开发其他类型的嵌入式系统同样具有参考意义。

本论文作者创新点:从软件与硬件的相互关系, 硬件对软件的制约、硬件对软件的支持这个角度对裁减和移植进行了分析,同时在Bootloader(启动代码)的移植,Kernel(内核)的裁减和移植过程中,把代码分成了两部分,一部分是和硬件相关的部分,一部分是和硬件无关的部分,这样做不仅思路清晰,而且可以大大减少工作量。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8648

    浏览量

    361756
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288362
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
收藏 人收藏

    评论

    相关推荐

    TCP/IP协议在AT91RM9200上的实现

    TCP/IP协议在AT91RM9200上的实现 摘要:介绍了AT91RM9200[1]芯片与DM9161E[2]的硬件接口电路设计以及驱动程序开发。在此基础上讨论了TCP/IP[3]
    发表于 12-08 10:43 1288次阅读

    U-Boot在AT91RM9200上的移植及启动分析

    基于AT91RM9200的嵌入式目标板和U-Boot1.1.2源码资源,分析了U-Boot的启动过程,介绍了U-Boot的移植方法和具体操作
    发表于 03-16 11:00

    at91rm9200定时器

    请问at91rm9200linux驱动程序如何访问定时器/计数器模块相关的寄存器?如访问PIO使能寄存器,驱动语句为:AT91_SYS->PIOA_PER |= 1;那访问定时器0的TC通道模式寄存器TC_CMR驱动语句该是怎
    发表于 11-13 09:51

    S1D13506显示控制器与AT91RM9200的接口设计

    设计,在此基础上详细阐述了μC/GUI移植AT91RM9200的过程,并给出一个应用实例。1 S1D13506和AT91只M9200介绍AT9lRM
    发表于 12-21 08:37

    μCGUI移植AT91RM9200的过程及接口设计

    介绍了AT91RM9200处理器和S1D13506显示控制器的接口设计,在此基础上详细阐述了μC/GUI移植AT91RM9200的过程,并给出一个应用实例。1 S1D13506和AT91
    发表于 05-31 05:00

    怎么实现OLED显示模块与AT91RM9200的接口设计?

    本文介绍了OLED显示模块P13501与AT91RM9200的接口电路设计,以及在嵌入式Linux下OLED驱动程序的编写、编译和加载。
    发表于 06-08 06:05

    MiniGUI在AT91RM9200开发板上的移植

    MiniGUI在AT91RM9200开发板上的移植
    发表于 03-28 09:52 18次下载

    MiniGUI 在AT91RM9200 开发板上的移植

    简要介绍Atmel 公司生产的基于ARM9 内核的AT91RM9200 开发板的结构及其部分特性;详细介绍如何将MiniGUI 图形用户界面移植AT91RM9200 开发板上的全过程。
    发表于 05-16 14:16 26次下载

    AT91RM9200简明手册.pdf

    AT91RM9200简明手册.pdf 基于ARM920T的嵌入式微控制器——AT91RM9200总体特性:· 内嵌ARM920TTM ARM® Thumb®微处理器- 180MHz/200MIPS- 16KB数据Cache、16KB指令
    发表于 03-01 15:47 43次下载

    at91rm9200启动过程教程

    at91rm9200启动过程教程 系统上电,检测BMS,选择系统的启动方式,如果BMS为高电平,则系统从片内ROM启动。AT91RM9200
    发表于 03-08 15:57 44次下载

    U-boot在AT91RM9200上的全线移植分析

    U-boot在AT91RM9200上的全线移植分析 摘要】本节介绍了bootloader的基本概念。首先分析了为什么要针对特定的CPU和开发板移植
    发表于 03-13 14:29 54次下载

    基于AT91RM9200的手持设备的低功耗设计

    本文以基于AT91RM9200 的手持设备为例,分析了手持设备的低功耗设计的原理,同时给出了AT91RM9200 手持设备上基于Linux 操作系统
    发表于 12-16 14:42 66次下载
    基于<b class='flag-5'>AT91RM9200</b>的手持设备的低功耗设计

    AT91RM9200用户手册

    AT91RM9200用户手册有需要的朋友下来看看
    发表于 01-11 14:05 7次下载

    AT91RM9200 说明书

    AT91RM9200 说明书
    发表于 09-29 11:36 7次下载
    <b class='flag-5'>AT91RM9200</b> 说明书

    AT91RM9200的手持设备的低功耗设计

    AT91RM9200的手持设备的低功耗设计
    发表于 10-15 10:42 12次下载
    <b class='flag-5'>AT91RM9200</b>的手持设备的低功耗设计