Bootloader和BIOS、Grub、uboot区别

Linux研究

一个嵌入式系统从软件角度来看分为三个层次(如上图):

1.引导加载程序

包括固化在固化中的boot程序(可选),和BootLoader两大部分

2.linux内核

特定于嵌入式平台的定制内核

3.文件系统

包括了系统命令和应用程序

--------------------------------------------------------------------------------

 BootLoader-->Boot Parameters-->Kernel-->Root Filesystem 

   1、Bootloader和BIOS

BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。桌面电脑加电后BIOS会获取处理器控制权,是一个复杂的系统配置软件,它拥有硬件架构的底层信息。BootLoader是一段小程序,可以把它想象成PC机Linux上的GRUB/LILO引导程序,只不过在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。在典型的嵌入式系统中(虽说是在嵌入式操作系统中的概念,但规定没这么严格,向ntloader、bootmgr一般也称作BootLoader),引导加载程序(bootloader)完成与BIOS相同的功能,具有如下特点:

       1)嵌入式系统中在操作系统内核运行前运行的程序;

       2)可以分为单阶段的BootLoader和多阶段的BootLoader,一般从从固态存储设备上启动的Bootloader大多都是 2 阶段的启动过程,如uboot是2阶段的,grub就是单阶段的;

       一般而言,这两个阶段完成的功能可以如下分类,但这不是绝对的:

(1)Bootloader第一阶段的功能。

硬件设备初始化。

为加载Bootloader的第二阶段代码准备RAM空间。

拷贝Bootloader的第二阶段代码到 RAM 空间中。

设置好栈。

跳转到第二阶段代码的C入口点。

在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必需的,比如S3C2410/S3C2440的开发板所使用的U-Boot中,就将CPU的速度和时钟频率的设置放在第二阶段。甚至,将第二阶段的代码复制到RAM空间中也不是必需的,对于NOR Flash等存储设备,完全可以在上面直接执行代码,只不过这相比在RAM中执行效率大为降低。

(2)Bootloader第二阶段的功能。

初始化本阶段要使用到的硬件设备。

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

将内核映像和根文件系统映像从Flash上读到RAM空间中。

为内核设置启动参数。

调用内核。

--------------------------------------------------------

为什么需要进行bootloader移植?

答:1.因为每种不同的CPU体系结构都有不同的BootLoader

2.BootLoader依赖于具体的嵌入式板级设备的配置

--------------------------------------------------------------------------------

BootLoader启动过程可分为单阶段和多阶段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、内存控制器,为stage2准备内存空间。一般stage1是可以直接在nor flash中运行的,并将stage2复制到内存RAM中,设置堆栈,然后跳转到stage2(从这也可以看出stage2是在RAM中运行的,与stage1不同)

BootLoader的stage1通常包括以下步骤:

1.硬件设备初始化  如CPU寄存器、内存控制器

2.为加载BootLoader的stage2准备RAM空间

3.拷贝BootLoader的stage2到RAM空间中

4.设置好堆栈    为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的

5.跳转到stage2的C入口点

BootLoader的stage2通常包括以下步骤:

1.初始化本阶段要使用到的硬件设备    各种设备,如网卡

2.将内核映像和根文件系统映像从flash上读到RAM中去

3.调用内核

2、Grub

      GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。可用来用来引导不同系统,如windows,linux,通常用于linux,毕竟是GNU的嘛。

        Windows也有类似的工具NTLOADER;比如我们在机器中安装了Windows 98后,我们再安装一个Windows XP ,在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XP。NTLOADER就是一个多系统启动引导管理器,NTLOADER 同样也能引导Linux,只是极为麻烦罢了。

      bootmgr:启动管理器。Bootmgr是Boot Manager的缩写,是在Windows Vista、Windows 7、windows 8/8.1和windows 10中使用的新的启动管理器,以代替Windows NT系列操作系统(Windows XP、Windows 2003)中的启动管理器——NTLDR。

3、uboot

      U-Boot,全称为Universal Boot Loader,即通用Bootloader,是遵循GPL条款的开放源代码项目。其前身是由德国DENX软件工程中心的Wolfgang Denk基于8xxROM的源码创建的PPCBOOT工程。后来整理代码结构使得非常容易增加其他类型的开发板、其他架构的CPU(原来只支持 PowerPC);增加更多的功能,比如启动Linux、下载S-Record格式的文件、通过网络启动、通过PCMCIA/CompactFLash /ATA disk/SCSI等方式启动。增加ARM架构CPU及其他更多CPU的支持后,改名为U-Boot。

支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;

支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;


Uboot用于多种嵌入式CPU的BootLoader程序

支持多种嵌入式操作系统的引导

UBOOT目录结构

1.Borad        与开发板有关的文件。第一个开发板都以一个子目录出现在当前目录中

2.Common    实现Uboot支持的命令

3.Cpu        与特定CPU架构相关的代码,支持的CPU对应一个子目录(注意CPU与开发板的区别)

3.Disk        对磁盘的支持

4.Doc        文档目录

5.Drivers    Uboot支持的设备驱动程序  如各种网卡、串品、USB、支持CFI的Flash

6.Fs         文件系统的支持

7.Iclude    Uboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件        该目录下的asm目录有与CPU体系结构相关的头文件

8.Net        与网络协议相关的代码    各路协议的实现

9.Tools        生成Uboot的工具,如:mkimage,crc等等


Uboot编译分为两步

1.执行每种board相关的配置    如:make amdk_2420

2.编译生成uboot.bin文件        如:make CROSS_COMPILE=arm-linux-(指定正确路径)


文章如需转载请注明:转载自:TTF的家园
« 上一篇下一篇 »