具体实施方式
请参阅图1,所示为本发明嵌入式网络设备10一实施方式的结构图。嵌入式网络设备10包括固件(Firmware),其中,固件是指固化在嵌入式网络设备10的集成电路内部的程序代码,负责控制和协调集成电路的功能。在本实施方式中,嵌入式网络设备10可以为路由器、调制解调器、网关等嵌入式的网络设备。
在本实施方式中,嵌入式网络设备10的固件至少可以分为两个独立的部分,此处两个独立的部分是指其一个部分的更新不受另一个部分的制约,也就是说仅更新其中的一个部分,未更新的部分亦可结合已更新的部分正常运行。如,嵌入式网络设备10采用Linux系统,其固件可分为内核(Kernel)与跟文件系统(Root File System)两部分,更新后的内核与更新前的根文件系统一样可以结合起来正常运行。
在本实施方式中,嵌入式网络设备10包括处理器12、内存14、非门闪存(Nor Flash)16、更新模块100、记录模块102及启动装载程序104。在嵌入式网络设备10正常运行时,内存14中装载了嵌入式网络设备10的固件,处理器12执行装载在内存14中的嵌入式网络设备10的固件,以实现嵌入式网络设备10的正常运行。
非门闪存16中包括第一镜像区160、第二镜像区162及第三镜像区164三个存储区,其中,第二镜像区162与第三镜像区164在多次更新时轮流作为备份区,即如果第一次更新时以第三镜像区164作为备份区,那么下次更新时以第二镜像区162作为备份区。此处,以第三镜像区164作为备份区为例对本案进行详细说明。此时,第一镜像区160存储了嵌入式网络设备10的原固件的第一部分,第二镜像区162存储了嵌入式网络设备10的原固件的第二部分。
在本实施方式中,非门闪存16中还存储有更新消息,用于标识固件更新情况。在本实施方式中,更新消息包括更新状态、更新部分、备份区三个字段。其中,更新状态表示固件更新是否成功完成,更新部分表示目前在更新的固件的部分,备份区表示目前备份固件的存储区,即第二镜像区162或者第三镜像区164。此处备份区以第三镜像区164为例进行说明。
更新模块100获取嵌入式网络设备10的新固件并存储于内存14中,并获取更新信息的备份区为第三镜像区164。更新模块100先将第一镜像区160存储的嵌入式网络设备10的原固件的第一部分拷贝到备份区,然后将内存14中的新固件的第一部分拷贝到第一镜像区160,再将内存14中的新固件的第二部分拷贝到备份区,最后将第一镜像区160中的新固件的第一部分的启动指针指向备份区,从而完成固件更新。在本实施方式中,启动指标是一种指针,其指向哪个区,启动装载程序104就会在装载完新固件的第一部分后自动装载哪个区存放的固件。
记录模块102在更新模块100拷贝完原固件的第一部分后记录更新信息的更新状态为正在更新中,并记录更新部分为原固件的第一部分。记录模块102在更新模块100拷贝完新固件的第一部分后将更新信息的更新部分更改为新固件的第二部分,再在更新模块100重新指向启动指针后将更新信息的更新状态更改为完成更新,并将备份区改为第二镜像区162。
需要说明的是,记录更新消息的更新状态为正在更新中是指将更新消息的更新状态字段赋值为用于表达正在更新的一个值,如,将正在更新中用1表示,将完成更新预设为用0表示,则记录更新消息的更新状态为正在更新中就是将更新消息的更新状态字段赋值为1,更改所述更新消息的更新状态为完成更新就是将更新消息的更新状态字段的值更改为0。其它涉及更新消息各字段的记录、更新、获取的意思都可依此类推。
在完成固件更新后,嵌入式网络设备10重新启动。此时,启动装载程序104读取更新消息的字段,判断更新状态是否为正在更新中,并在更新状态不为正在更新中时装载嵌入式网络设备10的固件以完成启动。
启动装载程序104在更新状态为正在更新中时判断更新部分是否为原固件的第一部分,并在更新部分不为原固件的第一部分时装载嵌入式网络设备10的固件以完成启动并在启动后重新对固件进行更新。
启动装载程序104在更新部分为原固件的第一部分时,将第三镜像区164中的原固件的第一部分复原到第一镜像区160,并将更新信息的更新状态更改为完成更新,以及装载第一镜像区160与第二镜像区162中的固件以完成启动,并在启动后引导更新模块100与记录模块102重新更新固件。
因此,在嵌入式网络设备10需要更新固件时,通过处理器12执行装载在内存14中的更新模块100及记录模块102,将非门闪存16中存储的原固件更新为内存14中的新固件,并利用备份区来保证固件更新过程中即使出错也能再次启动。且,备份区仅需要能够存储新固件的第一部分或第二部分中较大的一部分,而不需要存储新固件的全部。从而,本发明不仅能保证更新嵌入式网络设备10固件的可靠性,还能减小更新固件时备份所需的闪存。更进一步的,嵌入式网络设备10通过更改启动指针来自动装载第三镜像区164中的固件,从而不需要备份第二镜像区162中的固件到第三镜像区164,有效简化了备份步骤,减少更新所需的时间。
请参阅图2,所示为本发明更新固件的方法一实施方式的流程图。本方法用于图1中的嵌入式网络设备10中,并通过图1所示的更新模块100及记录模块102完成。此时,第一镜像区160存储有嵌入式网络设备10的原固件的第一部分,第二镜像区162存储有嵌入式网络设备10的原固件的第二部分。
在步骤S200,更新模块100获取新固件并存储于内存14中。在步骤S201,更新模块100获取更新信息的备份区,此处为第三镜像区164。
在步骤S202,更新模块100将第一镜像区160存储的嵌入式网络设备10的原固件的第一部分拷贝到备份区,即第三镜像区164。拷贝完成后,第三镜像区164中就存储了嵌入式网络设备10的原固件的第一部分。然后,记录模块102在步骤S203记录更新信息的更新状态为正在更新中,并记录更新部分为原固件的第一部分。
在步骤S204,更新模块100将内存14中的新固件的第一部分拷贝到第一镜像区160,拷贝完成后,第一镜像区160就存储有新固件的第一部分。然后,记录模块102在步骤S206将更新信息的更新部分更改为新固件的第二部分。
在步骤S208,更新模块100将内存14中的新固件的第二部分拷贝到备份区,即第三镜像区164。拷贝完成后,第三镜像区164就存储有新固件的第二部分。在步骤S210,更新模块100将第一镜像区160中的新固件的第一部分的启动指针指向备份区,此时即第三镜像区164,使得嵌入式网络设备10会在启动完新固件的第一部分后从第三镜像区164启动新固件的第二部分。然后,记录模块102在步骤S212将更新信息的更新状态更改为完成更新,并将备份区改为第二镜像区162。
当整个更新固件的过程顺利完成时,第一镜像区160存储有嵌入式网络设备10的新固件的第一部分,第二镜像区162存储有嵌入式网络设备10的原固件的第二部分,第三镜像区164存储有嵌入式网络设备10的新固件的第二部分,且新固件的第一部分的启动指针指向第三镜像区164。另外,更新消息的更新状态为完成更新,更新部分为新固件的第二部分,备份区为第二镜像区162。此时,嵌入式网络设备10在更新固件后再次启动时就会从更新后的固件启动。其具体的启动流程请参阅图3的描述。
请参阅图3,所示为图1中一实施方式的嵌入式网络设备10采用图2的更新固件的方法更新固件后启动的流程图。本方法用于图1中的嵌入式网络设备10中,并通过图1所示的启动装载程序104完成。
在步骤S300中,启动装载程序104读取更新消息,判断更新状态是否为正在更新中。如果更新消息的更新状态不是正在更新中,而是完成更新,则在步骤S301,启动装载程序104装载嵌入式网络设备的固件以完成启动。在本实施方式中,更新状态为完成更新时,存在两种可能,一种为更新过程中没有出现错误,则启动装载程序104装载第一镜像区160的新固件的第一部分与第三镜像区164的新固件的第二部分,以完成启动。另一种为在执行步骤S202将第一镜像区160存储的嵌入式网络设备10的原固件的第一部分拷贝到备份区时出错,则启动装载程序104装载第一镜像区160的原固件的第一部分与第二镜像区162的原固件的第二部分,以完成启动。此时在启动后就需要重新更新固件。
如果更新消息的更新状态为正在更新中,则说明更新过程中出现了错误,则在步骤S302,启动装载程序104判断更新消息的更新部分是否为原固件的第一部分,以了解错误出现在哪个步骤。
如果更新消息的更新部分是原固件的第一部分,那么说明更新固件的流程在执行步骤S204将内存14中的新固件的第一部分拷贝到第一镜像区160的时候出错,则启动装载程序104在步骤S304将第三镜像区中的原固件的第一部分复原到第一镜像区160,并在步骤S306将更新信息的更新状态更改为完成更新。此时,第一镜像区160存储有原固件的第一部分,第二镜像区162存储有原固件的第二部分,则在步骤S308,启动装载程序104装载第一镜像区160与第二镜像区162中的固件以完成启动,并在启动后引导更新模块100与记录模块102重新更新固件,即重新执行图2所示的流程。
如果更新消息的更新部分不是原固件的第一部分,而是新固件的第二部分,那么说明更新固件的流程在执行步骤S208将内存中的新固件的第二部分拷贝到备份区的时候出错。此时,第一镜像区160存储有新固件的第一部分,第二镜像区162存储有原固件的第二部分,则在步骤S308,启动装载程序104装载第一镜像区160与第二镜像区162中的固件以完成启动,并在启动后引导更新模块100与记录模块102重新更新固件,即重新执行图2所示的流程。
由此可见,借助于第三镜像区164,无论在固件更新方法的哪个步骤出错,嵌入式网络设备10均能正常启动。
为了更清楚地说明本发明更新固件的方法,在此给出具体的实施例来进行详细说明。如图4所示,为图1中一实施方式的嵌入式网络设备10采用图2所示的更新固件的方法来更新固件的示例图。在本实施方式中,嵌入式网络设备10采用Linux系统,其固件包括内核与根文件系统两个部分。
首先,更新模块100将新内核与新根文件系统存入内存14中,第一镜像区160中存储有原内核,第二镜像区162存储有原根文件系统,第三镜像区164为备份区。
接下来,更新模块100将第一镜像区160中的原内核拷贝到第三镜像区164。此时,如果在这个步骤出错,启动装载程序104就通过原内核与原根文件系统启动。
接下来,更新模块100将内存中的新内核拷贝到第一镜像区160中。此时,如果在这个步骤出错,启动装载程序104就将第三镜像区164中的原内核复原到第一镜像区160,并通过原内核与原根文件系统启动。
接下来,更新模块100将内存中的新根文件系统拷贝到第二镜像区162中。此时,如果在这个步骤出错,启动装载程序104就通过新内核与原根文件系统启动。
接下来,更新模块100将启动指针指向第三镜像区164,下次启动时,启动装载程序104就通过新内核与新根文件系统启动。此时,固件更新就已经完成。
本发明提供的嵌入式网络设备10在需要更新固件时,通过更新模块100及记录模块102将非门闪存16中存储的原固件更新为内存14中的新固件,并利用备份区来保证固件更新过程中即使出错也能再次启动。且,备份区仅需要能够存储新固件的第一部分或第二部分中较大的一部分,而不需要存储新固件的全部。从而,本发明不仅能保证更新嵌入式网络设备10固件的可靠性,还能减小更新固件时备份所需的闪存。