基于AT91RM9200的U-Boot启动分析和移植

时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于AT91RM9200的U-Boot启动分析和移植.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219