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去执行了