• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard ELF 1板卡-uboot启动流程分析之uboot启动阶段

05/30 09:25
870
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

uboot启动可分为汇编语言执行和C语言执行两个阶段,两个阶段以_main函数为分界。

uboot第一阶段由_start (arch/arm/lib/vectors.S)进入,然后跳转到reset(arch/arm/cpu/armv7/start.S)函数, reset函数进行设置CPU运行模式,关闭中断等一系列CPU内部环境初始化后,跳转到_main函数。

第二阶段通过_main函数进入,_main主要做了如下功能:

一、设置C代码的运行环境,为调用board_init_f接口做准备:

(一)设置堆栈(C代码的函数调用,堆栈是必须的);

(二)调用board_init_f接口,从堆栈开始的地方,为u-boot中global data数据结构,分配空间;

(三)调用board_init_f_init_reserve接口,对gd进行初始化;

二、调用board_init_f函数,完成一些前期的初始化工作,例如:

(一)设置gd结构体中各成员在内存中的地址,包括环境变量地址、uboot重定位的地址;

(二)串口初始化,打印板卡信息;

三、根据board_init_f 指定的uboot重定位的地址,执行u-boot的relocation重定位操作。

四、清除BSS段。

五、调用board_init_r函数,执行后续的板级初始化操作,包括各种外设接口、中断、环境变量等。最后调用run_main_loop()函数,进入倒计时等待,等待超时后执行bootcmd启动内核。

具体流程如下图:

相关推荐