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_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. 规划内存占用的布局
    这里包括两个方面:内核映像所占用的内存范围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。
  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 地址处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容