u-boot 学习记录 (三) 源码分析(start.S)

来源:互联网 发布:c foreach遍历数组 编辑:程序博客网 时间:2024/05/21 14:44

u-boot启动时开始运行的函数接口:

//u-boot.lds:OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o(.text)*(.text)}        ...} 
从u-boot.lds内容可以知道u-boot第一个运行的代码处为 start.S中_start处:

1. _start

//start.S.globl _start_start:bstart_codeldrpc, _undefined_instructionldrpc, _software_interruptldrpc, _prefetch_abortldrpc, _data_abortldrpc, _not_usedldrpc, _irqldrpc, _fiq
其紧接着跳转到start_code执行:


2. start_code:

// start.S/* * the actual start code */start_code:/* * set the cpu to SVC32 mode */mrsr0, cpsrbicr0, r0, #0x1forrr0, r0, #0xd3msrcpsr, r0blcoloured_LED_initblred_LED_on        ...#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)/* turn off the watchdog */#if defined(CONFIG_S3C2400)#define pWTCON0x15300000#define INTMSK0x14400008/* Interupt-Controller base addresses */#define CLKDIVN0x14800014/* clock divisor register */#else#define pWTCON0x53000000#define INTMSK0x4A000008/* Interupt-Controller base addresses */#define INTSUBMSK0x4A00001C#define CLKDIVN0x4C000014/* clock divisor register */#endifldrr0, =pWTCONmovr1, #0x0strr1, [r0]/* * mask all IRQs by setting all bits in the INTMR - default */movr1, #0xffffffffldrr0, =INTMSKstrr1, [r0]#if defined(CONFIG_S3C2410)ldrr1, =0x3ffldrr0, =INTSUBMSKstrr1, [r0]#endif/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldrr0, =CLKDIVNmovr1, #3strr1, [r0]#endif/* CONFIG_S3C2400 || CONFIG_S3C2410 *//* * we do sys-critical inits only at reboot, * not when booting from ram! */#ifndef CONFIG_SKIP_LOWLEVEL_INITblcpu_init_crit#endif#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:/* relocate U-Boot to RAM    */adrr0, _start/* r0 <- current position of code   */ldr r1, _TEXT_BASE/* test if we run from flash or RAM */cmpr0, r1/* don't reloc during debug         */beqstack_setupldrr2, _armboot_startldrr3, _bss_startsubr2, r3, r2/* r2 <- size of armboot            */addr2, r0, r2/* r2 <- source end address         */copy_loop:ldmiar0!, {r3-r10}/* copy from source address [r0]    */stmiar1!, {r3-r10}/* copy to   target address [r1]    */cmpr0, r2/* until source end addreee [r2]    */blecopy_loop#endif/* CONFIG_SKIP_RELOCATE_UBOOT *//* Set up the stack    */stack_setup:ldrr0, _TEXT_BASE/* upper 128 KiB: relocated uboot   */subr0, r0, #CONFIG_SYS_MALLOC_LEN/* malloc area              */subr0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                 */#ifdef CONFIG_USE_IRQsubr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp, r0, #12/* leave 3 words for abort-stack    */clear_bss:ldrr0, _bss_start/* find start of bss segment        */ldrr1, _bss_end/* stop here                        */movr2, #0x00000000/* clear                            */clbss_l:strr2, [r0]/* clear loop...                    */addr0, r0, #4cmpr0, r1bleclbss_lldrpc, _start_armboot_start_armboot:.word start_armboot

有关闭看门狗,屏蔽中断,设置FCLK:HCLK:PCLK,重定位代码,最后跳转到start_armboot中去执行。



0 0