BootLoader的启动流程
标签(空格分隔): Linux
BootLoader的启动流程
completelyBootLoader的第⼀阶段通常包含以下步骤(以执⾏的先后顺序):
硬件设备初始化
为加载 Boot Loader的stage2准备RAM空间。
拷贝Boot Loader的stage2到RAM空间中。
设置好堆栈。
cet6考试时间跳转到stage2 的 C ⼊⼝点。
BootLoader的第⼆阶段通常包括以下步骤(以执⾏的先后顺序):
初始化本地阶段要使⽤到的硬件设备
检测系统内存映射(memory map)
将kernel映像和根⽂件系统映像从flash上读到RAM空间中。
family为内核设置启动参数
调⽤内核
1. Boot Loader的stage1
1. 基本的硬件初始化
这是Boot Loader ⼀开始就执⾏的操作,其⽬的是为stage2的执⾏以及随后的kernel的执⾏准备好⼀些基本的硬件环境。它通常包括以下步骤(以执⾏的先后顺序):
中秋节英语翻译1. 屏蔽所有的中断。为中断提供服务器通常是OS设备驱动程序的责任,因此在Boot Loader的执⾏全过程中可以不必响
应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(⽐如ARM的CPSR寄存器)来完成。
gj
汉译英在线翻译句子
2. 设置CPU的速度和时钟频率。
3. RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存控制寄存器等。
4. 初始化LED。典型地,通过GPIO来驱动LED,其⽬的是表明系统的状态是OK还是Error。如果板⼦上没有LED,那么
也可以通过初始化UART向串⼝打印Boot Loader的Logo字符信息来完成这⼀点。
5. 关闭CPU内部指令/数据 cache。
2. 为加载 stage2 准备 RAM 空间
为了后⾯的叙述⽅便,这⾥把所安排的RAM空间范围的⼤⼩记为:stage2_size(字节),把起始地址和终⽌地址分别记为: stage2_start 和stage2_end (这两个地址均以4字节边界对齐)。
red dawn
因此:
wreckingstage2_end = stage2_start + stage2_size
另外,还必须确保所安排的地址范围的的确确是可读写的RAM空间,因此,必须对你所安排的地址范
围进⾏测试。
3. 拷贝stage2到RAM中
拷贝时要确定两点:
1. stage2的可执⾏映像在固态存储设备的存放地址和终⽌地址。
oolong tea
2. RAM空间的起始地址。
4. 设置堆栈指针sp
堆栈指针的设置是为了执⾏ C 语⾔代码作为准备。通常我们可以把sp的值设置为(stage2_end - 4), 也即在上⾯所安排的那个1MB的RAM空间的最顶端(堆栈向下⽣长)。
此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提⽰⽤户我们准备跳转到stage2。经过上述这些执⾏步骤后,系统的物理内存布局应该如下图。
image_1bqvi1l5bpur1hqf187i12mg1u0k9.png-159.6kB
image_1bqvi1l5bpur1hqf187i12mg1u0k9.png-159.6kB
5. 跳转到 stage2 的 C ⼊⼝点
在上述⼀切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执⾏了。⽐如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。
2. Boot Loader 的 stage2
1. 初始化本阶段要使⽤到的硬件设备
这通常包括:
1. 初始化⾄少⼀个串⼝,以便和终端⽤户进⾏I/O输出信息
2. 初始化计时器等。在初始化这些设备之前,也可以重新把LED灯点亮,以表明我们已经进⼊ main() 函数执⾏。设备初
始化完成后,可以输出⼀些打印信息,程序名字字符串、版本号等。
2. 检测系统的内存映射 (memory map)
多哈回合谈判所谓内存映射就是指在整个4GB物理地址空间中有哪些地址范围被分配⽤来寻址系统的RAM单元。
⽐如,在SA-1100 CPU中,从0xC000,0000开始的512地址空间被⽤作系统的RAM地址空间,⽽在 Samsung S3C44B0X CPU中,从
0x0c00,0000到0x1000,0000之间的64M地址空间被⽤作系统的RAM地址空间。
虽然 CPU 通常预留出⼀⼤段⾜够的地址给系统RAM,但是在搭建具体的嵌⼊式系统时不⼀定会实现 CPU 预留的全部 RAM 地址空间。
3. 加载内核映像和根⽂件系统映像
1. 规划内存占⽤的布局
这⾥包括两个⽅⾯:内核映像所占⽤的内存范围;根⽂件系统所占⽤的内存范围。在规划内存占⽤的布局时,主要考虑基地址和映像的⼤⼩两个⽅⾯。