构建基于ARM920T的嵌入式Linux系统
引言
目前,嵌入式操作系统的种类很多,如VxWorks,Windows CE和Linux等。在这些操作系统中,Linux是发展最快,应用最广泛的。由于使用费用、开放源代码程度和使用习惯等各方面因素,Linux是得到较多推广的操作系统之一。由于Linux支持从x86到嵌入式处理器的多种处理器,使得Linux桌面PC上开发的很多资源可以轻松的移植到各种嵌入式平台上,这种便利使得在嵌入式系统中使用Linux操作系统具有很大吸引力。
开发环境
硬件环境
本系统中使用目标平台S3C2410(SAM SUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器)。ARM920T核由ARM9TDMI,存储管理单元(MMU)和高速缓存三部分组成。
S3C2410的资源还包括外围存储设备(SDRAM和NandFlash),外围显示设备(触摸屏和LCD)与外围接口设备(串口、网口与并口)。
软件平台
嵌入式Linux系统从软件系统的角度通常可以分为以下4个部分。
·引导加载程序。包括固化在固件中的启动代码(可选)和Bootloader。
·内核。特定于嵌入式板子的定制内核以及控制内核引导系统的参数。
·文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好的运行环境的载体。
·用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会有一个嵌入式图形用户界面。同时装有Bootloader、内核启动参数、内核映象和根文件系统。
嵌入式Linux系统移植的实现
引导加载程序
Boot Loader 是在操作系统内核运行之前运行的一段小程序。大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。Stage1主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。这个阶段的任务有:(1)为基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据cache等),(2)为第二阶段准备RAM空间(如果是从某个固态存储媒质中,则复制Bootloader的第二阶段的代码到RAM),(3)设置堆栈并跳转到第二阶段的C程序入口点。Stage2通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的任务有:(1)初始化本阶段要使用到的硬件设备,检测系统内存映射。(2)将内核映像和根文件系统映像从Flash读到RAM。(3)为内核设置启动参数,调用内核。
本系统中采用的BootLoader是韩国Mizi公司开发的vivi,适用于ARM9处理器。在配置编译之前,首先要建立交叉编译环境。把cross-2.95.3.tar.bz2、arm-linux-gcc-3.4.1.tar.bz2软件包拷贝到/usr/local/arm目录下,分别解压这两个包以构成本系统的交叉编译环境。
编译Bootload vivi 主要步骤如下:
[1]解压vivi源文件 tar jxvf vivi.tar.bz2
[2]进入vivi目录 编译 makefile ,主要修改如下:
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
[3]编译vivi/arch/s3c2410/smdk.c,根据实际板子的实际情况对NandFlash进行分区。需要注意的是要和下面Linux内核配置编译配合起来。本开发板提供的64M的NandFlash做为存储设备,其空间分配表如表1所示。
[4] make menuconfig
[5] make
至此,可以生成vivi的bin文件,通过开发板JTAG口和PC机并口建立连接,把vivi移植 到开发板上,重新加电,这样就可以引导内核。
Linux内核的移植
Linux的内核版本发行同Linux对嵌入式处理器支持程度的发展是不同步的。因此,需要对特定的处理器体系结构选择合适的核。本系统采用的是linux-2.6.14.1.tar.bz2的版本,与2.4的版本相比,2.6版本对资源的定义进行了分类,代码相当精练,可读性很好,条理清晰,修改起来容易。
而且支持标准的高级电源管理apm。事实上,Samsung S3C2410已经成为linux的一个标准支持平台。
编译配置内核主要步骤如下:
[1]进入内核源代码目录,修改Flash分区表部分的源码,与vivi对NandFlash的分区相匹配。即定义文件arch/arm/mach-s3c2410/devs.c中的分区表结构体static struct mtd_partition partition_info[]中的分区名,偏移量和分区大小。同时加入NandFlash分区,即定义结构体struct s3c2410-nand-set nandset[]。与此同时,修改结构体struct s3c2410-platform-nandsupperlpplatform[]以建立对Nand Flash芯片的支持。
最后,加入Nand Flash芯片支持到Nand Flash驱动。
[2]对内核进行适当的配置。在本系统中,配置过程的关键在于是:在对MTD配置时,选择支持MTD驱动以及支持NAND
- 嵌入式系统的定义与发展历史(11-15)
- 嵌入式系统亲密接触(11-22)
- 嵌入式系统设计中的USB OTG方案(02-01)
- 一个典型的嵌入式系统设计和实现 (02-02)
- DDR SDRAM在嵌入式系统中的应用(02-07)
- 嵌入式实时系统开发的正确选择 (02-13)