uboot分析
OK6410 uboot分析
开发板release的uboot代码。
开发板上电后,开始执行uboot的指令,从/board/samsung/smdk6410/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文件的全局入口点
. = ALIGN(4);///*4字节对齐*/
.text :
{
cpu/s3c64xx/start.o (.text)//起始代码段
cpu/s3c64xx/s3c6410/cpu_init.o (.text)
cpu/s3c64xx/onenand_cp.o (.text)
cpu/s3c64xx/nand_cp.o (.text)
cpu/s3c64xx/movi.o (.text)
*(.text)
lib_arm/div0.o
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
u-boot会从cpu/s3c64xx/start.s文件开始运行
.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 。。。。。。。。。。。。。。 clbss_l: str r2, [r0] /* clear loop... */ add r0, r0, #4 cmp r0, r1 ble clbss_l ldr pc, _start_armboot _start_armboot: .word start_armboot
代码从_start 开始运行,
从
ldr pc, _start_armboot处跳转到c函数
void start_armboot (void)
代码位于: lib_arm/board.c
该函数主要完成系统的初始化工作,并进入主循环main_loop ();,等待处理。
/common/main.c
main_loop()
U-Boot作为Bootloader,具备多种引导内核启动的方式。常用的go和bootm命令可以直接引导内核映像启动。U-Boot与内核的关系主要是内核启动过程中参数的传递。
浙公网安备 33010602011771号