标签:
stage2:
1.初始化本阶段要使用的硬件设备:
通常包括两方面:
1)初始化至少一个串口,以便和终端用户进行I/O输出信息。
2)初始化计时器等
2.检测系统的内存映射
内存映射就是指在整个4GB物理地址空间中有哪些地址被分配用来寻址系统的RAM单元。必须知道CPU预留的全部RAM地址空间中的哪些被真正映射到RAM地址单元,哪些处于"unused状态。
使用数据结构体memory_area_struct来描述RAM地址空间中的一段连续的地址范围
处有一个可用来检测整个RAM地址空间内存映射情况的简单而有效的算法。(具体研究此算法需要另看别的书)
3.加载内核映像和根文件系统映像
有两个工作要做:
1)规划内存占用的布局。包括两个方面:内核映像所占用的内存范围、根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。
2)从flash上复制。由于像ARM这样的嵌入式CPU通常都在统一的内存空间地址中寻址flash等固态存储设备的,因此从flash上读取数据与从RAM单元中读取数据并没有什么不同。用一个简单的循环就可以完成从flash设备上复制映像的工作
while(count)
{
*dest++=*src++;
count -= 4;//arm 是4字节的,由总线决定的。
}
4.设置内核的动参数
即设置linux内核的启动参数。
数据结构tag和tag_header定义在linux内核源码的include/asm/setup.h头文件中。(这里面大有文章)
5.调用内核
Boot Loader调用Linux内核的方法是直接跳转到内核的第一条指令处,跳转需要满足的条件:
1)CPU寄存器的设置:R0=0;
(具体参看内核代码文件:linux/arch/arm/tools/mach --types)
2)CPU模式:必须禁止中断(IRQs和FIQs),同时必须应该是SVC模式(特权模式,可以访问更多的硬件资源)。
3)Cache和MMU的设置:MMU必须关闭;指令Cache可以打开也可以关闭;数据cache必须关闭。
标签:
原文地址:http://www.cnblogs.com/wang1994/p/5481221.html