u-boot启动流程分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

先看board/smsk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm",

"elf32-littlearm")

/*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")*/ OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

.= 0x00000000; /*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/

.=ALIGN(4);

.text :

{

cpu/arm920t/start.o (.text)

*(.text)

}

.=ALIGN(4);

.rodata : { *(.rodata) }

.=ALIGN(4);

第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序中。下面详细分析一下程序跳转和函数的调用关系以及函数实现。

1.Stage1:cpu/arm920t/start.S

这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。

U-Boot启动代码流程图

/* the actual reset code */

reset: //复位启动子程序

/*设置CPU为SVC32模式*/

mrs r0,cpsr

bic r0,r0,#0x1f ;;位清除,将某些位的值置0:r0 = r0 AND(!0x1f) orr r0,r0,#0xd3 ;;逻辑或,将r0与立即数进行逻辑或,放在r0中(第一个)

msr cpsr,r0

/*关闭看门狗*/

/* turn off the watchdog */

#if defined(CONFIG_S3C2400)

# define pWTCON 0x15300000

# define INTMSK 0x14400008 /* Interupt-Controller base addresses */

# define CLKDIVN 0x14800014 /* clock divisor register */

#elif defined(CONFIG_S3C2410)

# define pWTCON 0x53000000

# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */

# define INTSUBMSK 0x4A00001C

# define CLKDIVN 0x4C000014 /* clock divisor register */

#endif

#if defined(CONFIG_S3C2400)|| defined(CONFIG_S3C2410)

ldr r0,=pWTCON

mov r1, #0x0

str r1,[r0]

/*禁止所有中断和设置CPU频率*/

/*

*mask all IRQs by setting all bits in the INTMR - default

*/

mov r1, #0xffffffff

ldr r0,=INTMSK

str r1,[r0]

# if defined(CONFIG_S3C2410)

ldr r1,=0x3ff

ldr r0,=INTSUBMSK

str r1,[r0]

# endif

/* FCLK:HCLK:PCLK = 1:2:4 */;;FCLK用于CPU,HCLK用于AHB,PCLK用于APB

/* default FCLK is 120 MHz !*/

ldr r0,=CLKDIVN ;;根据硬件手册来设置CLKDIVN寄存器

mov r1, #3 ;;用户手册的推荐值

str r1,[r0]

#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */

/*这些初始化代码在系统重起的时候执行,运行时热复位从RAM中启动不执行*/

/*

* we do sys-critical inits only at reboot,

*not when booting from

*/

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit ;;跳转去初始化CPU

#endif

;;#ifdef CONFIG_INIT_CRITICAL 原文中的,估计是1.1.16版本的;;bl cpu_init_crit

;;#endif

/* CPU和RAM两个关键的初始化子程序*/

/*初始化CPU */

cpu_init_crit:

/*

* flush v4 I/D caches 设置CP15

*/

mov r0, #0

mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */;;使I/D cache失效:将寄存器r0的数据传送到协处理器p15的c7中。C7寄存器位对应cp15中的cache控制寄存器

相关文档
最新文档