u-boot源码汇编段简要分析

CrazyCatJack CrazyCatJack     2022-08-13     576

关键词:

  Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫。今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^

  先简单说一下u-boot,在嵌入式开发中,u-boot起着至关重要的作用:读出嵌入式系统内核并启动内核。因此非常有必要对u-boot进行理解,了解其是如何启动内核的,这样我们才能随心所欲地初始化系统,无论基于什么架构,什么开发板,都能够轻松的去启动内核。这一点难道不是最有吸引力的吗?

  如果大家有看到我的前一篇博客,就会对u-boot的启动有一定程度的了解了。执行u-boot,首先是从启动文件start.S开始的。它位于你所用CPU的文件下。比如我的路径就是:“uboot-1.1.6/cpu/arm920t/start.S”。这基于你具体使用的CPU架构。打开它:

 

  首先看第一条语句,跳转到reset语句执行。那我们来看reset。

 

  根据注释,我们知道是要先让CPU进入SVC32模式,也就是管理模式。具体的汇编代码不再分析,需要大家自己去学习。若是你已经掌握了一定的汇编,则完全可以阅读本篇博客,不然还是建议先学习一下汇编。u-boot代码量还是很大的,再接着往下来看:

 

  根据注释,我们要关闭看门狗,否则此时CPU会不断地重启重启。。。很明显,在定义了具体的SOC型号后,define寄存器地址。包括看门狗控制寄存器、中断屏蔽寄存器、还有时钟分频。关闭看门狗,关闭所有的中断。

 

  这里如果你是从NOR Flash启动的,这里的r0就是0。如果你是从下载器或者调试器直接将代码下载到SDRAM的,r0就为你自己设置的SDRAM代码段的启动地址(详情看我的上一篇博客)。这里会比较一下这两个地址是否相同,就可以知道你是从哪里启动的了,是从NOR Flash还是直接从SDRAM。如果你从SDRAM启动,则说明你已经初始化了SDRAM。如果你是从FLASH启动,则这里跳转到 cpu_init_crit函数执行。

 

  这里是关caches,关MMU,然后跳转到lowlevel_init函数执行开发板相关的配置。

 

  这一部分程序博主开始很不理解,因为这里涉及到了一个链接地址的概念。博主分不清此刻程序到底是在FLASH还是在RAM上。但是后来在论坛提问,大神给予了解答,博主终于懂了。这里的SMRDATA是即将在SDRAM存储的13个寄存器的链接地址,也就是说此刻这13个寄存器的值并未真正存储到SDRAM,而是在NOR FLASH中。但是我们用这个SDRAM上的寄存器链接地址减去SDRAM代码段开始地址(_TEXT_BASE),就得出了相对地址。又因为NOR FLASH的起始地址是0,所以起始地址+相对地址就是这13个寄存器在NOR FLASH上真正存储的开始地址。这段代码就是因为上述原因而进行的地址转换。目的是得到13个寄存器在NOR FLASH上存储的开始地址。

 

  

  我们接着分析,下一步根据注释是设置堆栈,将代码段地址给r0,这里我们设置的是0x33F80000.然后设置MALLOC段:分配空间,r0减去此段大小。再设置CFG_GBL_DATA段,同理r0减去此段大小,分配空间。再设置IRQ段、FIQ段。最后r0减去12,留出3个字节的空间。下一步是跳转到clock_init设置时钟。

  relocate这段代码是要将u-boot从FLASH复制到RAM。_start是当前代码的开始地址,_TEXT_BASE是代码段的链接地址,如果二者相等则证明是从RAM启动,无需复制代码。转去执行清BSS段代码。_armboot_start是在当前文件即start.S中定义的第一条指令的运行地址,_bss_start是在board/开发板型号/u-boot.lds中定义的代码段结束地址。结束地址减去开始地址等于代码段长度,赋值给r2。然后就是如果你是从FLASH启动则需进行代码赋值,这里是用C函数实现。

 

   这里我们设置的是USB48MHZ,总时钟400MHZ.根据代码,再接下来是清BSS段。

 

  所谓的BSS段就是未初始化的静态变量和全局变量,或者初始化为0的静态变量和全局变量。将他们存入只会浪费空间。所以用到他们的时候再去初始化。这里的清BSS段就是这样的作用。

  清完BSS段就是要复制代码到RAM。这里韦东山老师是自己用C语言实现的从FLASH到RAM程序的复制。因为版权原因,我们不便贴出。其实也是很容易的内存块复制。

 

  最后是进入到了_start_armboot。这是一个C函数,从这里开始就是用C来实现读出内核,启动内核了。硬件相关的汇编程序讲解结束!

 

 

 

版权声明:

本博客未经允许,禁止转载。

我尊重DENX Software Engineering为开源代码做出的贡献,他们做出u-boot,并将其开源供全世界的人们下载、学习和使用。

博主是跟随韦东山老师学习的嵌入式Linux开发,其中的CopyCode2Ram函数为韦东山老师编写。本文源于对学习成果的总结。

 

 

 

CCJ

2016-11-19   11:14:00

 

 

u-boot分析与使用(代码片段)

文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情

u-boot分析与使用(代码片段)

文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情

eventbus3.0源码简要分析

EvenBus可以在不同模块间传递信息,减少接口的使用。一、使用例子<spanstyle="font-size:18px;">publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(s 查看详情

tiny4412u-boot分析u-boot启动流程

从大方面来说,u-boot的启动分成两个阶段,第一个阶段主要的职责是准备初始化的环境,主要有以下几点①设置异常向量表②把CPU的工作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串口⑥设置... 查看详情

10th.u-boot——代码结构分析

简介    U-Boot(UniversalBootLoader),通用BootLoader,一是可以引导多种操作系统,二是支持多种架构CPU。     教程中是在sourcefoge网站上下载的U-boot-1.1.6源码,进行分析与移植。 结构分析    U-boot-1.1.6有26个子目录... 查看详情

elasticsearch之client源码简要分析

问题让我们带着问题去学习,效率会更高1 es集群只配置一个节点,client是否能够自动发现集群中的所有节点?是如何发现的?2 esclient如何做到负载均衡?3 一个esnode挂掉之后,esclient如何摘掉该节点?4 esclientnode... 查看详情

androiddebuggerd简要介绍和源码分析(转载)(代码片段)

...以android4.1为基础,分析debuggerd这个工具的使用方法和源码。1.Debuggerd简介debuggerd是一个daemon进程,在系统启动时随着init进程启动。主要负责将进程运行时的信息dump到文件或者控制台中。1.1debuggerd的运行原理创建一个名为... 查看详情

u-boot移植---修改前工作:代码流程分析3---代码重定位

...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):     查看详情

u-boot分析1:nandflashnorflash启动

了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核。u-boot全称:UniversalBootLoader,即通用Bootloader,遵循GPL条款,开放源码。支持... 查看详情

u-boot-2014-07代码流程分析

前言以前接触到的u-boot启动方式只有Flash和NandFlash这两种方式,最近接触是SD卡启动方式,SoC是S5P4418,启动方式也第一次接触到,根据S5P4418用户手册可以找到系统使用SD卡启动时,片内iROM内固化的代码会自动映射到0x00地址,也... 查看详情

u-boot代码分析--第一节(代码片段)

u-boot代码分析--第一节编者:weirdo时间:2020-5-12QQ:2651293248标题:u-boot代码分析第一节1.u-boot.lds文件?? 这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的... 查看详情

u-boot主makefile详尽分析

U-boot主Makefile详尽分析主Makefile位于uboot源码的根目录下,其内容主要结构为:1.确定版本号及主机信息(23至48行)2.实现静默编译功能(48至55行)3.设置各种路径(56至123行)4.设置编译工具链(124至186行,大部分在config.mk内)5.... 查看详情

ffmpeg之ffplay源码简要分析(代码片段)

1ffplay基本架构1.1视频解码播放的基本流程  ffmpeg视频解码播放的基本流程如下图所示:首先对网络媒体数据流进行解封装得到一般的视频封装格式比如MP4等,如果是本地播放的媒体文件就不需要解协议;然后对视... 查看详情

buildroot构建项目---u-boot2017.11适配开发板修改1

...并不太适用。还得做一系列得修改。一、lds文件分析  u-boot中最重要得链接文件即是,u-boot.lds。我们可以查看我们编译出来得u-boot.lds文件进行分析,原始文件在arch/arm/cpu/下,编译出来得去掉了不想关得选项。  u-boot.lds脚... 查看详情

汇编语言——编译器

一个汇编语言程序从写出到最终执行的简要过程:编写--〉编译--〉连接--〉执行1、编写notepad++选择Assemblyassumecs:abc ;abc被我们当做代码段来使用,so要把它和cs联系起来abcsegment ;定义一个段(abc),到ends结束start: movax,2 ;给程序一... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

...、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核源码分析(... 查看详情

汇编学习8086cpu-段地址-偏移地址简要理解

这只是新手学习汇编的一个小笔记,帮助自己理解的,不建议观看! 最近刚开始学习汇编,看到了8086 CPU的寻址方式:物理地址=段地址*16+偏移地址,于是有了如下的一些问题:一、为何8086 CPU... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

...、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核源码分析(... 查看详情