0 引 言
arm嵌入式处理器已被广泛应用于消费电子产品、无线通信、网络通信和工业控制等领域。其中,arm9的芯片更是以其低价格、低功耗、高性能在手持设备中占据着重要市场。在嵌入式操作系统中,linux,vxworks,wince三足鼎立,其中linux由于其开源性、稳定性、安全性、可裁减性更是一支独放。在嵌入式系统中,如何实现在arm9平台下linux操作系统的引导工作是嵌入式技术开发的重要环节。
1 嵌入式系统的软件组成
1.1 系统的软件组成
嵌入式的软件系统主要由bootloader、操作系统、文件系统、应用程序等组成。其中,bootloader是介于硬件和操作系统之间的一层,其作用就好像pc机中的bios。系统加电运行后,由系统自动加载。通过这段程序,可以初始化硬件设备,建立内存空间的映射图,从而将系统的硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好环境。对于一个嵌入式系统,通常bootloader是依赖于硬件而实现的。对于不同类型的嵌入式芯片、不同的操作系统和外围接口都需要重新移植、修改和编译bootloader。
1.2 u-boot分析
嵌入式linux系统中常用的bootloader引导程序有u-boot,redboot,blob和vivi等,其中u-boot遵循gpl条款的开放源码项目,功能最为强大;u-boot对powerpc系列处理器支持最丰富,同时还支持mips,x86,arm,nios,xscale等诸多常用系列的处理器;u-boot引导程序分为stage 1和stage 2两大部分,stage 1中主要包括设备初始化、中断设置、时钟设置和存储器初始化等工作,并且采用汇编语言实现,而一些通用功能大多采用c语言实现,放在stage 2中。
2 u-boot的启动分析
stage 1的代码在cpu/arm920t/start.s中定义,它包括从系统上电后在0x00000000地址开始执行的部分。这部分代码系统启动后,从nand flash自动加载到sdram中,它包括对s3c2410a中寄存器的初始化和将u-boot的stage 2代码从flash拷贝到sdram。stage 2的起始地址是在stage1代码中指定的。被复制到sdram后,就从第一阶段跳到这个入口地址,开始执行剩余部分代码。第二阶段主要是对内存的分配,对nand flash以及对外围设备的初始化,其代码在lib-arm/board.c中。启动的流程分析如图1所示。
(1)跳转到c语言程序之后,首先定义初始化函数表,程序在lib-arm/board.e中,如下所示:
(2)初始化flash设备和显示flash设备信息;
(3)初始化系统内存分配函数;
(4)如果目标系统拥有nand设备,则初始化nand设备;
(5)初始化显示设备;
(6)初始化网络设备,填写ip地址、mac地址等信息;
(7)开启中断处理;
(8)进入命令循环,接收用户从串口的命令输入。
3 u-boot的移植方法
本文选用交叉编译环境arm-linux-gcc-2.95.3,选用u-boot-1.1.4版本作为移植平台。为了使u-boot支持新的开发板,一种简便的做法是在u-boot已经支持的开发板中选择一种与目标板接近的,在其基础上进行修改。这里选用的是smdk2410的配置。
3.1 修改cpu/arm920t/start.s文件
start.s是采用汇编语言编写的u-boot程序入口代码,完成对底层硬件的初始化,其中有一个很重要的功能是从nand flash中把stage 2阶段的代码复制到sdram中。在此阶段,涉及到对nandflash的读操作,在u-boot中,没有对nandflash读操作的驱动,采用以下方法实现:
通过调用board/smdk2410/nand_read.c中的nand_read_11函数将stage 2阶段的代码复制到ram中。
3.2 修改board/smdk2410目录下文件
(1)增加对nandflash的读驱动nand_read.c
(2)在smdk2410.c文件中添加对nandflash初始化的程序
在此主要是对主板的gpio的一些设置,并加上对nandflash初始化程序。
(3)在该目录下的makefile文件中添加nand_read.c文件的编译
objs:=smdk24 10.o flash.o nand_read.o
3.3 在include文件中设置nand flash硬件参数
在/linux/mtd/nand_ids.h中设置参数:
3.4 编译与运行
配置好以后,进入u-boot主目录,重新编译u-boot代码,运行命令:
(1)查看交叉编译器的版本号
arm-linux-gcc-v
(2)清除生成的连接
make distclean
(3)编译make smdk2410_config
(4)make cross-compile=arm-linux-编译成功后,将生成三个文件:
u-boot:elf格式的文件,可以被大多数debug程序识别。
u-boot.bin:二进制bin文件,纯碎的u-boot二进制执行代码,不保存elf格式和调试信息。这个文件用于烧到用户的开发板中。
u-boot.srec:motorola s-record格式,可以通过串口下载到开发板中。
将得到的u-boot.bin文件借助于flash芯片烧写工具,通过jtag口下载到目标板后,检查u-boot能否正常工作。如果能从串口输出正确的启动信息,就表明移植基本成功。
4 结 语
目前笔者移植的u-boot已经能稳定地运行在开发板上。u-boot引导程序是嵌入式linux系统软件开发中的一个重要环节。在此通过分析u-boot的代码结构和启动过程,并针对开发板系统的硬件资源,通过分析与调试,实现了u-boot的移植,并且能够引导嵌入式linux内核和文件系统,为今后进一步开发奠定了坚实的基础。
AI引发指数级变革 推动企业业务创新
PCB设计中的屏蔽罩设计
不打算成为终身学习者的程序员,可能失业就在明天
5G工业路由器在地震监控通信解决方案中的应用
虚拟存储器的工作原理 应用程序如何使用和管理虚拟存储器
深度解读S3C2410A的嵌入式系统的U-Boot移植
北京超级云计算中心明年建成投用
报道称iPhone 13即将在富士康深圳厂区打样第一阶段
变配电所巡视检查类型_变配电所巡视期限规定
到底什么是“通感一体化”?
未来的汽车行业 高精定位是实现自动驾驶的入场券
锂离子动力电池制作之合浆
移柯通信针对水务行业网联需求推出多种符合行业需求的通信模组
VR技术是如何影响我们生活的
马斯克再放狂言:化石燃料必定会消失殆尽,未来传统车企将不复存在
判断电动机采用何种方法启动的方法
存储技术为3G而改变
Ramtron推出V系列串口F-RAM器件FM24V01-G
博世将在德国裁员最多 1500 人,称“面临的挑战比预期要大得多”
机器视觉技术在精密轴承检测中的应用