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 ...
随机推荐
- Sublime Text3配置在可交互环境下运行python快捷键
安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...
- android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- javascript动画系列第四篇——拖拽改变元素大小
× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
- Ajax部分
Ajax的概念 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指 ...
- Oracle-BPM安装详解
H3 BPM安装包括两个部分,基础工作包括安装IIS..net Freamwork基础框架.安装完成之后,主要配置安装包括数据库,H3 BPM 程序.下面详细介绍Oracle与H3 BPM对接安装的整 ...
- linux-centos在VM中的网络配置
1.自动获取IP地址 虚拟机使用桥接模式,相当于连接到物理机的网络里,物理机网络有DHCP服务器自动分配IP地址. #dhclient 自动获取ip地址命令 #ifconfig 查询系统里网卡信息,i ...
- The Coroutine
关于Coroutine 说到coroutine就不的不说subroutine,也就是我们常用到的一般函数.调用一个函数开始执行,然后函数执行完成后就退出,再次调用的时候,再从头开始,调用之间是没有保存 ...
- 重学hadoop技术
最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...
- 到爱尔兰敲代码 / Come, Coding in Ireland
这是我在都柏林的第四个月,该办的证也都办完了,该安定下来的也安定下来了,所以也简单介绍下到爱尔兰做IT的相关过程和政策. 如果有兴趣在英语环境工作的话,我也可以帮忙推荐或者找找. 去年15年1月正好开 ...