嵌入式Bootloader简介
Bootloader又称引导加载程序,是系统上电运行的第一段软件代码,是整个形同执行的第一步。
PC机系统中引导加载程序是由BIOS和位于硬盘MBR中的OS Bootloader完成的,OS Bootloader 常见的有LILO和GRUB等。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Bootloader 读到系统的RAM中,然后将控制权交给OS Bootloader。Bootloader的主要运行任务就是将内核映像从硬盘上读到RAM中,然后跳转到内核的入口处去运行,也即启动操作系统。
嵌入式系统中的Bootloader不仅要将内核映像从硬盘读到RAM中,还要完成硬件检测和资源分配 ,不论是否使用操作系统,都必须运行Bootloader。
嵌入式系统软件架构可以分为四个层次,从底层往上层为:
引导加载程序: 固化在Flash上的一段引导代码,用于完成硬件的一些基本配置,引导嵌入式操作系统内核启动。
嵌入式操作系统内核: 包括特定于某嵌入式硬件平台的定制操作系统内核以及内核的启动参数等。
文件系统 : 包括根文件系统和建立于Flash内存设备上的 文件系统。通常用ram disk或yaffs作为文件系统,包括固化在固件的boot(可选)和Bootloader两大部分。
用户应用程序 :特定于用户的应用程序,有时在用户应用层和内核层之间有可能还包括一些嵌入式图形用户界面。
Bootloader包含了两种不同的操作模式:
启动加载模式(Bootloading)又称自主模式,是指Bootloader从目标上的某个固件存储设备上将操作系统加载到RAM中运行,整个过程没有用户介入这就是正常工作的启动模式。
下载模式(Downloading)下,目标机上的Bootloader将通过串口或者网络或者USB等其他通信手段从主机下载文件,比如下载内核镜像、根文件系统镜像等,从主机下载的文件通常首 先被Bootloader保存到目标机的RAM中,然后被Bootloader写到目标机的Flash内固态存储设备中。这种模式一般在第一次安装内核与根文件系统时使用,系统更新也会使用这种模式。
Bootloader的启动方式一般有三种:
网络启动方式:Bootloader通过以太网接口远程下载Linux内核映像或者文件系统,使用这种启动方式之前,需要把Bootloader安装到板子上的EPPROM或者Flash中。交叉开发环境就是以网络启动方式建立的,但是以这种方式启动目标板必须要有串口、以太网接口或者其他连接方式。串口一般作为控制台用来下载内核影像文件和ARMDISK文件系统。但串口通信传输速率过低不适合用来挂接NFS文件系统,所以以太网接口成为通用设备。另外要在服务器上配置启动相关网络服务,Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。DHCP/BOOTP服务为Bootloader分配IP地址,配置网络参数,才能支持网络传输功能。如果Bootloader可以直接设置网络参数,就可以不使用DHCP,而是用TFTP服务,把内核映像和其他文件放在指定目录下,Bootloader通过简单的TFTP协议远程下载内核映像到内存。
磁盘启动方式:磁盘启动方式主要用在PC机 的BIOS中,计算机一般使用BISO引导,并且使用磁盘作为存储介质。如果进入BIOS设置菜单,可以探测处理器、内存、硬盘等设备。可以设置BIOS从软盘、光盘或者某块硬盘启动,然后在硬盘的主导区中的Bootloader可以通过磁盘方式从磁盘文件系统中把操作系统引导起来。
Flash启动方式有两种:以后总是直接从Flash启动,另一种是将压缩的内存映像文件从Flash(为了节省Flash资源、提高速度)中复制、解压到RAM,再从RAM启动。FLASH 的介质有很多类型,包括NOR FLASH、NAND FLASH,其中最为普遍的是NOR FLASH。NOR FLASH支持随机访问可以直接在Flash上执行,Bootloader一般存储在Flash芯片上,linux内核映像和RAMDISK也是存在Flash上的,通常需要吧Flash分区使用,每个区的大小应该是Flash擦除的大小的整数倍。Bootloader一般放在Flash的顶端或者底端,这是根据处理器的复位向量设置的,使Bootloader处于上电执行的第一条指令的位置,接下来是分配参数区,在下来是内核映射像区。Bootloader引导linux内核,从这个地方把内核映像解压到RAM中,然后跳转到内核映像入口执行。最后是文件系统区,如果Ramdisk文件系统,则需要Bootloader把它解压到RAM中;如果使用YAFFS2文件系统,将直接挂接为根文件系统。
Bootloader的流程:
打开电源时,系统会去执行ROM(较多的是Flash)里面的Bootloader启动代码。代码是用来初始化电路以及用来为高级语言编写的软件做好运行前准备的一小段汇编语言,在商业机实时操作系统中,启动代码部分一般称为板级支持包,英文缩写为BSP。Bootloader启动的具体流程的主要过程如下:
(1)启动代码的第一步是设置中断和异常向量。
(2)完成系统启动所必须的最小配置,某些处理芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置。
(3)设置看门狗,用户设计的部分外围电路必须在系统启动时初始化,就可以发放在这一部。
(4)配置系统所使用的存储器,包括Flash、SRAM和DRAM等,并为它分配空间。如果系统使用了DRAM或其他外设,就需要设置相关的寄存器,以确定其刷新频率、数据总线宽度等信息,并初始化存储器系统。
(5)为处理器的每个工作模式设置栈指针,ARM处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。
(6)变量初始化,指赋值好的全局变量,启动过程中需要将这部分变量从只读区域(Flash)复制到读写区域,因为程序运行中可能会重新赋值。还有一些不需要修改的可以直接固化在只读的Flash或EEPROM中。
(7)数据区准备,在软件中所有未赋初始值的全局变量,启动过程中需要将这部分变量所在的区域全部清零。
(8)最后一部调用高级语言入口函数,比如main函数等。系统代码完成软硬件环境初始化后,在有操偶作系统的情况下,启动操作系统、启动内存管理、设置任务调度、加载驱动程序等,最后执行应用程序或等待用户命令,对于没有操作系统的系统,直接执行应程序或等待用户命令。
本文地址:https://blog.csdn.net/u010068160/article/details/109565622
下一篇: IP分配及网段划分