uboot之第一阶段
U-boot的启动一般分为两个阶段,现在我们先将第一阶段。
在此之前,我们先了解一下uboot的目录结构,各个文件夹是什么作用。
如果连各个文件夹是干什么的都不清楚就开始移植剪裁,势必会和我刚拿到开发板时对着uboot一脸懵逼的情景一样。
所以,我们先看uboot文件夹到底包含了哪些内容:
Board:存放和开发板有关的文件。 U-boot 支持的每个开发板的文件,都会以子
目录的形式存放在 baord 目录下。比如我们关注的 2440 开发板,与之最相近
的目录,便是 SMDK2410 文件夹。或许,您可以将它更名为您自己的文件夹,
比如将 SMDK2410 文件夹更名为 XXX----这样,您可能会更有成就感!
Common:U-Boot 支持的所有命令,都在这个目录中实现。每个命令放在该目
录下的一个文件中。一般情况下,我们如果修改该目录下的文件代码,无非是加
一些调试信息,打开或关闭一些宏。对于该目录下的 C 代码,我们无须大幅度
修改。除非您想自己增加自己的 u-boot 命令----同样也很有成就感哦!
Cpu:这个目录下,存放的是与 cpu 架构有关的目录。每个目录对应一个架构的
cpu。比如我们想移植 ARM9 的 S3C2440,就应该去找 ARM920T 的目录。
其他目录实际上对我们是没有意义的。
Disk:这是要对磁盘的支持。我们只移植 u-boot 的话,那这个对我们也没有意义。
Doc:参考文档的意思,这是最没用的,也是最有用的。推荐想研究 u-boot 的
同学抽时间阅读一下,有好处。
Driver:u-boot 支持的所有的驱动代码,默认是放在这个目录下的。如果您需要
添加自己的驱动代码,也可以放在这里。然后再 makefile 中加入相应的.o 文件
名。
Fs:这个目录下放的是 u-boot 支持的文件系统。目前 u-boot 已经能支持包括cramfs、 fat、 fdos、 jffs2 等文件系统。
Include:这个目录下存放的是头文件。 U-boot 使用的头文件以及对各种硬件平
台的系统配置文件都放在这里。对于每款特定的开发板,我们都需要修改系统配
置文件,它存放在 include 目录下的 configs 子目录中。比如我们研究 2440
的移植,那么可能就对 SMDK2410.h 感兴趣。
Lib_xxx:这是与体系结构相关的库文件。
Net:此目录下存放的代码,是有关网络协议的实现的代码。比如 TFTP 协议的实现就在这里面。
Post:上电自检的目录。该目录,我对此一点都没有研究。
Tools:生成 u-boot 的工具的目录。比如创建 bin 镜像文件等。
韦老师书上:
在知道了这些基础之后,我们就可以开始书写或者移植uboot第一阶段的代码了,其实就是硬件初始化,为第二阶段做好准备。
既然我们要使用的cpu是arm920T构架的s3c2440,那么我们就先看cpu\arm920t目录下的start.S汇编文件。
至于为什么uboot支持那么多cpu,我们编译之后却只对应这个文件夹的这个cpu,是在于我们在之前执行的make 100ask24x0_config操作,配置了uboot支持的单板,这个在我们讲到Makefile的时候再来细说。这里先只用知道,在这个目录下,去看看这个start.S汇编文件对于启动uboot第一阶段干了什么。
一打开start.S文件,我们是既熟悉又陌生,熟悉是在裸机中我们都写过类似的代码了,陌生是,怎么一来就有一个:
.balignl 16,0xdeadbeef
这个指令好像没见过啊,那么我们就来先说说它。
首先,我们在之前的随笔中说到了,在.string "undefined instruction exception"后面,我们加入了一句:
.align 4
这让编译器内存以4对齐。因为.string后的字符串,填充内存不确定,可能会出现字符串填充之后的指令不是位于4的倍数地址处,因为在我们使用的cpu中,是4字节对齐的。如果指令在内存的位置不是4的倍数,那么就将出现问题。
那么这个和上面的.balignl有什么关系呢?
这里要说明,比如现在汇编指令在0x10001001处,后面又有一个arm指令,此时在没有加入.align 4这类代码时,编译器会把下一条指令存放在0x10001000处,向下取4的倍数,在指定了类似.align 4这类代码之后,编译器就会把下一条指令存放在0x10001004处,向上取4的倍数,这个在之前的arm裸机中已经验证过了。
.balign是意思是:以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,
在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存。
以此类推,.balignw则表示第二个参数存入的内容长度为2字节:
.balignw 4, 0x368d
因为现在填入的内容为2个字节,那就存在以下几种情况:
1>当前地址没有偏移就满足了以4为倍数的地址
2>当前地址偏移了1个字节就满足了以4为倍数的地址
3>当前地址偏移了2个字节就满足了以4为倍数的地址
4>当前地址编移了3个字节就满足了以4为倍数的地址
分析一下这四种情况:
1>当没有偏移的时候,地址中间肯定没有办法填上信息
2>当偏移1个字节的时候,地址中间空隙不够,所以填入的数值,是末定义,也就是说,填入什么值,不清楚
3>当偏移2个字节的时候,地址中间的空隙正好填入0x368d两个字节的内容
4>当偏移3个字节的时候,地址中间的空隙大于所要填的内容。此时填入的数值,是末定义,填入什么值,不清楚
以此类推,.balignl,这个指令用来填与一个字,即4个字节的长度
这可以看出,我们之前的aling 4,从当前地址取4的倍数(往上取),如果能填充,则填充0.
至少现在,我们知道,.balignl 16,0xdeadbeef是用来保证内存对齐的,0xdeadbeef是填充的数据。其实在这里我们去掉
.balignl 16,0xdeadbeef这个指令也没有关系(因为start.s中前面的指令都是4字节对齐了),但是,为了检测内存,程序员加上了这个。
Hexspeak
Hexspeak与leetspeak一样,是一种使用十六进制数字的变体英语拼写的新颖形式。由程序员创建的令人难忘的魔术数字,十六个字的单词可以作为一个清晰的唯一标识符来标记内存或数据。
十六进制符号表示使用16位0123456789ABCDEF的数字。只使用字母ABCDEF可以拼写几个单词。可以通过将一些十进制数字视为字母来进一步表达 - 数字“ 0 ”可以表示字母“O”,并且“ 1 ”可以表示字母“I”或“L”。不常见的是,“ 5 ”可以表示“S”,“ 7 ”表示“T”,“ 12 ”表示“R”,“ 6 ”或“ 9 ”可以分别表示“G”或“g”。leet或rebuses ; 例如“大便”这个词可以表示为DEFECA7E或DEFEC8。
https://en.wikipedia.org/wiki/Hexspeak维基百科
这种十六进制的英文拼写方式,存在于程序员的世界已经很久了。所以不要再觉得陌生了^_^。
这里deadbeef用于捕获内存错误,但是Start.S中开始的代码都是arm 4字节的指令,所以去掉也没关系,但是既然发现了大牛们的常用术语,就要研究琢磨一番嘛。
之后就开始进入代码阶段了,大部分代码,我们在裸机中已经写过了,所以uboot也是裸机的集大成者。也算是再次复习巩固一下之前的知识。
uboot之第一阶段的更多相关文章
- u-boot启动第一阶段
目标板:2440开发板 u-boot启动的第一阶段是在文件start.S中完成的,这个过程对不同硬件平台的设置是不同的.下面进入start.S _start: b reset //跳转到reset / ...
- 回味经典——uboot1.1.6 之 第一阶段
转自:http://blog.csdn.net/lizuobin2/article/details/52054293 最近打算移植一个比较新的 uboot 到开发板,回想起来上一次移植 uboot1. ...
- UBoot启动代码第一阶段流程
http://blog.csdn.net/xautfengzi/article/details/7470134 前段时间了看了UBoot的源码,放了一段时间之后忘得差不多了.现做一些注释,方便以后温习 ...
- uboot 2013.01 代码简析(2)第一阶段初始化
uboot执行"make smdk2410_config"之后就可以进行编译了,可以执行make命令进行编译, 因为整个输出太长,我仅仅列出部分最关键的输出(部分我不关心的内容直接 ...
- uboot启动第一阶段分析
一. uboot第一阶段初识 1.1. 什么是uboot第一阶段 1.1.1. 启动os三个阶段 1.1.1.1. bl0阶段 a. 这段代码是三星固化到iROM中,可以查看<S5PV210_i ...
- PHP四个阶段目标以及第一阶段学习内容
PHP课程体系主要分为四个阶段,第一阶段讲的是网页HTML和数据库MySQL,第一阶段要学会网页制作的基础知识,熟用各种基本标签,对数据库进行操作,各项考核都能够达标,拿出出众的项目展示. 在第二个阶 ...
- Bete冲刺第一阶段
Bete冲刺第一阶段 今日工作: github团队协作流程 web:调整dao层设计,增加新的dao组件 客户端:之前遗留的界面跳转的BUG 目前所遇问题: 第一,COCOAPODS的安装上还是有点问 ...
- java - 第一阶段总结
java - 第一阶段总结 递归 递归:能不用就不用,因为效率极低 package over; //递归 public class Fi { public static void main(Strin ...
- 自我总结(六)---(学习j2ee+j2ee第一阶段项目)
自我完善的过程就是在不断的自我总结不断的改进. 学习了Struts2 Spring Hibernate. 十天前结束了这个课程.也考试了.这次考试老师说机试考的还不错.其实就是一个简单的用户登录,进行 ...
随机推荐
- 入门程序,hello world
RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根据你给它的路由,缓冲规则进行传递消息. 一.专业术语 1. 生产者: 在现实生活中就好比制造商 ...
- Ubuntu菜鸟入门(十五)—— 安装aras2下载软件
一.安装arias2 sudo add-apt-repository ppa:t-tujikawa/ppa sudo apt-get update sudo apt-get install aria2 ...
- mongodb的serverstatus
MongoDB shell version: 2.0.5 connecting to: test { "host" : "TENCENT64.site", -- ...
- JAVA项目如何通过Docker实现Jenkins持续部署
原文地址:http://blog.51cto.com/dadonggg/1957691 本篇实操性的案例讲解——JAVA项目如何通过Docker实现持续部署(只需简单四步), 即:开发通过git pu ...
- rsync的基本使用
1,本地同步文件: rsync -avz --delete /home/ /backups/ 注意:在指定复制源时,路径是否有最后的 “/” 有不同的含义,例如: /home: 表示将整个 /home ...
- JQuery EasyUI Combobox的onChange事件
html中的select 的change事件 <select id="consult_province" name="consult_province" ...
- mysql 5.5数据库主从配置步骤详解
上次给大家介绍了mysql 5.1主从搭建配置教程,这次我们来实现mysql 5.5的主从复制,其实大体上配置是差不多的,只有点细微的差别. 系统:centos 5.x 需要的软件包:mysql-5. ...
- Linux中iptables防火墙指定端口范围
我需要700至800之间的端口都能tcp访问 代码如下 复制代码 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 7 ...
- Fiddler基础用法-抓取浏览器数据包
Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是在 ...
- 【转载并整理】mysql排序
由于oracle中有排序函数,可以使用over的语句方便排序,但是mysql中没有 这里碰到几个mysql的概念:用户变量.系统变量.if语句.函数GROUP_CONCAT 1. 可以使用定义变量(@ ...