下面为启动的流程,有两个阶段(从网上找的,很不错)
1.Stage1:cpu/arm920t/start.S
这个汇编程序是 U-Boot 的入口程序,开头就是复位向量的代码。
_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 //中断向量
…
.balignl 16,0xdeadbeef
_TEXT_BASE:
.word TEXT_BASE;这个值在/board/smdk2410/config.mk 中定义在这里
0x33F80000
.globl _armboot_start
_armboot_start:
.word _start ;代码段的起始地址也是 TEXT_BASH
.globl _bss_start
_bss_start:;由链接程序 ld 根据链接脚本确定(board/smdk2410/u-boot.lds)
.word __bss_start
.globl _bss_end
_bss_end: 由链接程序 ld 根据链接脚本确定(board/smdk2410/u-boot.lds)
.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: //复位启动子程序
mrs r0,cpsr;/* 设置 CPU 为 SVC32 模式 */
bic r0,r0,#0x1f ;;位清除,将某些位的值置 0:r0 = r0 AND
( !0x1f)
orr r0,r0,#0xd3 ;;逻辑或,将 r0 与立即数进行逻辑或,放在 r0
中
msr cpsr,r0
/* 关闭看门狗 */
#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 频率 */
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 中启动不执行
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit ;;跳转去初始化 CPU
;#endif
/* CPU 和 RAM 两个关键的初始化子程序 */
/* 初始化 CPU */
cpu_init_crit:
/*
* flush v4 I/D caches 设置 CP15
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 ;使 I/D cache 失效:将寄存器 r0 的