287开发板开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。看一下u-boot--,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm926ejs/,那么U-Boot的入口指令一定位于这个程序中。下面分两阶段介绍启动流程: -Boot的入口程序,开头就是复位向量的代码。_start:breset//复位向量ldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abortldrpc,_data_abortldrpc,_not_usedldrpc,_irq//中断向量ldrpc,_fiq//中断向量…/*theactualresetcode*/reset://复位启动子程序/*设置CPU为SVC32模式*/mrsr0,cpsrbicr0,r0,#0x1forrr0,r0,#0xd3msrcpsr,r0/*关闭看门狗*/…………relocate:/*把U-Boot重新定位到RAM*/adrr0,_start/*r0是代码的当前位置*/ldrr1,_TEXT_BASE/*_TEXT_BASE是RAM中的地址*/cmpr0,r1/*比较r0和r1,判断当前是从Flash启动,还是RAM*/beqstack_setup/*如果r0等于r1,跳过重定位代码*//*准备重新定位代码*/ldrr2,_armboot_startldrr3,_bss_startsubr2,r3,r2/*r2得到armboot的大小*/addr2,r0,r2/*r2得到要复制代码的末尾地址*/copy_loop:/*重新定位代码*/ldmiar0!,{r3-r10}/*从源地址[r0]复制*/stmiar1!,{r3-r10}/*复制到目的地址[r1]*/cmpr0,r2/*复制数据块直到源数据末尾地址[r2]*/blecopy_loop/*初始化堆栈等*/stack_setup:ldrr0,_TEXT_BASE/*上面是128KiB重定位的u-boot*/subr0,r0,#CFG_MALLOC_LEN/*向下是内存分配空间*/subr0,r0,#CFG_GBL_DATA_SIZE/*然后是bdinfo结构体地址空间*/#ifdefCONFIG_USE_IRQsubr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp,r0,#12/*为abort-stack预留3个字*/clear_bss:ldrr0,_bss_start/*找到bss段起始地址*/ldrr1,_bss_end/*bss段末尾地址*/movr2,#0x00000000/*清零*/clbss_l:strr2,[r0]/*bss段地址空间清零循环...*/addr0,r0,#4cmpr0,r1bneclbss_l/*跳转到start_armboot函数入口,_start_armboot字保存函数入口指针*/ldrpc,_start_armboot_sta
Uboot启动流程 来自淘豆网m.daumloan.com转载请标明出处.