2017.9版本uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r。

?

一 、程序的入口:_start

对于任何程序,入口函数是在链接时决定的,uboot的入口是由链接脚本决定的。uboot下armv7链接脚本默认目录为u-boot-2017.09\arch\arm\cpu\u-boot.lds。

由链接文件u-boot.lds的ENTRY(_start)可知,程序的入口在_start。

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

......

. = 0x00000000;

. = ALIGN(4);

.text :

{

*(.__image_copy_start)

*(.vectors)

CPUDIR/start.o (.text*)

*(.text*)

}

?

在u-boot-2017.09版本中,入口_start在u-boot-2017.09\arch\arm\lib\vectors.S中,

_start:

#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG

.wordCONFIG_SYS_DV_NOR_BOOT_CFG

#endif

breset

ldrpc, _undefined_instruction

ldrpc, _software_interrupt

ldrpc, _prefetch_abort

ldrpc, _data_abort

ldrpc, _not_used

ldrpc, _irq

ldrpc, _fiq

在vectors.S中,可以看到,从_start入口进入后,立刻跳转到reset去执行。reset在u-boot-2017.09\arch\arm\cpu\armv7\start.S中。

?

在start.S中,顺序执行以下操作:

(1)单板保存一些boot重要参数

reset:

/* Allow the board to save important registers */

bsave_boot_params

save_boot_params_ret:

#ifdef CONFIG_ARMV7_LPAE/* 未定义,因此实际上什么也没做 */

/*

* check for Hypervisor support

*/

mrcp15, 0, r0, c0, c1, 1@ read ID_PFR1

andr0, r0, #CPUID_ARM_VIRT_MASK@ mask virtualization bits

cmpr0, #(1 << CPUID_ARM_VIRT_SHIFT)

beqswitch_to_hypervisor

switch_to_hypervisor_ret:

#endif

......

ENTRY(save_boot_params)

bsave_boot_params_ret@ back to my caller

ENDPROC(save_boot_params)

.weaksave_boot_params

(2)屏蔽中断,设置CPU进入SVC32模式

/*

* disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,

* except if in HYP mode already

*/

mrsr0, cpsr

andr1, r0, #0x1f@ mask mode bits

teqr1, #0x1a@ test for HYP mode

bicner0, r0, #0x1f@ clear all mode bits

orrner0, r0, #0x13@ set SVC mode

orrr0, r0, #0xc0@ disable FIQ and IRQ

msrcpsr,r0

(3)配置cp15,初始化mmu cache tlb;然后cpu_init_crit调用lowlevel_init(与特定开发板相关的初始化函数)函数,在这个函数里会做一些pll和memory的初始化;从cpu_init_crit返回后,_start的工作基本完成,接下来就是调用_main。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

blcpu_init_cp15

#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLY

blcpu_init_crit

#endif

#endif

bl_main

......

ENTRY(cpu_init_crit)

/*

* Jump to board specific initialization...

* The Mask ROM will have already initialized

* basic memory. Go here to bump up clock rate and handle

* wake up conditions.

*/

blowlevel_init@ go setup pll,mux,memory

ENDPROC(cpu_init_crit)

?

?

二 _main

_main函数在u-boot-2017.09\arch\arm\lib\crt0.S中,代码如下,其中有三个比较重要的函数:

(1)board_init_f

? ? ? ? ?从_main处顺序执行,遇到的第一个重要的函数就是board_init_f。之前部分代码的作用是设置运行环境,为调用board_init_f做准备。

? ? ? ? ?board_init_f函数在common/board_f.c里面;函数通过调用initcall_run_list(init_sequence_f)执行一系列前半部分板级的初始化工作;

ENTRY(_main)

/*

* Set up initial C runtime environment and call board_init_f(0).

*/

#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)

ldrr0, =(CONFIG_SPL_STACK)

#else

ldrr0, =(CONFIG_SYS_INIT_SP_ADDR)

#endif

bicr0, r0, #7/* 8-byte alignment for ABI compliance */

movsp, r0

blboard_init_f_alloc_reserve

movsp, r0

/* set up gd here, outside any C code */

movr9, r0

blboard_init_f_init_reserve

movr0, #0

blboard_init_f/* u-boot-2017.05\common\board_f.c */

(2)relocate_code

? ? ? ? ?第二部分重定位u-boot代码,复制u-boot代码到SDRAM中;

? ? ? ? ?relocate_code定义在u-boot-2017.09\arch\arm\lib\relocate.S中;

ldrr0, [r9, #GD_RELOCADDR]/* r0 = gd->relocaddr */

brelocate_code/* u-boot-2017.05\arch\arm\lib\relocate.S */

(3)board_init_r:? ? ? ? ?

? ? ? ? 第三部分跳转到board_init_r,board_init_r在common\board_r.c中。

? ? ? ? ?在board_init_r中通过initcall_run_list(init_sequence_r)执行一系列后半部分的板级初始化函数。在这些板级初始化函数? ? ? ? ?最后调用的是run_main_loop函数 ,经过?main_loop函数后不再返回。

? ? ? ? ?main_loop函数在common\main.c中,其主要作用是进入命令行,接收并执行命令。

#if ! defined(CONFIG_SPL_BUILD)

bl coloured_LED_init

bl red_led_on

#endif

/* call board_init_r(gd_t *id, ulong dest_addr) */

mov r0, r9 /* gd_t */

ldrr1, [r9, #GD_RELOCADDR]/* dest_addr */

/* call board_init_r */

#if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)

ldrlr, =board_init_r/* this is auto-relocated! */

bxlr

#else

ldrpc, =board_init_r/* u-boot-2017.05\common\board_r.c:this is auto-relocated! */

#endif

/* we should not return here. */

#endif

? 至此基本完成uboot的一个启动过程。

?

? ? ? ? ? ? ? ? ? 两位写的非常好,值得好好学习!

uboot启动流程概述_2017.09版uboot启动过程分析相关推荐

  1. S3C2440上电启动流程概述

    一.S3C2440的启动方式 1.启动介质 S3C2440在上电时会通过判断OM0和OM1的信号组合来决定指令开始执行的位置(即引导ROM的位置),同时这两个信号也用于决定BANK0(nGCS0)的总 ...

  2. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  3. 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)

    [SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...

  4. uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践

    Alibaba Cloud Linux 2 (原Aliyun Linux 2)是阿里云操作系统团队基于社区版 4.19 LTS 内核打造的一款针对云产品优化的下一代 Linux 操作系统发行版,不仅提 ...

  5. uboot启动流程概述_关于RISCV启动部分的思考~

    1.本文说明 RISC-V的架构有着非常鲜明的特点,如果看过arm,aarch64,mips等架构的一些架构手册的基础知识,再看RISC-V的芯片的架构设计,就会觉得非常有意思,可以找到一些影子,但是 ...

  6. uboot启动流程概述_uboot 分析之 启动流程

    uboot的启动流程: 看一幅图: 1.第一阶段:start.s的内容: 点击(此处)折叠或打开 #include @该文件是第二步中mkconfig文件执行时创建的.include/config.h ...

  7. Springboot启动流程分析-1——脚手架工程和启动流程

    一.创建springboot脚手架工程 springboot官方提供一个web网页用于构建脚手架工程 https://start.spring.io Project选项: Java生态体系中有三大构建 ...

  8. windows下oracle启动流程,笔者设置win7系统手动启动Oracle服务的还原步骤

    相信大部分在使用电脑工作的时候,有时候会遇到win7系统手动启动Oracle服务的问题,最近有很多朋友来向我咨询win7系统手动启动Oracle服务的问题如何解决,针对这一问题,我给大家整理总结出了w ...

  9. am335x uboot启动流程分析

    基本指令含义 .globl _start .globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号 b,bl b是不带返回的跳转  bl带返回的跳 ...

最新文章

  1. 稠密仿射变换 cvWarpAffine
  2. [Google Guava] 排序: Guava强大的”流畅风格比较器”
  3. 这样安装python库才是最正确的哦_这样安装 Python 库才是最正确的哦~
  4. 玩数据必备Python库:Numpy使用详解
  5. python小型登录系统_python实现用户登录系统
  6. rplidar 启动马达 c++_【玩码】刘作虎:一加7 Pro的横向线性马达,为安卓手机最大...
  7. 交叉编译 -sh: ./xxx: not found 的问题
  8. 算法学习:01背包问题求具体方案
  9. 华为笔试题 字符串解压缩(C语言解法)
  10. matlab表示开方,在MATLAB内置功能中,‘sqrt(a)’表示() 答案:对a开方
  11. Linux查看opencv版本
  12. python 模拟键盘_用Python模拟键盘输入
  13. MP3stego下载(强大的隐写工具)
  14. 局域网服务器ie浏览器文件传输慢,Win8.1系统下局域网打开IE网页很慢如何解决...
  15. 我的新书《asp.net开发技巧精讲》
  16. 打造高质量的私域朋友圈,让营销效果翻倍
  17. [Android]仿京东手机端类别页
  18. 微信小程序截屏保存图片
  19. 清华计算机2020保研,清华大学2020届保研情况
  20. Sublime配置java运行环境(IntelliJ IDEA也许更好用)

热门文章

  1. java读写德卡数据_Spark Streaming 读取Kafka数据写入ES
  2. 测试~在哪些方面考虑设计测试用例, 举例微信点赞测试用例设计
  3. js放大镜(图片放大)
  4. 模拟电话和数字电话有什么区别?优点和缺点!!!
  5. 黑苹果卡在白苹果不动_苹果手机一直卡在黑苹果白屏的状态怎么恢复?
  6. 实战干货|自研数据存储迁移MySQL实战
  7. word添加导航标题
  8. 欧姆龙PLC仿真环境搭建及通信测试
  9. POLYCOM视频会议系统应用
  10. dcdc芯片效率不高的原因_贴片DC/DC变换(稳压)ic主要故障与检修