1. 查找入口
u-boot版本:2024.01 参考defconfig:imx8qm_mek_defconfig
通过编译生成的u-boot.lds
,U-Boot
的入口为_start
。而程序的一开始存放的指令是由start.c
生成的。
1ENTRY(_start)
1 . = 0x00000000;
2 . = ALIGN(8);
3 .text :
4 {
5 *(.__image_copy_start)
6 arch/arm/cpu/armv8/start.o (.text*)
7 }
2. 程序流程
2.1. _start
默认情况下_start
会直接通过b reset
跳转到reset
处。
在反汇编中,1400000a
就是b reset
的二进制码。
10000000000000000 <__image_copy_start>:
2_start():
3/home/owo/disk/02-coding/eos/u-boot/arch/arm/cpu/armv8/start.S:31
4 0: 0a 00 00 14 1f 20 03 d5 ..... ..
3. main_loop
4. SPL
1/// arch/arm/mach-exynos/spl_boot.c
2void board_init_f(unsigned long bootflag)
3{
4 __aligned(8) gd_t local_gd;
5 __attribute__((noreturn)) void (*uboot)(void);
6
7 setup_global_data(&local_gd);
8
9 if (do_lowlevel_init())
10 power_exit_wakeup();
11
12 copy_uboot_to_ram();
13
14 /* Jump to U-Boot image */
15 uboot = (void *)CONFIG_SYS_TEXT_BASE;
16 (*uboot)();
17 /* Never returns Here */
18}