U-Boot启动过程
(国嵌)
bootloader 除了依赖CPU,还依赖板级设备的配置,例如板卡的硬件地址分配,外设硬件芯片的类型。不同的板子需修改
bootloader。阶段1:硬件初始化,为加载bootloader的二阶段准备RAM空间,拷贝2阶段代码到内存,设置好堆栈,跳到2阶
段,初始化本阶段要的设备,将内核和根文件从flash中拷贝到RAM中,最后调用内核。
开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序中。下面分两阶段介绍启动流程:
第一阶段
.globl _start
_start: b
reset //复位向量,这里使用b指令转移到“子程序名”处开始执行
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
_pad:
.word 0x12345678 /* no