Linux - 嵌入式Linux开发中的Bootloader

嵌入式Linux系统几乎全部包含一个引导程序(bootloader);从技术角度讲,它不是Linux的一部分,但引导程序在嵌入式Linux应用中是一个关键部分。

虽然从理论和技术上讲,让一个嵌入式系统在复位后就开始运行Linux内核是可能的,但一般不会这样做。嵌入式系统通常将执行初始启动代码和开机自检(Power On Self Test - POST)的责任从操作系统中分离出来,放入一个单独的引导程序中。

当嵌入式系统接通电源时,CPU运行初始化代码,也就是引导程序。引导程序将初始化必需的硬件,然后找到下一个要运行的程序,将该程序载入内存,并跳转到该程序来执行。从这时开始,引导程序代码不会再运行,所以它会被从内存中移除。

下一个要运行的程序可以是任何东西。让引导程序加载下一个引导程序,再加载另一个引导程序,这种情况也不是没有。但不管怎样,为了获得一个可用的系统,它最终会加载操作系统代码,大多数情况下是Linux内核。一个简单的系统会在CPU复位后运行引导程序,然后加载并运行操作系统。

有一个单独的引导程序,而不是直接运行内核,这种做法提高了灵活性;这样内核可以放置到内存的不同位置,由引导程序找到并加载。这样一来,通过在引导程序中存储不同的配置,就可以从嵌入式系统的早期开发到生产都使用同一个引导程序。例如,在早期开发中,嵌入式平台可以完全从网络启动;而在后期开发中,可以从SD卡启动;生产系统可以从NAND闪存启动。

硬件的各种配置情况,可以通过参数形式传递给内核,这样基于同一平台的不同的嵌入式硬件系统,即架构相同但硬件配置有差异的设备,可以使用同一个内核二进制文件。

Bootloader有各种形式和大小。你想要的引导程序的特点是,它们是简单的,可定制的,有很多常见开发板和设备的可参考配置实例。下表显示了一些经常使用的引导程序:

Name

Main architectures supported

Das U-Boot

ARC, ARM, Blackfin, Microblaze, MIPS, Nios2, OpenRiec, PowerPC, SH

Barebox

ARM, Blackfin, MIPS, Nios2, PowerPC

GRUB 2

X86, X86_64

Little Kernel

ARM

RedBoot

ARM, MIPS, PowerPC, SH

CFE

Broadcom MIPS

YAMON

MIPS

U-Boot

嵌入式Linux系统中最常见的引导程序是U-Boot。U-Boot的正式名称是Das U-Boot,但大家都只叫它U-Boot。它支持许多处理器(CPU)架构--包括68k、ARM、MicroBlaze、MIPS、Nios、SuperH、PPC、RISC-V、x86等等。它还包含很多代码,支持许多现有的嵌入式开发板。

U-Boot是一个开源的引导程序。对于你的定制嵌入式系统,U-Boot的代码可以被修改以支持你的特定硬件。

U-Boot也有很多驱动,这意味着它可以从很多不同的地方找到内核。U-Boot有FTP、NAND闪存、MMC、i2c等驱动。它还包含FAT、ext2/3/4、Cramfs、Squashfs、JFFS2、UBIF、ZFS、btrfs等文件系统驱动。这意味着在不同媒介上、不同的文件系统中,U-Boot都能够找到存放其中的内核二进制文件。

U-Boot的启动配置是以环境变量的形式存储的。U-Boot通常将这些环境变量存储在闪存中,它们的值可以在重启后持续存在。当U-Boot运行时,它会寻找名为 "bootcmd "的环境变量。然后,U-Boot会展开这个变量,运行其中的任何命令。

U-Boot包含一个类Unix语法的命令行。在这个命令行环境中,你可以修改环境变量,并将新的数值存储在闪存中,以便在接下来的启动中使用。

在实际情况中,你可以在早期开发中利用U-Boot来进行配置。例如,配置为通过TFTP启动内核,使用NFS作为根文件系统。然后,当你快要软件发布时,你可以改变它,通过MMC使用ext4从SD卡启动。当你快要生产时,你可以改变U-Boot,使用UBIFS从板内的NAND闪存启动。

U-Boot的另一个重要功能是对设备树的支持。设备树是一种在Linux内核中的较新描述硬件的方式。嵌入式系统很少有运行时可发现的硬件。内核无法通过硬件查询来找出新的可用硬件。内核必须被告知哪些设备或硬件是存在的。内核可以读取描述硬件的设备树并加载适当的驱动程序,而不是将硬件信息以硬编码形式写在代码中。这使得同一个内核二进制文件可以在基于相同架构的不同板子上运行。

正如你所知的,由于对设备和文件系统的大量支持,再加上它的灵活性,对嵌入式系统来说,U-Boot是的一个通用选择。要获得更多关于U-Boot的信息,你可以访问项目网站:The U-Boot Documentation — Das U-Boot unknown version documentation

Other Bootloaders

虽然U-Boot是最常用的,但其他的引导程序也可以用于嵌入式系统。虽然要涵盖所有可能的引导程序需要的篇幅太大,但将介绍几个其他常见的开源引导程序。

Barebox是基于U-Boot而开发出来的。它有很多与U-Boot相同的灵活性,但努力使之更像Linux。它使用类似于Linux内核的驱动架构,包括使用内部文件系统,并在文件系统中使用/dev中的设备节点。网址:Barebox 。

RedBoot是Red Hat的一个引导程序。它在内部使用eCos RTOS技术,并提供调试程序,调试程序使用串口或以太网。

参考:

1,如何选择一个bootloader

Choosing a bootloader - Mastering Embedded Linux Programming - Second Edition [Book]

2,嵌入式提供使用的bootloader

Bootloaders for Embedded Linux Systems - The New Stack

猜你喜欢

转载自blog.csdn.net/guoqx/article/details/130986258