几种Bootloader简介

本文介绍了五种常用的嵌入式BootLoader:Redboot、U-Boot、ARMboot、Blob和Bios-lt,详细阐述了它们的特点、支持的处理器架构及功能,帮助读者了解不同BootLoader的应用场景。
l         Redboot
Redboot是 Redhat公司随 eCos发布的一个 BOOT方案,是一个开源项目。
当前 Redboot的最新版本是 Redboot-2.0.1, Redhat公司将会继续支持该项目,其官方发布网址为: http://sources.redhat.com/redboot/
Redboot支持的处理器构架有 ARM, MIPS, MN10300, PowerPC, Renesas SHx, v850, x86等,是一个完善的嵌入式系统 Boot Loader。
Redboot是在 ECOS的基础上剥离出来的,继承了 ECOS的简洁、轻巧、可灵活配置、稳定可靠等品质优点。它可以使用 X-modem或 Y-modem协议经由串口下载,也可以经由以太网口通过 BOOTP/DHCP服务获得 IP参数,使用 TFTP方式下载程序映像文件,常用于调试支持和系统初始化( Flash下载更新和网络启动)。 Redboot可以通过串口和以太网口与 GDB进行通信,调试应用程序,甚至能中断被 GDB运行的应用程序。 Redboot为管理 FLASH映像,映像下载, Redboot配置以及其他如串口、以太网口提供了一个交互式命令行接口,自动启动后, REDBOOT用来从 TFTP服务器或者从 Flash下载映像文件加载系统的引导脚本文件保存在 Flash上。当前支持单板机的移植版特性有:
-          支持 ECOS, Linux操作系统引导
-          在线读写 Flash
-          支持串行口 kermit, S-record下载代码
-          监控 (minitor)命令集 :读写 I/O,内存,寄存器、 内存、外设测试功能等
Redboot是标准的嵌入式调试和引导解决方案,支持几乎所有的处理器构架以及大量的外围硬件接口,并且还在不断地完善过程中。
 
l         ARMboot
ARMboot是一个 ARM平台的开源固件项目,它特别基于 PPCBoot,一个为 PowerPC平台上的系统提供类似功能的姊妹项目。鉴于对 PPCBoot的严重依赖性,已经与 PPCBoot项目合并,新的项目为 U-Boot。
ARMboot发布的最后版本为 ARMboot-1.1.0, 2002年 ARMboot终止了维护,其发布网址为: http://sourceforge.net/projects/armboot
ARMboot支持的处理器构架有 StrongARM , ARM720T , PXA250 等,是为基于 ARM或者 StrongARM CPU的嵌入式系统所设计的。
ARMboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。 ARMboot是 GPL下的 ARM固件项目中唯一支持 Flash闪存, BOOTP、 DHCP、 TFTP网络下载, PCMCLA寻线机等多种类型来引导系统的。特性为:
-          支持多种类型的 FLASH
-          允许映像文件经由 BOOTP、 DHCP、 TFTP从网络传输;
-          支持串行口下载 S-record或者 binary文件
-          允许内存的显示及修改
-          支持 jffs2文件系统等
Armboot对 S3C44B0板的移植相对简单,在经过删减完整代码中的一部分后,仅仅需要完成初始化、串口收发数据、启动计数器和 FLASH操作等步骤,就可以下载引导 uClinux内核完成板上系统的加载。总得来说, ARMboot介于大、小型 Boot Loader之间,相对轻便,基本功能完备,缺点是缺乏后续支持。
 
l         U-Boot
U-Boot是由开源项目 PPCBoot发展起来的, ARMboot并入了 PPCBoot,和其他一些 arch的 Loader合称 U-Boot。 2002年 12月 17日第一个版本 U-Boot-0.2.0发布,同时 PPCBoot和 ARMboot停止维护。
U-Boot自发布以后已更新 6次 ,最新版本为 U-Boot-1.1.1, U-Boot的支持是持续性的。其发布网址为 : http://sourceforge.net/projects/u-boot/
U-Boot支持的处理器构架包括 PowerPC (MPC5xx, MPC8xx, MPC82xx, MPC7xx, MPC74xx, 4xx), ARM ( ARM7, ARM9, StrongARM, Xscale), MIPS (4Kc, 5Kc), x86等等, U-Boot( Universal Bootloader)从名字就可以看出,它是在 GPL下资源代码最完整的一个通用 Boot Loader。
U-Boot提供两种操作模式:启动加载( Boot loading)模式和下载( Downloading)模式 ,并具有大型 Boot Loader的全部功能。主要特性为:
-          SCC/FEC以太网支持 
-          BOOTP/TFTP引导 
-          IP, MAC预置功能 
-          在线读写 FLASH, DOC, IDE, IIC, EEROM, RTC
-          支持串行口 kermit, S-record下载代码 
-          识别二进制、 ELF32、 pImage格式的 Image,对 Linux引导有特别的支持 
-          监控 (minitor)命令集 :读写 I/O,内存,寄存器、内存、外设测试功能等
-          脚本语言支持(类似 BASH脚本)
-          支持 WatchDog, LCD logo,状态指示功能等 
U-Boot的功能是如此之强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本、引导等工具,特别支持 Linux,为板级移植做了大量的工作。 U-Boot1.1.1版本特别包含了对 SA1100和 44B0芯片的移植,所以 44B0移植主要是针对 Board 的移植,包括 FLASH、内存配置以及串口波特率等等。 U-Boot的完整功能性和后续不断的支持,使系统的升级维护变得十分方便。
 
l         Blob
Blob(Boot Loader Object)是由 Jan-Derk Bakker and Erik Mouw发布的,是专门为 StrongARM 构架下的 LART设计的 Boot Loader。
Blob的最后版本是 blob-2.0.5,其发布网址为: http://www.lart.tudelft.nl/lartware/blob/
Blob支持 SA1100的 LART主板,但用户也可以自行修改移植。
Blob也提供两种工作模式,在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将 Blob 切换到下载模式。如果在 10 秒内没有用户按键,则 Blob 继续启动 Linux 内核。其基本功能为:
初始化硬件( CPU速度,存储器,中断, RS232串口)
-          引导 Linux内核并提供 ramdisk
-          给 LART下载一个内核或者 ramdisk
-          给 FLASH片更新内核或者 ramdisk
-          测定存储配置并通知内核
-          给内核提供一个命令行
Blob功能比较齐全,代码较少,比较适合做修改移植,用来引导 Liunx,目前大部分 S3C44B0板都用 Blob修改移植后来加载 uClinux。  
l         Bios-lt
Bios-lt是专门支持三星( Samsung)公司 ARM构架处理器 S3C4510B的 Loader,可以设置 CPU/ROM/SDRAM/EXTIO,管理并烧写 FLASH,装载引导 uClinux内核。这是国内工程师申请 GNU通用公共许可发布的。                   
Bios-lt的最新版本是 Bios-lt-0.74,另外还提供了 S3C4510B的一些外围驱动,其发布网址为: http://sourceforge.net/projects/bios-lt
l         Bootldr
Bootldr是康柏( Compaq)公司发布的,类似于 compaq iPAQ Pocket PC,支持 SA1100芯片。它被推荐用来引导 Llinux,支持串口 Y-modem协议以及 jffs文件系统。                                           
Bootldr的最后版本为 Bootldr-2.19,其发布网址为:  http://www.wearablegroup.org/software/bootldr/
 
### Bootloader分区的实现方法与技术方案 Bootloader分区是嵌入式系统中非常重要的组成部分,用于管理固件的启动、更新和回滚等功能。以下是几种常见的Bootloader分区实现方法和技术方案: #### 1. 单分区策略 单分区策略是最简单的分区方式,通常只有一个主分区(Main Partition)用于存储操作系统或应用程序。在更新过程中,新的固件会直接覆盖当前的主分区。这种方式的优点是简单易实现,缺点是缺乏冗余机制,一旦更新失败可能导致系统无法启动。 - 如果更新失败,系统可能需要通过外部工具恢复[^1]。 - 这种策略通常适用于对可靠性要求不高的场景。 #### 2. A/B分区策略 A/B分区策略是一种更可靠的分区方法,使用两个独立的分区(A和B),每个分区都可以独立运行操作系统或应用程序。这种策略通过切换活动分区来实现固件更新和回滚功能。 - 在正常情况下,一个分区(例如A)处于活动状态,另一个分区(B)作为备份。 - 当需要更新时,新固件被写入非活动分区(B)。如果更新成功,系统会在下次启动时切换到B分区;如果更新失败,则继续从A分区启动。 - A/B分区策略还定义了标志位(如active、bootable、successful)来标识分区的状态。 ```python # 示例:A/B分区切换逻辑 def switch_partition(active_partition, update_status): if active_partition == 'A' and update_status == 'success': return 'B' elif active_partition == 'B' and update_status == 'success': return 'A' else: return active_partition ``` #### 3. MBR分区策略 MBR(Master Boot Record)分区策略主要用于传统硬盘分区管理。MBR包含引导代码、磁盘标志、分区表和有效标志等信息。 - 引导代码区最大为446字节,用于加载操作系统[^2]。 - 分区表最多支持4个主分区,每个分区条目占用16字节[^2]。 - 如果MBR中的分区表或标志位被破坏,可能导致磁盘无法正确读写[^2]。 ```c // 示例:MBR分区表结构 typedef struct { uint8_t boot_indicator; // 启动标志 uint8_t start_head; // 起始磁头号 uint8_t start_sector; // 起始扇区号 uint8_t start_cylinder; // 起始柱面号 uint8_t partition_type; // 分区类型 uint8_t end_head; // 结束磁头号 uint8_t end_sector; // 结束扇区号 uint8_t end_cylinder; // 结束柱面号 uint32_t lba_start; // 起始LBA地址 uint32_t sector_count; // 扇区总数 } MBR_Partition_Entry; ``` #### 4. Android系统分区策略 在Android设备中,Bootloader分区通常包括多个子分区,如boot、system、vendor、userdata等。随着Android版本的演进,分区策略也在不断优化。 - 在Android 10及更高版本中,根文件系统(root file system)被合并到system.img中[^3]。 - 使用system-as-root架构可以简化分区布局,并支持dm-verity等安全特性[^3]。 ```bash # 示例:Android分区布局 mount /dev/block/bootdevice/by-name/system /system mount /dev/block/bootdevice/by-name/vendor /vendor ``` #### 5. 自定义分区策略 某些嵌入式系统可能需要根据特定需求设计自定义分区策略。例如,通过二级存储(如外部Flash)保存备份数据,以增强系统的可靠性和灵活性。 - 在更新过程中,可以通过检查升级标志(updateflag)和备份地址标志(bkpaddrflag)来决定数据来源[^4]。 - 如果内部Flash空间不足,可以将备份数据存储在外部Flash中。 ```c // 示例:自定义分区更新逻辑 uint8_t Flash_Check_IAP_Flag(void) { uint8_t ret = 0; if (Flash_Read_UpdataInfo(&upGradeInfo) == OK) { if (upGradeInfo.updateflag == UPDATAFLAG) { if (upGradeInfo.bkpaddrflag == EXTERNFLASH) { ret = Flash_Updata_From_Extern(&upGradeInfo); } else { ret = Flash_Updata_From_Internal(&upGradeInfo); } if (ret == OK) { iap_jump_app(APP_STARTADDR); } } } return ret; } ``` ### 总结 Bootloader分区的实现方法多种多样,具体选择取决于系统需求和硬件限制。A/B分区策略因其高可靠性被广泛应用于嵌入式系统中,而MBR分区策略则适合传统的硬盘管理场景。对于Android设备,system-as-root架构提供了更简洁的分区布局和更强的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值