在U-Boot工程中,每种处理器目录下都有一个start.S文件,该文件中有一个_start标号,是整个U-Boot代码的入口点。以ARM 9处理器为例,代码如下:
32 /*
33 ********************************************************************
34 *
35 * Jump vector table as in table 3.1 in [1]
36 *
37 *******************************************************************
38 */
39
40
41 .globl _start
42 _start: b reset // 复位向量:无条件跳转到reset标号
43 ldr pc, _undefined_instruction // 未定义指令向量
44 ldr pc, _software_interrupt // 软件中断向量
45 ldr pc, _prefetch_abort // 预取指令异常向量
46 ldr pc, _data_abort // 数据操作异常向量
47 ldr pc, _not_used // 未使用
48 ldr pc, _irq // 慢速中断向量
49 ldr pc, _fiq // 快速中断向量
50
51 _undefined_instruction: .word undefined_instruction
// 定义中断向量表入口地址
52 _software_interrupt: .word software_interrupt
53 _prefetch_abort: .word prefetch_abort
54 _data_abort: .word data_abort
55 _not_used: .word not_used
56 _irq: .word irq
57 _fiq: .word fiq
58
59 .balignl 16,0xdeadbeef
60
61
62 /*
63 *******************************************************************
64 *
65 * Startup Code (reset vector)
66 *
67 * do important init only if we don't start from memory!
68 * relocate armboot to ram
69 * setup stack
70 * jump to second stage
71 *
72 *******************************************************************
73 */
74
75 _TEXT_BASE:
76 .word TEXT_BASE // 定义整个U-Boot镜像文件在内存加载的地址
77
78 .globl _armboot_start
79 _armboot_start:
80 .word _start
81
82 /*
83 * These are defined in the board-specific linker script.
84 */
85 .globl _bss_start // 定义代码段起始
86 _bss_start:
87 .word __bss_start
88
89 .globl _bss_end // 定义代码段结束地址
90 _bss_end:
91 .word _end
92
93 #ifdef CONFIG_USE_IRQ
94 /* IRQ stack memory (calculated at run-time) */
95 .globl IRQ_STACK_START // 定义IRQ的堆栈地址
96 IRQ_STACK_START:
97 .word 0x0badc0de
98
99 /* IRQ stack memory (calculated at run-time) */
100 .globl FIQ_STACK_START // 定义FIQ的堆栈地址
101 FIQ_STACK_START:
102 .word 0x0badc0de
103 #endif
_start标号下面的代码主要是一些伪指令,设置全局变量,供启动程序把U-Boot映像从Flash存储器复制到内存中。其中比较重要的变量是TEXT_BASE,该变量是通过连接脚本得到的,在本例中,TEXT_BASE全局变量定义在board/smdk2410/config.mk文件中,默认值是0x33F80000。TEXT_BASE变量需要根据开发板的情况自己修改,具体地址需要根据硬件设计确定。
其他还有一些全局变量例如__bss_start、_end等定义在board/smdk2410/u-boot.lds文件中。u-boot.lds文件保存了U-Boot数据段代码段等在内存中的存放情况,具体的值由编译器计算。
_start标号一开始定义了ARM处理器7个中断向量的向量表,对应ARM处理器的7种模式。由于上电一开始处理器会从地址0执行指令,因此第一个指令直接跳转到reset标号。reset执行机器初始化的一些操作,此处的跳转指令,无论是冷启动还是热启动开发板都会执行reset标号的代码。
%提示:reset也属于一种异常模式,并且该模式的代码不需要返回。