上节烧写了uboot到开发板,不能运行。这节咱们剖析uboot从新编译uboot,由最初一条链接命令开始剖析uboot@[TOC]
下图为编译uboot后显示的最初一条链接命令。
1.剖析start.S 关上uboot.lds,发现链接地址为0,所以新的uboot只能在nor flash运行。运行开始文件为start.o。 上面咱们剖析arch/arm/cpu/arm920t/start.S 从start_code开始运行
.globl _start //申明_start全局符号,这个符号会被lds链接脚本用到_start: b start_code //跳转到start_code符号处,0x00 ldr pc, _undefined_instruction //0x04 ldr pc, _software_interrupt //0x08 ldr pc, _prefetch_abort //0x0c ldr pc, _data_abort //0x10 ldr pc, _not_used //0x14 ldr pc, _irq //0x18 ldr pc, _fiq //0x20_undefined_instruction: .word undefined_instruction //定义_undefined_instruction指向undefined_instruction(32位地址)_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 .balignl 16,0xdeadbeef //balignl应用,参考http://www.cnblogs.com/lifexy/p/7171507.html2._start会跳转到start_code处start_code: /*设置CPSR寄存器,让CPU进入管理模式*/ mrs r0, cpsr //读出cpsr的值 bic r0, r0, #0x1f //清位 orr r0, r0, #0xd3 //位或 msr cpsr, r0 //写入cpsr#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) /* * relocate exception table */ ldr r0, =_start ldr r1, =0x0 //r1等于异样向量基地址 mov r2, #16copyex: subs r2, r2, #1 //减16次,s示意每次减都要更新条件标记位 ldr r3, [r0], #4 str r3, [r1], #4 //将_start标号后的16个符号存到异样向量基地址0x0~0x3c处 bne copyex //直到r2减为0#endif#ifdef CONFIG_S3C24X0 /* 关看门狗*/# define pWTCON 0x53000000# define INTMSK 0x4A000008 /* Interrupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */ ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] //关看门狗,使WTCON寄存器=0 /*关中断*/ 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默认为120Mhz*/ ldr r0, =CLKDIVN mov r1, #3 str r1, [r0] #ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit //敞开mmu,并初始化各个bank#endifcall_board_init_f: ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) //CONFIG_SYS_INIT_SP_ADDR=0x30000f80 bic sp, sp, #7 //sp=0x30000f80 ldr r0,=0x00000000 bl board_init_f 下面的CONFIG_SYS_INIT_SP_ADDR =0x30000f80,是通过arm-linux-objdump -D u-boot>u-boot.dis生成反汇编,而后从u-boot.dis失去的。
...