u-boot源码汇编段简要分析
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源码汇编段简要分析的更多相关文章
- Spring Boot源码分析-启动过程
Spring Boot作为目前最流行的Java开发框架,秉承"约定优于配置"原则,大大简化了Spring MVC繁琐的XML文件配置,基本实现零配置启动项目. 本文基于Spring ...
- Spring Boot源码分析-配置文件加载原理
在Spring Boot源码分析-启动过程中我们进行了启动源码的分析,大致了解了整个Spring Boot的启动过程,具体细节这里不再赘述,感兴趣的同学可以自行阅读.今天让我们继续阅读源码,了解配置文 ...
- 精尽Spring Boot源码分析 - 序言
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - Jar 包的启动实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 文章导读
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
随机推荐
- 奇异值分解(SVD)原理与在降维中的应用
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...
- CSS 特殊属性介绍之 pointer-events
首先看一下 MDN 上关于 pointer-events 的介绍: CSS属性 pointer-events 允许作者控制特定的图形元素在何时成为鼠标事件的 target.当未指定该属性时,SVG 内 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 开发者接入 基本配置 服务器配置 out.aspx
页面代码: 前段为默认的,什么都不用写,后台如下: 即可 来自为知笔记(Wiz)
- C++随笔:.NET CoreCLR之GC探索(2)
首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...
- springmvc的拦截器
什么是拦截器 java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...
- 超详细mysql left join,right join,inner join用法分析
下面是例子分析表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- Mono on CentOS 6.3 安装笔记
在网上找到篇关于yum的文章,写的很详细特此推荐下,在阅读本文之前建议先看看它: <CentOS yum源的配置与使用> 如果用的是移动光驱,建议不要开启本地的yum 的本地reposit ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- Mac OS X 上编写 ASP.NET vNext (二) IDE配置
上一篇中介绍了如何在OS X上搭建.Net运行时.不过光有运行时还不够,还需要有一个好用的IDE,有了IDE的支持,OS X上的开发才称为可能. 和上篇类似,这里先列举出具体步骤,个人可以根据自己的情 ...