BootLoader的启动流程

更新时间:2023-05-24 03:18:48 阅读: 评论:0

走向明天-达芬奇画蛋的故事

BootLoader的启动流程
2023年5月24日发(作者:税额的计算公式)

BootLoader的启动流程

标签(空格分隔): Linux

BootLoader的启动流程

BootLoader的第⼀阶段通常包含以下步骤(以执⾏的先后顺序):

硬件设备初始化

为加载 Boot Loader的stage2准备RAM空间。

拷贝Boot Loader的stage2到RAM空间中。

设置好堆栈。

跳转到stage2 的 C ⼊⼝点。

BootLoader的第⼆阶段通常包括以下步骤(以执⾏的先后顺序):

初始化本地阶段要使⽤到的硬件设备

检测系统内存映射(memory map)

将kernel映像和根⽂件系统映像从flash上读到RAM空间中。

为内核设置启动参数

调⽤内核

1. Boot Loader的stage1

1. 基本的硬件初始化

这是Boot Loader ⼀开始就执⾏的操作,其⽬的是为stage2的执⾏以及随后的kernel的执⾏准备好⼀些基本的硬件环境。它通常包括以下步骤

(以执⾏的先后顺序):

1. 屏蔽所有的中断。为中断提供服务器通常是OS设备驱动程序的责任,因此在Boot Loader的执⾏全过程中可以不必响

应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(⽐如ARM的CPSR寄存器)来完成。

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字节边界对齐)。

因此:

stage2_end = stage2_start + stage2_size

另外,还必须确保所安排的地址范围的的确确是可读写的RAM空间,因此,必须对你所安排的地址范围进⾏测试。

3. 拷贝stage2到RAM中

拷贝时要确定两点:

1. stage2的可执⾏映像在固态存储设备的存放地址和终⽌地址。

2. RAM空间的起始地址。

4. 设置堆栈指针sp

堆栈指针的设置是为了执⾏ C 语⾔代码作为准备。通常我们可以把sp的值设置为(stage2_end - 4), 也即在上⾯所安排的那个1MB的RAM空间

的最顶端(堆栈向下⽣长)。

此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提⽰⽤户我们准备跳转到stage2。经过上述这些执⾏步骤后,系统的物理内存布局应该

如下图。

image_-159.6kB

image_-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. 规划内存占⽤的布局

这⾥包括两个⽅⾯:内核映像所占⽤的内存范围;根⽂件系统所占⽤的内存范围。在规划内存占⽤的布局时,主要考

虑基地址和映像的⼤⼩两个⽅⾯。

2. 从 Flash 上拷贝

由于像 ARM 这样的嵌⼊式CPU通常都是在统⼀的内存地址空间中寻址Flash等固态存储设备的,因此从Flash上读取

数据与从 RAM 单元中读取数据并没有什么不同。

⽤⼀个简单的循环就可以完成从Flash设备上拷贝映像的⼯作:

while(count){

*dest++ = *src++; /*都是以字节⽅式对齐*/

count -= 4; /*字节数*/

};

4. 设置内核的启动参数

应该说,在将内核映像和根⽂件系统映像拷贝到 RAM 空间中后,就可以准备启动 Linux 内核了。

但是在调⽤内核之前,应该作进⼀步准备⼯作,即:设置Linux内核的启动参数。

5. 调⽤内核

Boot Loader 调⽤ Linux 内核的⽅法是直接跳转到内核的第⼀条指令处,也即直接跳转到 MEM_START+0x8000 地址处。

教育学专业-中华好家风征文

BootLoader的启动流程

本文发布于:2023-05-24 03:18:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/168486952851870.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:BootLoader的启动流程.doc

本文 PDF 下载地址:BootLoader的启动流程.pdf

标签:bootloader
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|