U-boot引导加载程序(Bootloader)源代码分析与移植

U-boot引导加载程序(Bootloader)源代码分析与

移植

目录

第一章绪论 (3)

1.1 U-boot 简介 (3)

1.2 U-boot 源码树 (4)

1.3 U-boot 支持的主要功能 (5)

第二章U-boot源代码详细分析 (6)

2.1 U-boot的启动流程 (6)

2.1.1 第一阶段(Stage 1) (6)

2.1.2 第二阶段(Stage 2) (9)

2.2 U-boot 的初始化 (13)

2.2.1 私有数据global_data (13)

2.2.2 初始化序列init_sequence (14)

2.2.3 NAND Flash 初始化 (20)

2.2.4 DataFlash 初始化 (22)

2.2.5 环境变量重定位 (23)

2.2.6 初始化设备 (25)

2.2.7 控制台初始化 (27)

2.2.8 单板后期初始化 (30)

2.3命令处理 (33)

2.3.1 命令数据结构 (33)

2.3.2 命令查找 (35)

2.3.3 主循环 (35)

2.4 Linux 的引导 (42)

2.4.1 映象格式 (42)

2.4.2 linux 引导 (42)

2.4.3 linux 的内核参数传递 (52)

第三章U-boot 在S3C2410 上的移植分析 (58)

3. 1 对ARM-920T内核的支持 (58)

3. 2 配置自己的开发板 (58)

3. 3 实现网卡的驱动程序 (60)

3.4 从NAND Flash启动 (61)

3.4.1 修改cpu/arm920t/start.s 添加NAND Flash启动跳转代码 (61)

3.4.2 添加从NAND Flash启动代码 (63)

3.4.3 添加上述代码中引用的宏定义 (65)

3. 5 修改Makefile 文件 (65)

3.6 搭建编译环境 (66)

3. 7 生成目标文件并进行测试 (67)

3. 8 测试 (69)

第一章绪论

1.1 U-boot 简介

U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, Fre eBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC 系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Bo ot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER 移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

U-Boot的优点:

①开放源码;

②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;

③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;

④较高的可靠性和稳定性;

⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;

⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;

⑦较为丰富的开发调试文档与强大的网络技术支持;

1.2 U-boot 源码树

从根目录树中可以看出,U-boot 源代码主要包含以下几个部分

?board 目标板相关文件,主要包含SDRAM、FLASH驱动;

?common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

?cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;

?driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)

?doc U-Boot的说明文档;

?examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;

?include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;

?lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;

?net 与网络功能相关的文件目录,如bootp,nfs,tftp;

?post 上电自检文件目录。尚有待于进一步完善;

?rtc RTC驱动程序;

?tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

U-boot的这些目录结构可以大致的划分成如下层次:

1.3 U-boot 支持的主要功能

U-Boot可支持的主要功能列表

?系统引导支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统

?支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;

?基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤Linux支持最为强劲;

?支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;

?CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好;

?设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;

?上电自检功能SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;

?特殊功能XIP内核引导;

第二章U-boot源代码详细分析

2.1 U-boot的启动流程

U-boot 的启动流程包括两个阶段,第一阶段进行一些基本的初始化动作,为启动第二阶段的主体做准备,此阶段代码由汇编代码写成。第二阶段是进行系统的初始化工作,并准备引导操作系统。下面我们对这两个阶段进行详细的分析。

2.1.1 第一阶段(Stage 1)

第一阶段的启动代码在cpu\\start.s 中,完成的工作主要有:

●CPU 自身初始化:包括MMU,Cache,时钟系统,SDRAM 控制器等的初始化

●重定位:把自己从非易失性存储器搬移到RAM 中

●分配堆栈空间,设置堆栈指针

●清零BSS 数据段

●跳转到第二阶段入口函数start_armboot()

AT91SAM9260EK 的启动代码在cpu\arm926ejs\start.s 中,精简后的代码如下:

[cpu\arm926ejs\start.s]

; ARM 的向量表

.globl _start

_start:

b reset

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

_undefined_instruction:

.word undefined_instruction

_software_interrupt:

.word software_interrupt

_prefetch_abort:

.word prefetch_abort

_data_abort:

.word data_abort

_not_used:

.word not_used

_irq:

.word irq

_fiq:

.word fiq

;全局符号定义

_TEXT_BASE:

.word TEXT_BASE

.globl _armboot_start

_armboot_start:

.word _start

/*

* These are defined in the board-specific linker script.

*/

.globl _bss_start

_bss_start:

.word __bss_start

.globl _bss_end

_bss_end:

.word _end

#ifdef CONFIG_USE_IRQ

/* IRQ stack memory (calculated at run-time) */

.globl IRQ_STACK_START

IRQ_STACK_START:

.word 0x0badc0de

/* IRQ stack memory (calculated at run-time) */

.globl FIQ_STACK_START

FIQ_STACK_START:

.word 0x0badc0de

#endif

;复位入口

reset:

; CPU 设为SVC32 模式

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0

;如果需要,调用cpu_init_crit 进行CPU 关键初始化

;在AT91SAM9260EK 板上没有使用。这部分工作在Bootstrap 中完成。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

;如果需要,对U-boot 进行重定位(从Flash 搬移到SDRAM 中)

;在AT91SAM9260EK板上没有使用。U-boot 在运行之前已经被Bootstrap加载到了SDRAM 中。

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate: /* relocate U-Boot to RAM */

adr r0, _start /* r0 <- current position of code */

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */

cmp r0, r1 /* don't reloc during debug */

相关文档
最新文档