uboot源码分析1-启动第一阶段
来源:互联网 发布:乱藤四郎极化数据 编辑:程序博客网 时间:2024/06/06 03:29
start.S引入
(2)在uboot中因为有汇编阶段参与,因此不能直接找main.c。整个程序的入口取决于链接脚本中27行ENTRY声明的地方。ENTRY(_start)因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
(2)利用SI工具搜索到一共7个_start,
(1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。
(2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我们要怎样找到并打开这个文件?方法是在SI中先打开右边的工程项目管理栏目,然后点击最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名字。我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记得名字,也能帮助你找到你要找的文件。
start.S解析1
echo "#include <configs/$1.h>" >>config.h
$(@:_config=) arm s5pc11x x210 samsung s5pc110
x210_sd_config里的_config部分用空替换,得到:x210_sd,这就是第一个参数,所以:
$1: x210_sd
$2: arm
$3: s5pc11x
$4: x210
$5: samsumg
$6: s5pc110
所以,$# = 6
.S文件和CPU架构(和硬件)有关了,可移植性就差了。
start.S解析2
关于ARM的异常:
1.什么是异常:
2.怎样处理:
(1) 关于异常向量表:
(2) 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的
(3) 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作)
(4) 异常向量表是硬件向软件提供的处理异常的支持
2、处理机制:
- 拷贝 CPSR到 SPSR_<mode>
- 设置适当的CPSR位:
、改变处理器状态进入ARM
、改变处理器模式进入相应异常模式
、设置中断禁止位禁止相应中断(如果需要)
- 保存返回地址到 LR_<mode>
- 设置PC为相应的异常变量
4、 返回时,异常处理需要:
- 从SPSR_<mode>恢复CPSR
- 从LR_<mode>恢复PC
- Note:这些操作只能在ARM态执行
(3)为什么要对齐访问?有时候是效率的要求,有时候是硬件的特殊要求。
(2)源代码中和配置Makefile中很多变量是可以互相运送的。简单来说有些符号的值可以从Makefile中传递到源代码中。
start.S解析3
1.
所以CFG_PHY_UBOOT_BASE 为0x33e00000,uboot在DDR中的物理地址;
而我们前面指定的链接地址为0xc3e00000;这是虚拟地址;
其实这两个就是一个地址,即虚拟地址映射。后面会讲~
2.设置CPU为SVC模式
gnu汇编中的一些符号:
1.@用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似2. #做注释,一般放在行首,表示这一行都是注释而不是代码
3. :以冒号结尾的是标号
4. .点号在gnu汇编中表示当前指令的地址
5. #立即数前面要加#或$,表示这是个立即数
--------------------------------------------------------------------------------------------------------------------
补充:
mrs & msr
cpsr 和 spsr的区别和联系:
cpsr是程序状态寄存器,整个SoC中只有一个;
spsr是程序状态保存寄存器,有5个分别在5种异常模模式下,作用是当从普通模式进入异常模式时,
用来保存之前普通模式下的spsr,以在返回普通模式时恢复原来的cpsr
注:
1.mrs 用来读psr, msr用来写psr(cpsr、spsr)
2.cpsr寄存器比较特殊,需要专门的指令访问,这就是mrs和msr
--------------------------------------------------------------------------------------------------------------------
(3)其实ARM CPU在复位时默认就会进入SVC模式,但是这里还是使用软件方法将其置为SVC模式-(不依赖硬件的预先设置)。整个uboot工作时CPU一直处于SVC模式。
3.设置L2、L1cache和MMU
(2)bl set_l2cache_auxctrl_cycle// l2 cache相关初始化
(3)bl enable_l2cache// 使能l2 cache
(4)刷新L1 cache的icache和dcache。
(5)关闭MMU
总结:上面这5步都是和CPU的cache和mmu有关的,不用去细看,大概知道即可。
(2)实际上在210内部有一个寄存器(地址是0xE0000004),这个寄存器中的值是硬件根据OM引脚的设置而自动设置值的。这个值反映的就是OM引脚的接法(电平高低),也就是真正的启动介质是谁。
(3)我们代码中可以通过读取这个寄存器的值然后判断其值来确定当前选中的启动介质是Nand还是SD还是其他的。
- uboot源码分析1-启动第一阶段
- 2.5.uboot源码分析1-启动第一阶段
- uboot源码分析-启动第一阶段
- uboot启动第一阶段分析
- uboot启动第一阶段详细分析
- uboot - 启动流程分析【第一阶段】
- uboot分析之第一阶段源码
- uboot——启动第一阶段分析
- uboot启动分析第一阶段(start.S)
- uboot第一阶段启动流程
- 001.1 - uboot启动 [ 第一阶段 ]
- U-Boot启动过程源码分析(1)-第一阶段
- uboot第一阶段详细分析
- uboot第一阶段详细分析
- uboot第一阶段详细分析
- uboot第一阶段详细分析
- uboot第一阶段详细分析
- uboot第一阶段详细分析
- 图吧助力座头鲸手机导航APP如虎添翼
- one-hot编码
- Android提示自动更新
- java系统高并发解决方案
- PC和Android adb通信
- uboot源码分析1-启动第一阶段
- 开发中添加对象属性
- 不四舍五入,保留指定小数位数
- linux笔记整理
- 15级楼梯,一步最多三级,爬上楼梯可以有多少种走法实现
- Java面试题目
- [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突
- wemall app商城源码Android之支付宝接口RSA函数
- 基于注解的SpringMVC简单介绍