一种嵌入式设备的多级引导加载方法

文档序号:6376454阅读:163来源:国知局
专利名称:一种嵌入式设备的多级引导加载方法
技术领域
本发明涉及嵌入式技术领域,尤其涉及一种嵌入式设备的多级引导加载方法。
背景技术
嵌入式设备具有两个显著的特点一个是尽量降低成本,需要裁减掉多余的软硬件功能;一个是需要定制以满足多样化的需求,统一标准的方式难以满足所有的需求。作为程序的主要部分image (程序镜像,通常包括kernel (内核)和rootfs (根文件系统))也是多样化的,随着技术的发展image本身的形式在不断发展,且有双image,大小image等应用形式的出现,导致原有的bootloader (启动加载程序)已经不能满足新的要求,不能兼容,因此bootloader本身也需要进行升级。有时,有关的关键参数如MAC地址,产测配置嵌入到bootloader本身,在参数扩充或修改时也需要对bootloader进行升级。 嵌入式的bootloader通常是存储在flash上的,而传统的bootloader升级方法是在升级bootloader时,需要把bootloader在flash上对应的block上的数据擦除掉,再从ram写入,这时可能因为断电和其他意外导致升级终止,而bootloader所在的block由于尚未写入数据或写入不完全导致损坏,上电重启就无法再从对应的flash block读出bootloader代码而无法运行,从而使嵌入式设备陷入瘫痪,俗称变成了砖头。这种情况维修和升级的成本都会很高,或者是永久性的损坏。因此必须找到一种方法来同时满足灵活性和安全性的要求。

发明内容
本发明的目的在于提供一种嵌入式设备的多级引导加载方法,采用两个bootloader级联来引导image,同时支持image和bootloader的多样性,又满足嵌入式升级时的安全性要求,在bootloader升级失败后仍然能够引导运行。本发明的目的是通过以下技术方案实现的。一种嵌入式设备的多级引导加载方法,所述嵌入式设备的flash依次划分为bootloader2分区、image分区和data配置区,所述多级引导加载方法包括步骤
在存储区中添加bootloaderl分区,该bootloaderl分区具有升级bootloader2、引导bootloader2 以及配置 bootloader2 的功能;
设备上电后,先启动bootloaderl ;
在指定时间内,循环检查是否有升级/配置bootloaderf指令输入,若无,则bootloaderl 引导 bootloader2 启动,完成启动流程;若有,则 bootloaderl 对bootloader2进行升级/配置,升级/配置之后跳转至bootloaderf执行或者直接重启设备。其中,所述bootloaderl分区和bootloader2分区位于不同flash上;其中,bootloaderl分区设于spi nor flash (串行外围接口或非门的闪存)上,bootloader2分区设于nandfIash (与非门闪存)上。其中,所述bootloaderl分区和bootloader2分区位于同一 flash上。
其中,所述bootloaderl分区占用I个flash的I个block。其中,所述bootloaderl分区设置有写保护。其中,bootloaderl引导bootloader2启动的过程为
bootloaderl从约定的地址找到对应的block,再根据找到的地址读入bootloader2的信息,读取bootloader2的长度和预设校验值信息;
bootloaderl读取出bootloader2的全部内容并计算其校验值,将该校验值和预设校验值比较判断得出该校验值是否正确。如果校验值正确则跳转到bootloaderf可执行代码所对应的地址,或跳转到bootloaderf加载到内存并解压后对应的地址执行,完成启动流程;如果不正确,则bootloaderl转换至升级模式,对bootloader2进行升级,升级后跳转至bootloader2执行或者直接重启设备。
其中,所述bootloaderl对bootloader2进行升级的方式包括三种串口升级方式、tftp (tftp简单文件传输协议)协议升级方式、http (超级文本传输协议)或ftp (文件传输协议)协议升级方式。与现有技术相比,本发明实施例具有以下有益效果。本发明实施例中新增了一个bootloaderl分区,具有引导、配置、升级原有的bootloader2分区的功能,在设备系统启动时bootloaderl分区与bootloader2分区级联来进行引导加载,这样在bootloader2在损坏或者升级失败时,bootloaderl由于被写保护而不会被损坏,因而bootloaderl可对bootloader2重新进行升级,不仅支持image和bootloader的多样性,而且满足嵌入式升级时的安全性要求。


图I是现有的flash分布结构示意图。图2是本发明实施例提供的flash分布结构示意图。图3是本发明实施例提供的嵌入式设备的多级引导加载方法流程图。图4是本发明实施例提供的升级方法流程图。
具体实施例方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。请参阅图1,现有的flash按顺序依次划分为一个bootloader分区、一个image分区(实际也可为多个image分区)和一个data配置区。其中bootloader分区用于存储bootloader程序本身和bootloader所需要的配置参数;image分区通常包括kernel和rootfs两部分;data配置区为可选,包括系统运行需要的配置参数和运行的记录信息,有时可能包括在rootfs里。与现有的flash分布结构不同,本实施例中在现有的bootloader分区之前添加一个新的bootloader分区,新的flash分布结构如图2所示,包括两个bootloader分区(分别称为bootloaderl分区和bootloader2分区)、一个image分区(实际也可为多个image分区)和一个data配置区。下面将对bootloaderl分区和bootloader2分区分别进行描述。
bootloderl 分区具有引导 bootloader2、升级 bootloader2 以及配置bootloader2的有关参数的功能;其中的升级功能可以包含最基本的串口升级方式,也可以包含网口升级方式等更高级的方式,详见下文。该bootloderl不支持直接引导或升级image和修改data配置区。bootloderl的大小受到限制,通常为I个flash的I个block大小,有时可能包括一个以上,所占flash空间比bootloder2要小很多。bootloader2分区保持现有单个bootloader的有关特性基本不变,其作用就是做一些基本的硬件、运行环境的初始化,解压kenel部分的代码,并把cpu的控制权交给kenel,从而实现对引导操作系统的kenrnel部分的引导,也包含升级自身和kernel,或bootloaderl除外的整个flash的功能。在实际应用中,bootloderl分区和bootloader2分区可以不在同一个flash上,比如bootloaderl 分区设于 spi nor flash,而 bootloader2 分区设于 nandflash 上。通常,bootloderl是写保护的,采用flash支持的写保护方式(可以是软件方式和硬件方式)。bootloader2没有权限或不能修改bootloaderl的内容,该限制可以是通过代·码中规定并在bootloaderl设置写保护来实现。bootloader2如果修改flash的写保护方式必须保证bootloaderl相关的block的写保护状态不改变。而bootloader2通常也不需要对bootloderl进行读取。本实施例中,添加设置bootloaderl分区的目的就是在嵌入式设备上电后先跳转到bootloderl执行,完成对bootloader2的升级或者配置后引导bootloader2。bootloaderl引导bootloader2时通过固定的起始地址来加载bootloader2,并在前面指定地址读取bootloaderf的长度和校验值。该长度和校验值会根据实际情况变化而变化。如果采用nandflash,不论bootloader2是否处于文件系统中,bootloaderl如果遇到坏块进行跳过在前面若干个指定的block范围内查找,直到根据特征值找到bootloaderf位置。请参阅图3,本实施例中,基于上述具有两个级联的bootloader分区的flash分区结构,嵌入式设备的弓I导加载方法包括以下步骤。301、设备上电后,从指定地址启动bootloaderl, bootloaderl开始执行有关的bootloader基本操作,如初始化内存、定时器,关中断,初始化串口、按键。302、在指定的短时间内(如I秒钟),循环检查是否有升级指令输入(升级指令可通过指定按键输入或者串口按键输入;按键输入是指板上有真实的按键,按下去会有电平变化报告给cpu,并有对应驱动处理;串口按键指板上有串口,通过RS232转接PC机,PC机的键盘有输入时会把输入的字符或命令信息通过串口传到嵌入式板上),如果没有升级指令输入则进入步骤303,如果有升级指令输入则进入步骤304。配置命令一般来自串口按键输入,本例是实现的通常举例说明,实际上如果有需求,可使用按键来完成特定的配置动作,如恢复默认配置的情况也可能存在。303、bootloaderl 引导 bootloader2,该引导过程具体如下。从约定的地址(norf Iash情况)或根据指定的规则找到对应的block (如nandflash),再根据找到的地址读入bootloader2的信息,读取出长度和预设校验值信息,之后读取出全部的bootloader2内容并计算校验值,将该校验值与预设校验值比较判断该校验值是否正确(预设校验值在编译时生成,在烧录flash时已写入到flash上,校验值是根据不包括预设校验值的flash上的内容在启动时由cpu计算得出的,校验值和预设校验值相同则表明校验值正确)。如果校验值正确则跳转到bootloaderf可执行代码所对应的地址(位于flash上),或跳转到bootloader2加载到内存后并解压(如果有需要)后对应的地址(位于内存ram上)执行,完成启动流程。如果不正确则跳转到步骤304执行。304、bootloaderl进入升级模式,在串口打印出命令提示,bootloaderl升级功能必须支持下面三种升级方式之一,或全部支持,可以根据实际的体积和功能需要取舍,升级过程如图4所示。这些升级方式的获取文件所采用的协议方式和通常在正常有bootloader2所用的协议实现是一致的,对具体实现方式不具体描述。升级方式①采取串口升级,需要在串口输入命令,采用的协议为x-moden, y-modem, z-moderm系列协议,下载文件到内存,然后升级改写flash,升级完成后可以手动执行命令或跳转到bootloaderf或自动重启设备。该方法实现简单,代码体积小,
为推荐的方式和一般的方式。升级方式②使用tftp升级,需要在串口输入命令采用的协议为tftp协议,bootloader需要网络驱动和网络协议支持,较复杂,tftp下载到内存后升级改写flash,升级完成后可以手动执行命令或跳转到b00tl0ader2(即跳转到步骤303执行)或自动重启设备(即跳转到步骤301执行)。升级方式③使用http或ftp协议支持,不需要直接在串口操作,需要网卡驱动和http服务,在浏览器中打开预定的http地址,选择升级文件下载后即会自动升级,跳转到b00tl0ader2(即跳转到步骤303执行)或自动重启设备(即跳转到步骤301执行)。不管采用何种升级方式,bootloaderl在对bootloader2进行升级时不影响和改变bootloaderl本身,且不直接升级image (kernel和rootfs)和data配置区,只支持升级bootloader2和bootloader2有关的参数。如果bootloader2存在写保护,则先去掉对应block的与保护,与完后对除bootloader2之外的与保护状态保持原有状态。305、当使用bootloader2对自身和kernel和rootfs等其他部分进行升级时,如果发生断电等意外的情况时bootloader2会损坏而无法启动,更谈不上正确引导kernel。发生这种情况时,重新启动设备,返回步骤301执行。在该步骤中,当重新上电bootloaderl起来后由于会对bootloader2进行完整性校验,检验时会发现bootloader2损坏,会进入升级模式,并调用led灯位显示bootloader2损坏,提醒用户手动对bootloader2进行升级,bootloader2升级后再重启后启动bootloader2对kernel部分进行升级。这时即使bootloader2即使再次升级失败,由于bootloaderl完好,下次依然同样可以启动bootloaderl,再次进行升级。在本实施例中,bootloaderl可以不需要支持对自身的升级。这时候的情况可以把bootloaderl视作嵌入到cpu内部的otp flash (一次性编程闪存),因此是不需要有升级功能的。如果确有需要,修改引导bootloader2有关的参数也可以实现对bootloaderl的升级。一般地,这些参数是不需要更改的,就是默认值可以能够引导bootloaderf,如果需要调整有关参数,贝Ij需要把参数单独占用一个block,该block的位置在bootloaderl的block之后,在bootloader2的block之前。该block只由bootloaderl来修改,不允许bootloader2来修改。能够通过修改参数的尽量通过修改参数来解决。对于修改参数仍不能解决的情况,需要对bootloaderl自身所在的block进行升级,升级时需确保一定不会出现断电的情况,如果发生断电仍然会导致bootloaderl自身损坏,升级前需要对该block去写保护,升级功能为减少复杂性,仅对bootloaderl进行升级写完后再对该block加上写保护。该升级功能原则上禁止使用,使用可以进行限制,比如需要特权密码限制,进入该模式时需要同时按几个键,并需要多几个步骤,输入几次指令进行确认,以保证安全性。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精 神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种嵌入式设备的多级引导加载方法,所述嵌入式设备的flash依次划分为bootloader2分区、image分区和data配置区,其特征在于,所述多级引导加载方法包括步骤 在存储区中添加bootloaderl分区,该bootloaderl分区具有升级bootloader2、引导bootloader2 以及配置 bootloader2 的功能; 设备上电后,先启动bootloaderl ; 在指定时间内,循环检查是否有升级/配置bootloaderf指令输入,若无,则bootloaderl 引导 bootloader2 启动,完成启动流程;若有,则 bootloaderl 对bootloader2进行升级/配置,升级/配置之后跳转至bootloaderf执行或者直接重启设备。
2.如权利要求I所述嵌入式设备的多级引导加载方法,其特征在于,所述bootloaderl分区和bootloader2分区位于不同flash上;其中,bootloaderl分区设于spi nor flash上,bootloader2 分区设于 nand flash 上。
3.如权利要求I所述嵌入式设备的多级引导加载方法,其特征在于,所述bootloaderl分区和bootloader2分区位于同一 flash上。
4.如权利要求I所述嵌入式设备的多级引导加载方法,其特征在于,所述bootloaderl分区占用I个flash的I个block。
5.如权利要求I所述嵌入式设备的多级引导加载方法,其特征在于,所述bootloaderl分区设置有写保护。
6.如权利要求I至5任一所述嵌入式设备的多级引导加载方法,其特征在于,该方法中,bootloaderl引导bootloader2启动的过程为 bootloaderl从约定的地址找到对应的block,再根据找到的地址读入bootloader2的信息,读取bootloader2的长度和预设校验值信息; bootloaderl读取出bootloader2的全部内容并计算其校验值,将该校验值和预设校验值比较判断得出该校验值是否正确;如果校验值正确则跳转到bootloaderf可执行代码所对应的地址,或跳转到bootloaderf加载到内存并解压后对应的地址执行,完成启动流程;如果不正确,则bootloaderl转换至升级模式,对bootloader2进行升级,升级后跳转至bootloader2执行或者直接重启设备。
7.如权利要求I至5任一所述嵌入式设备的多级引导加载方法,其特征在于,该方法中,所述bootloaderl对bootloader2进行升级的方式包括三种串口升级方式、tftp协议升级方式、http或ftp协议升级方式。
全文摘要
本发明提供了一种嵌入式设备的多级引导加载方法,所述嵌入式设备的flash依次划分为bootloader2分区、image分区和data配置区,所述多级引导加载方法包括步骤在存储区中添加bootloader1分区,该bootloader1分区具有升级bootloader2、引导bootloader2以及配置bootloader2的功能;设备上电后,先启动bootloader1;在指定时间内,循环检查是否有升级/配置bootloader2指令输入,若无,则bootloader1引导bootloader2启动,完成启动流程;若有,则bootloader1对bootloader2进行升级/配置,升级/配置之后跳转至bootloader2执行或者直接重启设备。本发明实施例中不仅支持image和bootloader的多样性,而且满足嵌入式升级时的安全性要求。
文档编号G06F9/445GK102902556SQ20121032685
公开日2013年1月30日 申请日期2012年9月6日 优先权日2012年9月6日
发明者刘宏钧 申请人:深圳市共进电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1