1. 查找入口

u-boot版本:2024.01 参考defconfig:imx8qm_mek_defconfig

通过编译生成的u-boot.ldsU-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}