浩克网 手游攻略 软件教程 ARM上电后都干了哪些事?-uboot启动代码详解

ARM上电后都干了哪些事?-uboot启动代码详解

时间:2026-07-01 09:28:39 来源:网络整理 浏览:0

关于本文的配套。。《uboot启动详解-1》 《uboot启动详解-2》

前言在之前的arm系列课程中,我们已经讲解了arm的架构、汇编指令、常见外设的异常和控制器驱动,因此我们已经具备了开发arm系列产品的基本技能。

本文介绍一个常用的bootloader:uboot。通过对uboot的介绍和对源代码的详细分析,可以把之前所有ARM相关的知识点整合起来。

其目前要支持的目标操作系统是OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、戴尔、NCR、VxWorks、LynxOS、pSOS、QNX、RTEMS、ARTOS、android。

2.U-Boot可支持的主要功能列表:

系统引导支持NFS挂载和RAMDISK(压缩或未压缩)根文件系统;支持NFS挂载和引导压缩或未压缩的系统内核从闪存;基本的辅助功能和强大的操作系统接口功能;可以灵活设置多个关键参数并发送给操作系统,

4.配置参数示例以下示例是网络下载内核和网络挂载nfs。

1)ubuntu环境ubuntu ip:192.168.6.186nfs配置:配置文件如下:

/etc/exports配置信息如下:

nfs

2)开发板设置开发板IP: 192.168.6.187配置命令:

setenvipaddr 192。168 .6 .187;板子的ipsetenvserverip 192。168 .6 .186;虚拟机的ipsetenvgatewayip 192。168 .1 .1;网关saveenv保存配置加载内核和设备树setenvbootcmdftp 41000000 ui image \;TFTP 42000000出口编号4412-fs 4412。dtb \;bootm 41000000-42000000 bootcmd:uboot 2启动之后,

挂载nfssetenvbootargsroot=/dev/nfsnfsroot=192。168 .6 .186:/rootfsrwconsole=tty sac 2,115200 init=/Linux rcip=192。168 .6 .187挂载网络文件系统文件系统,

Rw文件系统操作权限可重写console=ttySAC2,115200串口名称和波特率init=/linuxrc内核启动,运行进程为linuxrcip=192.168.6.187开发板地址II。exynos-4412 Soc的启动顺序如果想知道exynos-4412的启动顺序,

1.exynos-4412内存布局通常一个soc的内存在厂商设计的时候就已经被指定死了,我们无法为用户更改。

我们只关心一个与启动相关的地址,

IROM在soc内部,厂家出厂时就固化了一个特定的程序。iROM中的程序不能为用户更改。iRAM在soc内部,速度更快,但空间很小。DMC RAM控制器位于SOC内部,用于驱动RAM。

控制器需要连接大容量RAM。2.开机顺序不同厂商的开机顺序不一样。本文主要讲解基于三星的exynos-4412 soc的uboot的启动顺序。

根据上图,系统启动的大致顺序如下:

IROM是SOC内部的一个64KB ROM,它汇集了系统启动所必需的一些功能。比如:时钟,栈。IROM负责将BL1的映像从特殊的引导外设加载到soc内部的256KB SRAM中。

激活的外设由操作按钮决定。根据不同键的值,iROM会对bl1的图像进行不同的检查。BL1初始化系统时钟和DRAM控制器,然后将操作系统映像从引导外设加载到DRAM中。

根据启动按钮的值的不同,BL1会对OS做不同的校验。启动完成之后,BL1跳转到操作系统(kernel)。iROM会根据OM 引脚的不同选择不同的启动设备,对应的OM寄存器需要提供对应的启动信息。

三、内核启动流程概述1. 内核启动流程概述如上图所示:

设备上电之后,先执行iROM中的出厂代码,先进行必要硬件的初始化去执行uboot,通常把kernel、设备树文件放到flash中程序启动之后,往往先从flash启动,

运行uboot第一步:先进行硬件的初始化(svc模式栈、clock、内存、串口) 第二步:自搬移:把uboot从flash中拷贝到RAM中,

跳转到RAM中执行剩下的uboot代码第三步:把内核拷贝到RAM中,执行内核,把控制权交给内核。2. 内核启动详细流程开发板从上电到启动内核的过程

四、uboot启动流程代码详解在三星的SoC中, 启动流程可以分为三个阶段BL0, BL1, BL2, BL3, 三星自己的手册对BL1的解释也不尽相同, 一种是将在iRAM中运行的程序都归结为BL1; 一种是将iRAM中三星加密的代码bl1.bin作为BL1, iRAM中剩余的部分作为BL2, 本文采用后者, 他们的主要分工如下:

BL0: ARM的起始地址都是0地址, 三星的芯片一般将0地址映射到iROM中, BL0就是指iROM中固化的启动代码, 主要负责加载BL1BL1: 三星对于bootloader的加密代码bl1.bin, 要放在外设中uboot.bin的头上, 和一部分uboot.bin一起加载到iRAM中运行.BL2: 从(nand/sd/usb)中拷贝的uboot.bin头最大14K到iRAM中代码中除去bl1.bin后剩余的部分, 负责设置CPU为SVC模式, 关闭MMU, 关闭中断, 关闭iCache, 关闭看门狗, 初始化DRAM,初始化时钟, 初始化串口, 设置栈, 校验BL2并将其搬移到DRAM高位地址, 重定位到DRAM中执行BL3BL3:是指在代码重定向后在内存中执行的uboot的完整代码, 负责初始化外设,

img我们常说的uboot是一个两阶段bootloader,就是指上述的BL2和BL3. BL2主要做硬件直接相关的初始化,使用汇编编写;BL3主要为操作系统的运行准备环境,主要用C编写,

这里以ARM平台为例分析其启动流程。下面是启动过程中主要涉及的文件

arch/arm/cpu/armv7/start.S board/samsung/myboard/lowlevel_init.S arch/arm/lib/crt0.S arch/arm/lib/board.c arch/samsung/myboard/myboard.c

1. BL2BL2的主要文件和任务流程如下

arch/arm/cpu/armv7/start.S \1. 设置CPU为SVC模式\2. 关闭MMU \3. 关闭Cache \4. 跳转到lowlevel_init.S low_level_init board/samsung/origen/lowlevel_init.S \5. 初始化时钟\6. 初始化内存\7. 初始化串口\8. 关闭看门狗\9. 跳转到crt0.S _main arch/arm/lib/crt0.S \10. 设置栈\11. 初始化C运行环境\12. 调用board_init_f() arch/arm/lib/board.c \13. board_init_f对全局信息GD结构体进行填充arch/arm/lib/crt0.S \14. 代码重定位------------BL2的最后的工作, 执行完就进入DRAM执行BL2

2. lds文件要想了解uboot整个项目的代码流程,必须首先了解链接脚本【链接脚本参考《7. 从0开始学ARM-GNU伪指令,lds使用》 】。该文件决定了uboot最终生成的镜像文件,各个段的布局。uboot链接脚本如下:

u-boot-2013.01/arch/arm/cpu/u-boot.lds文件内容:

26OUTPUT_FORMAT('elf32-littlearm','elf32-littlearm','elf32-littlearm')27OUTPUT_ARCH(arm)28ENTRY(_start)29SECTIONS30{31.=0x00000000;3233.=ALIGN(4);34.text:35{36__image_copy_start=.37CPUDIR/start.o(.text*)38*(.text*)39}4041.=ALIGN(4);42.rodata:{*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))}4344.=ALIGN(4);45.data:{46*(.data*)47}4849.=ALIGN(4);5051.=.5253.=ALIGN(4);54.u_boot_list:{55#include56}5758.=ALIGN(4);5960__image_copy_end=.6162.rel.dyn:{63__rel_dyn_start=.64*(.rel*)65__rel_dyn_end=.66}6768.dynsym:{69__dynsym_start=.70*(.dynsym)71}7273_end=.7475/*76*Deprecated:thisMMUsectionisusedbypxaatpresentbut77*shouldnotbeusedbynewboards/CPUs.78*/79.=ALIGN(4096);80.mmutable:{81*(.mmutable)82}8384.bss__rel_dyn_start(OVERLAY):{85__bss_start=.86*(.bss*)87.=ALIGN(4);88__bss_end__=.89}9091/DISCARD/:{*(.dynstr*)}92/DISCARD/:{*(.dynamic*)}93/DISCARD/:{*(.plt*)}94/DISCARD/:{*(.interp*)}95/DISCARD/:{*(.gnu*)}96}97核心内容解释:

自搬移代码的初始位置37CPUDIR/start.o(.text*):第一个目标文件CPUDIR/start.o中的代码段38*(.text*):剩下的目标文件的代码段39}60__image_copy_end=.自搬移代码的结束为止BSS全局未初始化变量、全局初始化为0的变量所在的段:

84.bss__rel_dyn_start(OVERLAY):{85__bss_start=.88__bss_end__=.89}3. uboot启动代码流程概要代码只分析到uboot命令行,

函数main_loop()位置。

4. 启动代码详细分析_start。。位于以下文件:

u-boot-2013.01/arch/arm/cpu/armv7/start.S第一阶段:第二阶段第二阶段代码从_main开始:

以上代码详细解释,请结合。。同步学习。

五、uboot启动的几个关键知识点如何判断第一条机器指令的位置链接脚本决定了内存的布局。uboot链接脚本如下:

u-boot-2013.01/arch/arm/cpu/u-boot.lds文件内容:

28ENTRY(_start)29SECTIONS30{31.=0x00000000;32uboot的。。是_start 链接地址是0x00000000

uboot如何搬运代码? 代码位于:u-boot-2013.01/arch/arm/cpu/armv7/start.S搬移代码如下:

ENTRY(relocate_code)movr4,r0/*saveaddr_sp*/movr5,r1/*saveaddrofgd*/movr6,r2/*saveaddrofdestination*/adrr0,_startcmpr0,r6moveqr9,#0/*norelocation.relocationoffset(r9)=0*/beqrelocate_done/*skiprelocation*/movr1,r6/*r1-scratchforcopy_loop*/ldrr3,_image_copy_end_ofsaddr2,r0,r3/*r2-sourceendaddress*/copy_loop:ldmiar0!{r9-r10}/*copyfromsourceaddress[r0]*/stmiar1!{r9-r10}/*copytotargetaddress[r1]*/cmpr0,r2/*untilsourceendaddress[r2]*/blocopy_loop详情参考第四章,

uboot中,如何判断此次开机是从断电状态开机还是从休眠状态启动的?board/samsung/fs4412/lowlevel_init.S代码如下:

41lowlevel_init:54/*AFTRwakeupreset*/55ldrr2,=S5P_CHECK_DIDLE56cmpr1,r257beqexit_wakeup5859/*LPAwakeupreset*/60ldrr2,=S5P_CHECK_LPA61cmpr1,r262beqexit_wakeup6364/*Sleepwakeupreset*/65ldrr2,=S5P_CHECK_SLEEP66cmpr1,r267beqwakeup_reset112wakeup_reset:113blsystem_clock_init114blmem_ctrl_asm_init115bltzpc_init116117exit_wakeup:118/*Loadreturnaddressandjumptokernel*/119ldrr0,=(EXYNOS4_POWER_BASE+INFORM0_OFFSET)120121/*r1=physicaladdressofexynos4210_cpu_resumefunction*/122ldrr1,[r0]123124/*Jumptokernel*/125movpc,r1由上可知,

uboot代码搬到ram之后,代码的运行地址发生了变化,如何保证程序跳转不会出错?除了要保证uboot代码是基于地址无关的,此外.rel.dyn帮我们解决了,其实主要还是编译器帮我们做了很多工作。

位置无关码参考《15. 从0开始学ARM-位置无关码》

设备启动的时候,有可能直接从ram启动, 如何知道当前是从flah启动还是ram启动的?文件:

board/samsung/fs4412/lowlevel_init.S代码:lowlevel_init:

85/*86*IfU-bootisalreadyrunninginram,noneedtorelocateU-Boot.87*MemorycontrollermustbeconfiguredbeforerelocatingU-Boot88*inram.89*/90ldrr0,=0x0ffffff/*r0-MaskBits*/91bicr1,pc,r0/*pc-currentaddrofcode*/92/*r1-unmaskedbitsofpc*/93ldrr2,_TEXT_BASE/*r2-originalbaseaddrinram*/94bicr2,r2,r0/*r2-unmaskedbitsofr2*/95cmpr1,r2/*comparer1,r2*/96beq1f/*r0==r1thenskipsdraminit*/原理: RAM地址空间是:0x40000000-0xA00000000xA0000000-0x00000000 而iROM/iRAM地址的bit:28-31均是0,所以只需要读取出执行到lowlevel_init时pc的值,

标题:ARM上电后都干了哪些事?-uboot启动代码详解
链接:https://www.52hkw.com/news/rj/69833.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
Tiktok专用的梯子加速器(TK加速器全球加速)

Tiktok作为当前最火爆的短视频平台,受到了全球用户的热烈欢迎。然而,由于网络限制或者其他原因,很多用户在观看

2026-07-01
怎么不让快递放菜鸟驿站

菜鸟裹裹怎么禁止放快递?经常网购的小伙伴都知道,如果附近有菜鸟驿站,那么驿站的快递员会默认选择放在驿站中,并

2026-07-01
德国游戏排行榜前十名(德国出品的游戏)

中国的玩家可能在新闻里听过德国科隆游戏展,但对德国的游戏却感觉很陌生。游戏玩家大部分多少应该都体验过SL

2026-07-01
天国的姉弟のカンケイ四部合集(弹丸论破a1处刑合集)

Spike Chunsoft公布了《弹丸论破》四部合集《弹丸论破 三部曲合集+幸福弹丸论破S 超高中级的南国掷骰合宿》

2026-07-01