uboot启动流程概述_2017.09版uboot启动过程分析
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启动过程分析相关推荐
- S3C2440上电启动流程概述
一.S3C2440的启动方式 1.启动介质 S3C2440在上电时会通过判断OM0和OM1的信号组合来决定指令开始执行的位置(即引导ROM的位置),同时这两个信号也用于决定BANK0(nGCS0)的总 ...
- 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)
[SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...
- 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)
[SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...
- uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践
Alibaba Cloud Linux 2 (原Aliyun Linux 2)是阿里云操作系统团队基于社区版 4.19 LTS 内核打造的一款针对云产品优化的下一代 Linux 操作系统发行版,不仅提 ...
- uboot启动流程概述_关于RISCV启动部分的思考~
1.本文说明 RISC-V的架构有着非常鲜明的特点,如果看过arm,aarch64,mips等架构的一些架构手册的基础知识,再看RISC-V的芯片的架构设计,就会觉得非常有意思,可以找到一些影子,但是 ...
- uboot启动流程概述_uboot 分析之 启动流程
uboot的启动流程: 看一幅图: 1.第一阶段:start.s的内容: 点击(此处)折叠或打开 #include @该文件是第二步中mkconfig文件执行时创建的.include/config.h ...
- Springboot启动流程分析-1——脚手架工程和启动流程
一.创建springboot脚手架工程 springboot官方提供一个web网页用于构建脚手架工程 https://start.spring.io Project选项: Java生态体系中有三大构建 ...
- windows下oracle启动流程,笔者设置win7系统手动启动Oracle服务的还原步骤
相信大部分在使用电脑工作的时候,有时候会遇到win7系统手动启动Oracle服务的问题,最近有很多朋友来向我咨询win7系统手动启动Oracle服务的问题如何解决,针对这一问题,我给大家整理总结出了w ...
- am335x uboot启动流程分析
基本指令含义 .globl _start .globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号 b,bl b是不带返回的跳转 bl带返回的跳 ...
最新文章
- 稠密仿射变换 cvWarpAffine
- [Google Guava] 排序: Guava强大的”流畅风格比较器”
- 这样安装python库才是最正确的哦_这样安装 Python 库才是最正确的哦~
- 玩数据必备Python库:Numpy使用详解
- python小型登录系统_python实现用户登录系统
- rplidar 启动马达 c++_【玩码】刘作虎:一加7 Pro的横向线性马达,为安卓手机最大...
- 交叉编译 -sh: ./xxx: not found 的问题
- 算法学习:01背包问题求具体方案
- 华为笔试题 字符串解压缩(C语言解法)
- matlab表示开方,在MATLAB内置功能中,‘sqrt(a)’表示() 答案:对a开方
- Linux查看opencv版本
- python 模拟键盘_用Python模拟键盘输入
- MP3stego下载(强大的隐写工具)
- 局域网服务器ie浏览器文件传输慢,Win8.1系统下局域网打开IE网页很慢如何解决...
- 我的新书《asp.net开发技巧精讲》
- 打造高质量的私域朋友圈,让营销效果翻倍
- [Android]仿京东手机端类别页
- 微信小程序截屏保存图片
- 清华计算机2020保研,清华大学2020届保研情况
- Sublime配置java运行环境(IntelliJ IDEA也许更好用)