uboot入口boot flow(ARMv8)
uboot入口boot flow(ARMv8)
uboot entry point是_start,这个在u-boot.lds里有define
_start里执行b reset跳转到reset label处执行
19 .globl _start 20 _start: 21 #if defined(CONFIG_LINUX_KERNEL_IMAGE_HEADER) 22 #include <asm/boot0-linux-kernel-header.h> 23 #elif defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK) 24 /* 25 * Various SoCs need something special and SoC-specific up front in 26 * order to boot, allow them to set that in their boot0.h file and then 27 * use it here. 28 */ 29 #include <asm/arch/boot0.h> 30 #else 31 b reset 32 #endif
u-boot-2019.04\arch\arm\cpu\armv8\u-boot.lds
OUTPUT_ARCH(aarch64) ENTRY(_start) SECTIONS
reset label里会调用switch_el、lowlevel_init(define本文件,start.S),然后bl _main
104 switch_el x1, 3f, 2f, 1f 105 3: set_vbar vbar_el3, x0 106 mrs x0, scr_el3 107 orr x0, x0, #0xf /* SCR_EL3.NS|IRQ|FIQ|EA */ 108 msr scr_el3, x0 109 msr cptr_el3, xzr /* Enable FP/SIMD */ 110 #ifdef COUNTER_FREQUENCY 111 ldr x0, =COUNTER_FREQUENCY 112 msr cntfrq_el0, x0 /* Initialize CNTFRQ */ 113 #endif 114 b 0f 115 2: set_vbar vbar_el2, x0 116 mov x0, #0x33ff 117 msr cptr_el2, x0 /* Enable FP/SIMD */ 118 b 0f 119 1: set_vbar vbar_el1, x0 120 mov x0, #3 << 20 121 msr cpacr_el1, x0 /* Enable FP/SIMD */ 122 0: ... 148 /* Processor specific initialization */ 149 bl lowlevel_init ... 168 master_cpu: 169 bl _main
_main()主要所做的事情如下:
1. 设置relocation前的sp(初始stack pointer),此时的sp将是这一阶段运行的stack,然后调用board_init_f设置relocation相关的gd成员(gd->relocaddr/gd->reloc_off/gd->start_addr_sp/gd->new_gd)
2. 设置relocation的sp(gd->start_addr_sp),此时的sp将是之后uboot运行的stack(top),之后调用relocate_code完成uboot relocation
3. 调用board_init_r,第一参数的值是gd指针,第二个参数为gd->relocaddr
66 ENTRY(_main) 79 ldr x0, =(CONFIG_SYS_INIT_SP_ADDR) 80 #endif 81 bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */ 82 mov x0, sp 83 bl board_init_f_alloc_reserve 84 mov sp, x0 85 /* set up gd here, outside any C code */ 86 mov x18, x0 87 bl board_init_f_init_reserve 88 89 mov x0, #0 90 bl board_init_f ... 92 #if !defined(CONFIG_SPL_BUILD) 93 /* 94 * Set up intermediate environment (new sp and gd) and call 95 * relocate_code(addr_moni). Trick here is that we'll return 96 * 'here' but relocated. 97 */ 98 ldr x0, [x18, #GD_START_ADDR_SP] /* x0 <- gd->start_addr_sp */ 99 bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */ 100 ldr x18, [x18, #GD_NEW_GD] /* x18 <- gd->new_gd */ 102 adr lr, relocation_return 110 /* Add in link-vs-relocation offset */ 111 ldr x9, [x18, #GD_RELOC_OFF] /* x9 <- gd->reloc_off */ 112 add lr, lr, x9 /* new return address after relocation */ 113 ldr x0, [x18, #GD_RELOCADDR] /* x0 <- gd->relocaddr */ 114 b relocate_code 115 116 relocation_return: 140 /* 141 * Clear BSS section 142 */ 143 ldr x0, =__bss_start /* this is auto-relocated! */ 144 ldr x1, =__bss_end /* this is auto-relocated! */ 145 clear_loop: 146 str xzr, [x0], #8 147 cmp x0, x1 148 b.lo clear_loop 149 150 /* call board_init_r(gd_t *id, ulong dest_addr) */ 151 mov x0, x18 /* gd_t */ 152 ldr x1, [x18, #GD_RELOCADDR] /* dest_addr */ 153 b board_init_r /* PC relative jump */ 154 155 /* NOTREACHED - board_init_r() does not return */ 156 #endif 157 158 ENDPROC(_main)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2020-06-12 uboot中fdt命令的使用