BootLoader 详解(2)
BootLoader的stage1
1.基本的硬件初始化
这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。它通 常包括以下步骤
①屏蔽所有中断。为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不比响应任何中断。中 断屏蔽可以通过写CPU的中断屏蔽寄存器或者状态寄存器(比如ARM的CPSR寄存器)来完成。
②设置CPU的时钟和频率
③RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等
④初始化LED。通过GPIO来驱动LED,其目的是表明系统的状态是OK还是ERROR。如果板子没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。
⑤关闭CPU内部 指令/数据 Cache。
2.为加载stage2准备RAM空间
通常把stage2加载到RAM空间中来执行,为了获得更快的执行速度。因此必须为加载BootLoader的stage2准备好一段可用的RAM空间。
stage2是C语言执行代码,因此在考虑空间大小时,除了stage2可执行映像的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是momery page大小(通常是4KB)的倍数。一般而言,1M的RAM空间就足够了。具体的范围地址可以任意安排,比如blob就将它的stage2可执行映像安排到从系统RAM起始地址0xc0200000开始的1M空间内执行。但是,将stage2安排到整个RAM空间的最顶1MB(RamEnd-1MB ~ RamEnd )是一种值得推荐的方法。
另外,得确保所有安排的地址范围是可读写的RAM空间,因此,必须对你所安排的地址范围进行测试。具体测试方法可以采用类似blob的方法,也即:以memory page 为被测试单位,测试每个memory page 开始的两个字是否可读写。步骤如下:
①.先保存memory page一开始的两个字的内容。
②.向这两个字中写入任意的数字。比如第一个字写0x55第二个字写入0xaa
③.然后立即将这两个字读回。如果读到的内容不是0x55和0xaa,说明这个memory page 所占据的地址范围不是一段有效的RAM
④.再向这两个字中写入任意数字,比如0xaa和0x55
⑤.读取这两个字,如果不是0xaa和0x55那么说明这个memory page 所占据的地址空间不是一段有效的RAM。
⑥.恢复这两个字的内容,测试完毕。
3.拷贝stage2到RAM中
确定2点:①.stage2的可执行映像在固态设备存放的起始地址和终止地址
②.RAM空间的起始地址
4.设置堆栈指针sp
堆栈指针的设置是为了执行C语言代码做好准备。通常可以把sp的值设置为( stage2_end - 4 ),也就是第二节所安排的那个1MB的RAM空间的最顶端(堆栈向下生长)。经过这些步骤后,系统的物理内存布局如下:
5.经过上述的步骤后,就跳转到stage2去执行了
BootLoader 详解(2)的更多相关文章
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- BootLoader 详解(1)
1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...
- BootLoader 详解(3)
BootLoader的stage2 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性.它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时, ...
- CFE Bootloader详解 — 引导过程
CFE命令 CFE引导过程 系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型.设置时钟.初始化缓存.把自身加载进RAM等任务后,跳转到c_main() ...
- 【转载】 硬盘主引导记录(MBR)及其结构详解
硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...
- uboot mkimage使用详解
mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...
- 引用 mkimage使用详解
引用 鱼 的 mkimage使用详解 uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...
- Android的init过程详解(一)
Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...
- 黑苹果引导工具 Clover 配置详解及Clover Configurator使用
黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可 ...
随机推荐
- ;function($,undefined) 前面的分号是什么用处
;function($,undefined) 前面的分号是什么用处 ;(function($){$.extend($.fn...现般在一些 JQuery 函数前面有分号,在前面加分号可以有多种用途:1 ...
- LintCode Search For a Range (Binary Search)
Binary Search模板: mid 和 target 指针比较,left/ right 和 target 比较. 循环终止条件: 最后剩两数比较(while(left + 1 < righ ...
- linux与windows的不同
linux 严格区分大小写:linux 所有内容都以文件形式保存,包括用户和硬件:linux 不以文件后缀名来区分文件类型:但有一些便于管理员区分文件类型的约定俗称的后缀:windows下的程序不能直 ...
- |原创|unity 4.3 2D功能SpriteRenderer修改颜色的方法
4.3增加了不少2D功能,然后实在没有找到有人分享,在国外查资料研究一下午然后给个简单的教程 ===================================================== ...
- iOS红马甲项目Bug总结(3)
这里是一些小总结 1.使用图片缓存之后,新添加的图像一直不能显示 2.项目打包通过appliction loader上传成功了,可是itunes 上面的构建版本项,一直没显示出来 3.界面加载之后,t ...
- MapReduce简介
MapReduce简介 参考自[http://www.cnblogs.com/swanspouse/p/5130136.html] MapReduce定义: MapReduce是一种可用于数据处理的编 ...
- SSAS处理时“找不到属性键”的解决办法 (转载)
在SSAS中,经常会遇到“Attribute key not found(找不到属性键)”的错误,这种错误通常是由于某个维度属性(Dimension Attribute)的数据没能从Sql Serve ...
- [solr] - 环境搭建2
前面使用Tomcat搭建solr,参考文章: http://www.cnblogs.com/HD/p/3977799.html 原来solr可以不使用tomcat/jboss等服务器,它自身已经集成了 ...
- LeetCode "Valid Perfect Square"
Typical binary search.. but take care of data overflow if you are using C++ class Solution { public: ...
- Spring MVC小结
Spring MVC项目搭建 添加依赖 (省略) Spring MVC配置类 @Configuration @EnableWebMvc @ComponentScan("com.sjx.spr ...