Uboot开启步骤分析(基于u-)
先分析一下u-boot开启两个阶段,。
先看board/smsk2410/u-,能够知道目标程序各部分链接次序。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000; /*指定可实施image文件全局入口点,通常这个地址全部放在ROM(flash)0x0位置。必需使编译器知道这个地址,通常全部是修改此处来完成*/
. = ALIGN(4);
.text :
{
cpu/arm920t/ (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
第一个要链接是cpu/arm920t/,那么U-Boot入口指令一定在这个程序中。下面具体分析一下程序跳转和函数调用关系和函数实现。
1.Stage1:cpu/arm920t/
这个汇编程序是U-Boot入口程序,开头就是复位向量代码。
U-Boot开启代码步骤图
_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 //中止向量
…
/* the actual reset code */
reset: //复位开启子程序
/* 设置CPU为SVC32模式 */
mrs r0,cpsr
bic r0,r0,#0x1f ;;位清除,将一些位值置0:r0 = r0 AND ( !0x1f)
orr r0,r0,#0xd3 ;;逻辑或,将r0和立即数进行逻辑或,放在r0中(第一个)
msr cpsr,r0
/* 关闭看门狗 */
/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
2021年启动流程分析基于 来自淘豆网m.daumloan.com转载请标明出处.