BootLoader_BootLoader是什么
。
跳转到stage2的C入口点。
BootLoader的stage2通常包括以下步骤(以执行的先后顺序):
初始化本阶段要使用到的硬件设备。
检测系统内存映射(memorymap)。
将kernel映像和根文件系统映像从flash上读到RAM空间中。
为内核设置启动参数。
调用内核。
3.1BootLoader的stage1
3.1.1基本的硬件初始化
这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):
屏蔽所有的中断。为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。
设置CPU的速度和时钟频率。
RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。
初始化LED。典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。
关闭CPU内部指令/数据cache。
3.1.2为加载stage2准备RAM空间
为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载BootLoader的stage2准备好一段可用的RAM空间范围。由于stage2通常是C语言执行代码,因此在考虑空间大小时,除了stage2可执行映象的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是memorypage大小(通常是4KB)的倍数。一般而言,1M的RAM空间已经足够了。具体的地址范围可以任意安排,比如blob就将它的stage2可执行映像安排到从系统RAM起始地址0xc0200000开始的1M空间内执行。
但是,将stage2安排到整个RAM空间的最顶1MB(也即(RamEnd-1MB)-RamEnd)是一种值得推荐的方法。
为了后面的叙述方便,这里把所安排的RAM空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start和stage2_end(这两个地址均以4字节边界对齐)。因此:stage2_end=stage2_start+stage2_size
另外,还必须确保所安排的地址范围的的确确是可读写的RAM空间,因此,必须对你所安排的地址范围进行测试。
具体的测试方法可以采用类似于blob的方法,也即:以memorypage为被测试单位,测试每个memorypage开始的两个字是否是可读写的。为了后面叙述的方便,我们记这个检测算法为:test_mempage,其具体步骤如下:
先保存memorypage一开始两个字的内容。
向这两个字中写入任意的数字。比如:向第一个字写入0x55,第2个字写入0xaa。
然后,立即将这两个字的内容读回。显然,我们读到的内容应该分别是0x55和0xaa。如果不是,则说明这个memorypage所占据的地址范围不是一段有效的RAM空间。
再向这两个字中写入任意的数字。比如:向第一个字写入0xaa,第2个字中写入0x55。
然后,立即将这两个字的内容立即读回。显然,我们读到的内容应该分别是0xaa和0x55。如果不是,则说明这个memorypage所占据的地址范围不是一段有效的RAM空间。
恢复这两个字的原始内容。测试完毕。
为了得到一段干净的RAM空间范围,我们也可以将所安排的RAM空间范围进行清零操作。
更多资讯请关注:21ic模拟频道
BootLoader_BootLoader 相关文章:
- 12位串行A/D转换器MAX187的应用(10-06)
- AGC中频放大器设计(下)(10-07)
- 低功耗、3V工作电压、精度0.05% 的A/D变换器(10-09)
- PIC16C5X单片机睡眠状态的键唤醒方法(11-16)
- 用简化方法对高可用性系统中的电源进行数字化管理(10-02)
- 利用GM6801实现智能快速充电器设计(11-20)