wve

导航

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与内核的关系主要是内核启动过程中参数的传递。


posted on 2012-08-08 16:29  wve  阅读(152)  评论(0)    收藏  举报