×
嵌入式 > 嵌入式开发 > 详情

Bootloader 介绍

发布时间:2020-08-26 发布时间:
|
bootloader的定义:

相当于pc机的BIOS,在操作系统启动内核运行之前运行的一段小程序,通过这段小程序我们可以初始化cpu内部的硬件设备,建立内存空间映射范围,从而将系统的软硬件环境带到一个合适的状态,以便最终调用os内核准备好正确的环境。

可以得出bootloader主要有2个任务,1是初始化cpu内部的硬件设备,2是将os kernel带到内存中去。

在讲bootloader之前,我们先讲讲pc机的启动过程,

pc机中有bois,这个是固化在硬件的,当pc机一加电以后,bios就会自己启动,完成硬件检测和资源的分配,然后将硬盘中的引导程序调入内存,然后把控制权交给引导程序,引导程序主要的用途就是将操作系统的kernel调入内存,然后跳转到内核的开始地址,然后os就开始启动了。

就pc而言,启动的过程相对复杂,从bios--->引导程序(grub等)---->os

但是嵌入式系统来说,他没有bios这样硬件,所以它的启动过程全部都是交给bootloader去完成的。

bootloader是放在flash的最前面的位置,原因是:

系统在加电或复位的时候,所有的cpu通常都从cpu制造商预先安排地址开始执行的,(通常是0x00000000位置),所以bootloader通常是放在flash中的最前面的位置。

这是一个简易的flash分布图,bootloader在flash的最前端。

关于bootloader的启动过程还可以分为两种,1是单阶段,2是多阶段的

现在很多的bootloader是2个阶段的

stage 1 的步骤(用的是汇编)

1是初始化硬件设备(cpu内存的硬件设备)

2是初始化stage2 要使用的内存空间

3是把stage 2的代码copy到内存中去

4初始话堆栈

5是跳转到c的入口函数

stage 2(c语言)

1.初始化本阶段的硬件设备(板载硬件设备)

2.将os kernel导入到内存中去

3.调用内核

stage 1是用汇编写,主要是是为了配置能让c语言运行环境。

这个是一个具体的flash的结构图,bootloader 在执行第一个部分的时候,也就是stage1的时候,会把bootloader stage2这部分copy到ram中去运行,为什么呢,我觉得一个在内存中运行总是比在flash中执行要好,第二我觉得能执行code的flash必须是nor flash,这样的flash相对成本也就高了。所以就会产生这个部分。当stage2的时候,会将kernel也copy到内存中,然后在结束的阶段,让执行地址跳转到操作系统的入口地址,那样的话操作系统也就自己启动来了。

如果分析过2440的官方代码的话,里面有一个start.s 这个汇编代码,这可以看成一个小型的bootloader,因为他也完成了自启动的过程,不过他启动的是你的程序而不是操作系统,不过作用很相似。

在上面我们知道bootloader stage1这个阶段的代码是运行在flash中的,如果flash是nor flash的话也是可以的,不过如果你的开发板是不带nor flash的话则就不能了。nand flash是不能让代码运行在flash的,所以他的自启动过程是比较复杂的。他的cpu有一个4k ram 在加电的时候是被当作垫脚石使用的,当板子加电以后,硬件会自动把flash最前面的code copy到这个内存中的,也就是bootloader stage1这个部分,在这4kB的空间中的代码必须要完成讲代码copy的内存中去

对于bootloader的研究我觉得可以看一下start.s这个源代码,你会知道的更加清楚,不过是汇编的,理解起来会有点困难,要耐心看的.....

还有关于bootloader的移植,为什么要进行bootloader的移植呢,原因有2个

1是因为不同的板子之间的cpu体系结构不一样...

2是因为不同的板子之间的外围硬件设备不一样...



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
发明专利在疫情影响下的逆势增长