1 设置中断向量表
CPU在上电后,首先从0x0000 0000地址开始执行程序,uboot编译后,在程序的起始地址处存放了中断向量表,该部分代码为汇编语言写的,代码存储于arch\arm\cpu\armv7目录下的start.S中,如下所示:
/*************************************************************************
*
* Startup Code (reset vector)
*
* Do important init only if we don't startfrom memory!
* Setup memory and board specific bits priorto relocation.
* Relocate armboot to ram. Setup stack.
*
*************************************************************************/
.globl reset
.globl save_boot_params_ret
#ifdefCONFIG_ARMV7_LPAE
.global switch_to_hypervisor_ret
#endif
reset:
/* Allow the board to save importantregisters */
b save_boot_params
save_boot_params_ret:
#ifdefCONFIG_ARMV7_LPAE
/*
* check for Hypervisor support
*/
mrc p15,0, r0, c0, c1, 1 @ readID_PFR1
and r0,r0, #CPUID_ARM_VIRT_MASK @ maskvirtualization bits
cmp r0,#(1 << CPUID_ARM_VIRT_SHIFT)
beq switch_to_hypervisor
switch_to_hypervisor_ret:
#endif
第32行,程序一开始声明了三个全局的三个标签reset,ave_boot_params_ret,switch_to_hypervisor_ret,接着开始执行reset标签处的代码,即b save_boot_params,跳转至save_boot_params处,如下所示:
/*************************************************************************
*
* void save_boot_params(u32 r0, u32 r1, u32r2, u32 r3)
* __attribute__((weak));
*
* Stack pointer is not yet initialized at thismoment
* Don't save anything to stack even ifcompiled with -O0
*
*************************************************************************/
ENTRY(save_boot_params)
b save_boot_params_ret @ back to my caller
ENDPROC(save_boot_params)
.weak save_boot_params