zoukankan      html  css  js  c++  java
  • 分析对比主流Bootloader的性能

    原文地址:http://blog.csdn.net/yaoweibin/article/details/1658406

    引言:
    Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
    对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。
    反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。本文将对各种Bootloader总结分类,分析它们的各自特点。可以看到表1就是我的汇总表
     
    正文:
          
    表1 开放源码的Linux引导程序【1】
    Bootloader
    描述
    x86
    ARM
    PowerPC
    LILO
    Linux磁盘引导程序
    GRUB
    GNU的LILO替代程序
    Loadlin
    从DOS引导Linux
    ROLO
    从ROM引导Linux而不需要BIOS
    Etherboot
    通过以太网卡启动的Linux系统的固件
    LinuxBIOS
    完全替代BUIS的Linux引导程序
    BLOB
    LART等的硬件平台的引导程序
    U-boot
    通用引导程序
    RedBoot
    基于eCos的引导程序
    vivi
    专为ARM处理器系列设计
    Bios-lt
    专为S3C4510B开发的引导程序
    Bootldr
    康柏的支持SA1100芯片引导程序
     
    Linux传统上是通过LILO(LInux LOader)引导的,后来又出现了GNU的软件GRUB(GRand Unified Bootloader)。这2种Bootloader广泛应用在X86的Linux系统上。你的开发主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。
    LILO软件工程是由Werner Almesberger创建,专门为引导Linux开发的。现在LILO的维护者是John Coffman,最新版本下载站点:http://lilo.go.dyndns.org。LILO有详细的文档,例如LILO套件中附带使用手册和参考手册。此外,还可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指南。
    GRUB是GNU计划的主要bootloader。GRUB最初是由Erich Boleyn为GNU Mach操作系统撰写的引导程序。后来有Gordon Matzigkeit和Okuji Yoshinori接替Erich的工作,继续维护和开发GRUB。GRUB的网站http://www.gnu.org/software/grub/上有对套件使用的说明文件,叫作《GRUB manual》。GRUB能够使用TFTP和BOOTP或者DHCP通过网络启动,这种功能对于系统开发过程很有用。
     
    “Loadlin不用安装,可以存在任何DOS可以访问的介质(比如磁盘,甚至是网络存储)。当系统崩溃的时候,甚至LILO也不能起来,Loadlin是一项极佳的工具来启动系统或恢复文件系统。现在许多cdrom就是通过Loadlin来安装Linux,因为它不需要硬盘,用DOS来装载Linux。Loadlin可以适合几乎所有的DOS系统,启动限制也比较少。它使用扩展内存,可以驱动大内核和ramdisk镜像”【4】。
     
    ROLO ROLO: A Developer's Guide,它讨论了在不利用 BIOS 的情况下引导 Linux(Embedded Linux Works,2001 年 6 月)。    
      
    Etherboot是用来制作X86计算机无盘启动BOOTROM的工具,它理论上可以支持广播的TCP/IP网络。etherboot对于现在非常流行的CLUSTER应用和低成本X终端非常有用。“无盘启动可以由netboot,etherboot及pxe实现。现在一般选用的是etherboot,而pxe方式是未来的方向,只是在目前条件尚未成熟”【3】。
     
           “LinuxBIOS目标是以能在冷启动状态下启动Linux的Linux内核来替代PC、Alpha和其它机器上的常规BIOS。LinuxBIOS根本上就是Linux,在通用的Linux内核打上大约10行的补丁。再加上启动代码,大约500行的汇编和5000行的C代码,在Linux接管前运行16个指令来进入32位方式并完成DRAM和其它硬件的初始化。他们项目原来的动机是维护庞大的cluster集群”【5】。
                 
           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。
           
           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的完整功能性和后续不断的支持,使系统的升级维护变得十分方便。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是标准的嵌入式调试和引导解决方案,支持几乎所有的处理器构架以及大量的外围硬件接口,并且还在不断地完善过程中。
     
    vivi是由mizi公司设计为ARM处理器系列设计的一个bootloader,因为vivi目前只支持使用串口和主机通信,所以您必须使用一条串口电缆来连接目标板和主机。它的主要特性有:
    -             把内核(kernel)从flash复制到RAM,然后启动它
    -             初始化硬件
    -             下载程序并写入flash(一般通过串口或者网口先把内核下载到RAM中,然后写入到flash)
    -             检测目标板(bootloader会有一些简单的代码用以测试目标板硬件的好坏)
     
    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。
          
    Bootldr是康柏(Compaq)公司发布的,类似于compaq iPAQ Pocket PC,支持SA1100芯片。它被推荐用来引导Llinux,支持串口Y-modem协议以及jffs文件系统。Bootldr的最后版本为Bootldr-2.19,其发布网址为:http://www.wearablegroup.org/software/bootldr/。
     
    总结及展望:由于时间有限,本文只是对于网络资源的总结,只想尽可能多得列出现有一些流行的Bootloader一些特性,如果想进一步的研究,可以阅读各个Bootloader的源代码,相信对各类硬件及操作系统的启动有更加清晰的了解。
     
     
    参考文献:
    【1】、孙纪坤 张小全,《嵌入式Linux系统开发技术详解-基于ARM》
    【2】、《几种Bootloader简介》,http://www.ednchina.com/blog/peter8888/3300/message.aspx
    【3】、吴峰光,《etherboot无盘启动》,http://micro.ustc.edu.cn/Linux/text/wfg-etherboot.txt
    【4】、《loadlin manual》,http://www.0wei.com/blog.php?tid=13560
    【5】、《LinuxBIOS的简介》,http://blog.chinaunix.net/u/3577/showart.php?id=61761
  • 相关阅读:
    应用程序池溢出问题
    弹窗上传图片
    第三方监测
    服务器架设方案
    python随笔录入月份的值,输出对应的季节
    用python计算直角三角形斜边长
    返回(统计)一个列表中出现次数最多的元素
    使用random函数实现randint函数的功能
    Spring
    ng build prod basehref /javaweb/angular/
  • 原文地址:https://www.cnblogs.com/bluestorm/p/2298122.html
Copyright © 2011-2022 走看看