第一篇博客 分析bootloader详解;
2017-06-11 19:21
274 查看
注:本人还是嵌入式领域的菜鸟,写博客只是为了让自己对知识理解更深刻。我还在不断学习,如果 博客中有什么不对的敬请指教~
第一篇博客,先讲一讲自己最近的生活状态吧;毕业一年,工作一年,感觉自己在嵌入式这方面完全荒废了。今天很早就下定决心好好分析一下bootloader.今天终于开动了;
bootloader 启动流程分为两个阶段:第一阶段,第二阶段;
第一阶段主要工作内容:(问:这里为什么主要是汇编代码而不是C语言?答:汇编代码执行速度比较快)
1.硬件设备初始化;(设置cpu 工作模式, 关闭看门狗 关中断 设置 CPU的速度和时钟频率 RAM初始化等等)
2.为加载bootloader 的第二阶段代码准备空间;
3.复制bootloader的第二价段代码到RAM中;
4.设置好栈;(问:这里为什么要设置好栈?答:下个步骤是跳转c代码,C语言运行需要有栈空间,)
5.跳转到第二阶段代码的C入口点;
第二阶段主要工作内容:
1.初始化硬件设备;
2.检测系统内存映射;
3.将内核映像和根文件系统映像从flash读到ARM中;
4.为内核设置启动参数;
5.调用内核
在调用内核之前必须满足以下 条件:
1.cpu集训器的设置;
R0 = 0;
R1=机器ID 类型;机器ID可以参见linux/arch/arm/tools/mach-types
2.设置cpu工作模式;
在汇编代码中的实现方式:
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr /* copy cpsr to r0*/
bic r0,r0,#0x1f /*位清除 */
orr r0,r0,#0xd3 /* orr 或指令 */
msr cpsr,r0
/*cprs最后结果 = 110 10011
禁止快中断
禁止中断
处于ARM 模式
处于SVC32 模式
*/
3.MMU 必须关闭;数据cach必须关闭;指令cach可以关闭也可以不关闭;
——————————————————————————————————————————————————————————————
bootloader执行的第一个文件是\cpu\arm920t\start.s (问:为什么是这个文件?从哪里指定的?答:在链接文件中可以看到)
.globl
_start 含义
globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号(在第 5.1 节 “目标文件”详细解释)。_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。
第一篇博客,先讲一讲自己最近的生活状态吧;毕业一年,工作一年,感觉自己在嵌入式这方面完全荒废了。今天很早就下定决心好好分析一下bootloader.今天终于开动了;
bootloader 启动流程分为两个阶段:第一阶段,第二阶段;
第一阶段主要工作内容:(问:这里为什么主要是汇编代码而不是C语言?答:汇编代码执行速度比较快)
1.硬件设备初始化;(设置cpu 工作模式, 关闭看门狗 关中断 设置 CPU的速度和时钟频率 RAM初始化等等)
2.为加载bootloader 的第二阶段代码准备空间;
3.复制bootloader的第二价段代码到RAM中;
4.设置好栈;(问:这里为什么要设置好栈?答:下个步骤是跳转c代码,C语言运行需要有栈空间,)
5.跳转到第二阶段代码的C入口点;
第二阶段主要工作内容:
1.初始化硬件设备;
2.检测系统内存映射;
3.将内核映像和根文件系统映像从flash读到ARM中;
4.为内核设置启动参数;
5.调用内核
在调用内核之前必须满足以下 条件:
1.cpu集训器的设置;
R0 = 0;
R1=机器ID 类型;机器ID可以参见linux/arch/arm/tools/mach-types
2.设置cpu工作模式;
在汇编代码中的实现方式:
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr /* copy cpsr to r0*/
bic r0,r0,#0x1f /*位清除 */
orr r0,r0,#0xd3 /* orr 或指令 */
msr cpsr,r0
/*cprs最后结果 = 110 10011
禁止快中断
禁止中断
处于ARM 模式
处于SVC32 模式
*/
3.MMU 必须关闭;数据cach必须关闭;指令cach可以关闭也可以不关闭;
——————————————————————————————————————————————————————————————
bootloader执行的第一个文件是\cpu\arm920t\start.s (问:为什么是这个文件?从哪里指定的?答:在链接文件中可以看到)
.globl
_start 含义
globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号(在第 5.1 节 “目标文件”详细解释)。_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。
相关文章推荐
- mini2440启动代码分析之第一篇(注意名字,不是bootloader)
- (转) U-boot在开发板上移植过程详解--bootloader架构分析
- (二)U-boot在开发板上移植过程详解--bootloader架构分析
- U-boot在开发板上移植过程详解--bootloader架构分析
- A星算法详解——我的第一篇博客从续写转载开始
- 阿里巴巴的Vlayout框架源码原理详解(第一篇流程分析)
- U-boot在开发板上移植过程详解--bootloader架构分析
- Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/
- Android Sensor详解(8)sensor hal层分析第一篇
- U-boot在开发板上移植过程详解(1)---bootloader架构分析
- (二)U-boot在开发板上移植过程详解--bootloader架构分析
- 我国博客研究现状的实证分析
- wav文件格式分析详解
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 关于J2EE层次设计架构实例的分析详解
- 第一篇博客,开篇纪念
- 第一篇博客
- 我的博客 第一篇