基于AT91RM9200的U-Boot启动分析和移植
时间:2025-03-10
时间:2025-03-10
本文采用U-Boot构建嵌入式系统的引导加载程序,在对U-Boot的启动工作机理进行了简略分析后,针对基于AT91RM9200的目标板对U-Boot作了具体的修改和移植。应用结果表明,移植后的U-Boot在目标板上运行良好,可成功引导Linux内核。
基于AT91RM9200的U-Boot启动分析和移植
周庆松,史小军
东南大学电子科学与工程学院,南京 (210096)
E-mail:摘 要:本文采用U-Boot构建嵌入式系统的引导加载程序,在对U-Boot的启动工作机理进
行了简略分析后,针对基于AT91RM9200的目标板对U-Boot作了具体的修改和移植。应用结
果表明,移植后的U-Boot在目标板上运行良好,可成功引导Linux内核。
关键词:U-Boot;移植;内核;AT91RM9200;嵌入式系统
1.引言
Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启
动到操作系统启动的过渡[1]。一般,Bootloader基于特定硬件平台实现,不但依赖于CPU的体
系结构,而且依赖于嵌入式系统板级设备的配置,因此需要修改源码来适合具体的嵌入式板
级设备。
本文基于AT91RM9200的嵌入式目标板和U-Boot源码资源,分析了U-Boot的启动过程,介
绍了U-Boot的移植方法和具体操作,最后讲述如何引导内核启动。
2.U-Boot简介
U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。他支持PowerPC、
ARM、X86、MIPS等体系结构的上百种开发板;并且支持多种嵌入式操作系统内核,如Linux、
NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;具有较高的可靠性和稳定性,已经成为功
能最多、灵活性最强并且开发最积极的开放源码Bootloader。作为通用的BootLoader,U-Boot
可以方便的移植到其他硬件平台上[2]。
U-Boot移植一般都是针对嵌入式目标板的硬件资源,主要是CPU、FLASH 和SDRAM等情
况,以尽可能一致的原则,在U-Boot源码中,找到一个与目标板为同一个或同一系列处理器
的目标板模板,在此基础上再针对具体开发板对程序作相应的修改,比如不同型号存储芯片
的初始化等。这里笔者选用U-Boot 1.1.2版本,该版本支持基于at91rm9200的处理器配置,并
提供了一个目标板模板,即U-Boot源码下的board/at91rm9200dk模板。
3.U-Boot启动分析
在具体移植之前,先来了解一下U-Boot启动过程。U-Boot启动过程可以分成3个阶段[3]。
(1) 在Flash中运行汇编程序,进行基本硬件初始化,并将Flash中的启动代码复制到SDRAM中,
同时创造环境准备运行C程序;
汇编程序start.s是U-Boot启动后执行的第一个程序,它位于cpu/at91rm9200中,链接脚本
board/at91rm920dk/u-boot.lds决定U-Boot的入口函数位于该程序中。上电后,处理器首先执行
该程序,具体工作流程如图1所示。
(2) 跳转到SDRAM中执行,对硬件进行初始化,并向显示终端输出启动信息;
start_armboot是U-Boot执行的第一个C语言函数,它位于lib_arm/board.c中,主要完成
系统初始化工作,进入主循环,处理用户输入的命令。 具体工作流程如图2所示。
全局变量结构体gd主要用来保存开发板信息、终端存在标志位、环境变量结构体起始地
本文采用U-Boot构建嵌入式系统的引导加载程序,在对U-Boot的启动工作机理进行了简略分析后,针对基于AT91RM9200的目标板对U-Boot作了具体的修改和移植。应用结果表明,移植后的U-Boot在目标板上运行良好,可成功引导Linux内核。
址、环境变量校验标志位、frame buffer 基地址等。它是指向gd_t结构体的指针,gd_t结构体
定义在include\asm-asm\global_data.h中。
硬件初始化中执行函数及各函数作用如下所示:
board_init:基本的板级相关配置,主要包括:设置处理器类型和启动参数地址;
interrupt_init:中断处理初始化,主要对TC控制器作相应设置。
env_init:设置环境变量,初始化环境;
init_baudrate:指定串口的波特率;
serial_init:串口初始化设置;选择通讯端口,设置串口波特率和工作方式;
console_init_f:设置gd->have_console=1,表示可以使用串口通讯控制台;
display_banner:在控制台输出 U-Boot信息;
dram_init:设置SDRAM的起始地址和大小;
display_dram_config:在控制台输出 SDRAM信息;
flash_init:设置FLASH芯片ID号、每个扇区起始地址等信息,将信息送到相应的结构
体中;对FLASH中U-BOOT和环境变量存储扇区做软件写保护;
display_flash_config (size):在上位机终端输出FLASH大小。
图1 start.s函数执行流程 图2 start_armboot函数执行流程
(3) 将内核映像和根文件系统映像从flash拷贝到SDRAM中,为内核设置启动参数,进入内
核的入口函数。
U-Boot作为Bootloader,具备多种引导内核启动的方式。常用bootm命令引导内核映像
启动。使用bootm命令时,需要首先使用U-Boot自带的mkimage命令,将内核映像文件转换
成U-Boot格式映像。即在内核的前头加上64byte的信息帧头,供建立tag之用。
本文采用U-Boot构建嵌入式系统的引导加载程序,在对U-Boot的启动工作机理进行了简略分析后,针对基于AT91RM9200的目标板对U-Boot作了具体的修改和移植。应用结果表明,移植后的U-Boot在目标板上运行良好,可成功引导Linux内核。
bootm命令调用 …… 此处隐藏:6875字,全部文档内容请下载后查看。喜欢就下载吧 ……