嵌入式设备以及程序更新方法与流程

文档序号:11230182阅读:734来源:国知局
嵌入式设备以及程序更新方法与流程

相关申请的交叉引用

于2016年3月1日提交的日本专利申请号2016-038574的包括说明书、附图和摘要的公开以其全部内容通过引用并入本文中。

本发明涉及嵌入式设备以及程序更新方法,并且例如涉及使用差分程序来进行更新的嵌入式设备以及程序更新方法。



背景技术:

近年来,各自嵌入车内设备、工业用设备或诸如此类的嵌入式设备的数量日益增长。因此,需要一种通过所谓的ota(空中下载技术,overtheair)来更新这样的嵌入式设备中的程序的方法。针对程序的更新,已经提出各种技术。例如,专利文献1公开了一种在不停止在嵌入式设备上操作的程序的操作的情况下,通过在模块单元的基础上初步地将基准地址和相对地址分配给更新程序来在模块单元的基础上动态地更新程序的技术。



技术实现要素:

然而,专利文献1中描述的技术的先决条件在于,通过从嵌入式设备中的基准地址和相对地址算出实际地址,更新程序的动态地址解析(即,动态链接)是可能的。即,在专利文献1描述的技术中,必须通过执行这样的地址解析并且使用更新前程序和作为更新前程序与已更新的程序之差的更新差分程序来重建程序。

然而,进行这样的重建存在很多问题,以致需要大容量的存储器,并且由于必须在重建期间读取更新前程序,mcu(微控制器单元,microcontrollerunit)内核中必须停止用户服务。因此,要求在不使用更新前程序和更新差分程序来进行程序重建的情况下更新程序。

参阅说明书的描述以及附图,其他问题和新颖性特征将显而易见。

根据实施例,一种嵌入式设备具有非易失性存储器,其具有多个层面,能够独立地从/向所述多个层面读取/写入数据;以及地址转换器,其通过使用地址转换表来进行地址转换。当通过由cpu解码指令获得的地址是与默认程序中的变更部分相对应的地址时,所述地址转换器将该地址转换为在其中配置差分程序的地址。

根据本实施例,在不使用更新前程序和更新差分程序来进行程序重建的情况下,能够进行程序更新处理。

附图说明

图1是图示与实施例概要有关的嵌入式设备的构造的框图。

图2是图示根据第一实施例的信息系统的构造示例的示意图。

图3是图示开发环境的构造示例的框图。

图4是图示管理服务器的构造示例的框图。

图5是图示嵌入式设备的构造示例的框图。

图6是图示嵌入式设备的另一个构造示例的框图。

图7是图示根据第一实施例的地址转换器的概要的示意图。

图8是图示地址转换器的连结示例的框图。

图9是解释已更新的程序执行处理的示例的示意图。

图10是解释由地址转换器进行地址转换的细节的示意图。

图11a是解释在更新之后数据表的大小超过由用于数据rom的地址转换器处理的区段大小的情况下进行地址转换的示例的示意图并且图示出在第一次访问数据表时的转换。

图11b是解释在数据表在更新之后的大小超过由用于数据rom的地址转换器处理的区段大小的情况下地址转换的示例的示意图并且图示在第二次和随后多次访问数据表时的转换。

图12是图示更新前程序与差分程序之间的程序执行转移状态的示意图。

图13是图示已转换的地址与差分代码之间对应关系的示例的示意图。

图14是图示已转换的地址与差分代码之间对应关系的另一示例的示意图。

图15是图示在更新变量的情况下已转换的地址与差分代码之间对应关系的示例的示意图。

图16是图示在更新变量的情况下已转换的地址与差分代码之间对应关系的另一示例的示意图。

图17是图示更新信息文件的构造示例的示意图。

图18是图示注入代码的构造示例的示意图。

图19是解释执行注入代码前的流程的示意图。

图20是图示使调用bios例程代码的处理与注入代码中的处理相对应的处理示例的流程图。

图21是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图22是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图23是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图24是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图25是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图26是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图27是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图28是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图29是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图30是图示与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图31a是图示在由函数调用执行bios例程的情况下注入代码的构造示例的示意图。

图31b是图示在由到bios例程的跳转指令执行bios例程的情况下注入代码的构造示例的示意图。

图32a是图示在更新程序而未伴同bios代码更新的情况下bios代码在三个层面的程序rom中的配置示例的示意图。

图32b是图示在更新整个默认程序、包括bios代码更新的情况下bios代码在三个层面的程序rom中的配置示例的示意图。

图33a是图示生成与差分更新相对应的更新二进制码和更新信息的处理的示例的流程图。

图33b是图示生成与差分更新相对应的更新二进制码和更新信息的处理的示例的流程图。

图34是图示生成与通用程序更新相对应的更新二进制码和更新信息的处理的示例的流程图。

图35a是图示合并差分程序的处理的示例的流程图。

图35b是图示合并差分程序的处理的示例的流程图。

图36图示在其中放置有嵌入式设备的系统的构造示例。

图37是图示程序更新处理的示例的流程图。

图38是解释嵌入式设备中的程序的动态配置操作的示例的示意图。

图39是解释嵌入式设备中的程序的动态配置操作的另一示例的示意图。

图40是图示嵌入式设备的启动操作的示例的流程图。

图41是图示“更新差分代码配置后的初始化处理”的示例的流程图。

图42是图示在sram中调用bios的代码配置的处理并且执行bios的示例的流程图。

图43是图示将更新信息文件中包括的更新差分二进制码从管理服务器传送到嵌入式设备的处理的示例的流程图。

图44是图示根据第二实施例的嵌入式设备的构造示例的框图。

图45是图示根据第二实施例的嵌入式设备的另一构造示例的框图。

图46是图示根据第二实施例的地址转换器的概要的示意图。

图47是解释在构造新的差分代码时重用以往曾配置的差分代码的方法的示意图。

图48a是图示在更新程序未伴同bios代码更新的情况下将bios代码配置到具有两个层面的程序rom中的配置示例的示意图。

图48b是图示在更新整个默认程序、包括bios代码更新的情况下将bios代码配置到具有两个层面的程序rom中的配置示例的示意图。

图49是图示根据第二实施例的程序更新处理的示例的流程图。

图50是图示根据第二实施例的嵌入式设备的启动操作的示例的流程图。

图51是图示根据第二实施例的“更新差分代码配置后的初始化处理”的示例的流程图。

图52是图示根据第三实施例的注入代码的构造示例的示意图。

图53是图示根据第三实施例的与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图54是图示根据第三实施例的与注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图。

图55是图示根据第三实施例的与注入代码中的处理相对应的调用bios例程代码的处理示例的流程图。

图56是图示根据第三实施例的与注入代码中的处理相对应的调用bios例程代码的处理示例的流程图。

图57是图示存储在数据rom中的对应关系表的示例的图示。

图58是图示rom使用对应关系表擦除bios例程的示例的流程图。

图59a是图示第三实施例中的差分程序合并处理的示例的流程图。

图59b是图示第三实施例中的差分程序合并处理的示例的流程图。

图60是图示控制是否允许写入rom的控制电路的示例的示意图。

图61是图示使用控制电路的写入控制操作的示例的流程图。

图62是图示在嵌入式设备中在动态配置或者更新信息的更新操作期间电源停止的情况下的恢复处理的示例的流程图。

具体实施方式

为描述清楚起见,在下文的描述和附图中适当作出省略和简化。附图中作为进行各种处理的功能块图示的元素能够由cpu、存储器以及作为硬件的其他电路构成并且通过加载到存储器等作为软件的程序来实现。因此,本领域技术人员应理解,这些功能块中的每一个均能够以仅硬件、仅软件或者硬件和软件的组合的各种形式来实现并且不限于这些形式中的任何一种。在附图中,相同的附图标记表示相同的元素并且视需要省略重复性描述。

通过使用各种类型的非瞬态计算机可读介质来存储上述程序并且能够将其提供给计算机。非瞬态计算机可读存储介质包括各种类型的有形存储介质。非瞬态计算机可读介质的示例包括:磁记录介质(例如,软盘、磁带和硬盘驱动器)、磁光记录介质(例如,磁光盘)、cd-rom(只读存储器,readonlymemory)、cd-r、cd-r/w、以及半导体存储器(例如,掩模型rom、prom(可编程rom,programmablerom)、eprom(可擦prom,erasableprom)、闪存rom和ram(随机存取存储器,randomaccessmemory))。可以由各种类型的瞬态计算机可读介质将程序提供给计算机。瞬态计算机可读介质的示例包括电子信号、光信号以及电磁波。瞬态计算机可读介质能够经由诸如电线或光纤的有线通信路径或者无线通信路径提供程序。

概要在详细阐述实施例之前,首先描述实施例的概要。图1是图示与实施例概要有关的嵌入式设备1的构造的框图。如图1所示,嵌入式设备1具有网络输入/输出单元2、非易失性存储器3、cpu4以及地址转换器5。

网络输入/输出单元2经由网络接收更新信息。更新信息是用于更新嵌入式设备1的程序和数据的信息。非易失性存储器3是具有能够独立地向/从其写入/读取数据的多个层面的rom并且例如是闪存。在非易失性存储器3中,默认程序(更新前程序)被配置在第一层面中,并且相对于默认程序的差分程序被配置在第二层面中。差分程序包括在由网络输入/输出单元2接收的更新信息中。在网络输入/输出单元2接收到更新信息之后,差分程序被配置在非易失性存储器3中。差分程序也被称作更新差分程序。cpu4执行配置在非易失性存储器3中的程序。地址转换器5通过使用包括在由所述网络输入/输出单元2接收的更新信息中的地址转换表来进行地址转换。当通过由cpu4解码指令获得的地址与对应于默认程序中的变更部分的地址相对应时,地址转换器5将地址转换成在其中配置有差分程序的地址。cpu4根据由地址转换器5转换的地址来执行差分程序。通过这种方式,cpu4执行通过默认程序和差分程序制成的更新程序。

如上所述,因为在嵌入式设备1中由地址转换器5进行地址转换,所以无需使用更新前程序和差分程序来进行程序的重建。

第一实施例

在下文中,将参照附图来具体描述第一实施例。

图2是图示根据第一实施例的信息系统10的构造示例的示意图。信息系统10包括开发环境20、管理服务器30以及嵌入式设备40。管理服务器30与嵌入式设备40经由网络15彼此连结。嵌入式设备40对应于控制设备,诸如车内ecu(电子控制单元,electroniccontrolunit)或者工业fa(工厂自动化,factoryautomation)控制设备。虽然图2示出提供一个开发环境20、一个管理服务器30以及一个嵌入式设备40的情况,但管理服务器30的数目以及嵌入式设备40的数目可以是任意数目。多个管理服务器30可以被级联连结。网络15可以是任意网络,只要管理服务器30以及嵌入式设备40能够互相连结即可。因此,网络15可以由有线连结和/或无线连结来构成。网络15例如包括因特网、广播波以及车内/工业网络。

在信息系统10中,更新前程序的源代码、更新前程序的目标代码、已更新的程序的源代码等被输入到开发环境20。由开发环境20生成的更新信息文件50经由网络15发送到嵌入式设备40。在嵌入式设备40中,更新前程序的目标代码65初步地配置在存储器中。嵌入式设备40接收包括在更新信息文件50中的差分程序目标代码51以及地址转换表52并且执行已更新的程序。将在下面对此具体描述。

图3是图示开发环境20的构造示例的框图。开发环境20是由信息系统10中的更新差分程序的生成器使用的计算机系统。在下面的描述中,更新差分程序(差分程序)也被称作更新差分代码或者更新差分二进制码。更新差分程序(差分程序)是更新前程序与已更新的程序之差的程序。开发环境20生成更新信息文件50,其被分配到一个或多个嵌入式设备40。开发环境具有输入单元21、数据处理单元22以及输出单元23。

输入单元21是由更新差分程序的生成器使用以向开发环境20发出指令的设备。在本示例的情况下,输入单元21用于发出生成例如由嵌入式设备40使用的更新信息文件50的指令。输入单元21接收作为输入的更新前程序源代码61、与更新前程序源代码61相对应的更新前程序目标代码62、已更新的程序源代码以及回滚信息位置地址64。更新前程序是目前正在嵌入式设备中运行的程序。已更新的程序是将在嵌入式设备中新运行的程序并且能够被称作更新程序。回滚信息位置地址64例如当在程序更新中检测到一些异常时构成程序恢复点作为回滚目标的信息。

输出单元23是用于将更新信息文件50发送到管理服务器30的设备并且例如是输出接口。

数据处理单元22由图中未示出的处理设备和存储器构成。处理设备解释读取程序的内容并且执行数据处理。处理设备例如由cpu(中央处理单元,centralprocessingunit)、mpu(微处理单元,microprocessingunit)等构成。存储器是临时地存储在处理设备中使用的处理数据的存储设备。存储器例如是ram(随机存取存储器,randomaccessmemory)等。在存储器中存储协助生成更新信息文件50等的程序。该程序包括:将已更新的程序源代码63转换成已更新的程序的目标代码的编译程序、提取两个源代码之间的差分程序源代码的程序、以及将差分程序源代码转换成适当的目标代码的编译程序和链接程序、或者将两个程序目标代码之差转换成差分程序目标代码的编译程序和链接程序。

更新信息文件50包括用于更新在嵌入式设备40中操作的更新前程序目标代码62的信息。具体地,更新信息文件50由更新差分代码51、地址转换表52、注入代码70以及回滚信息位置地址64制成。在下面的描述中,更新差分代码还将被称作更新差分二进制码、更新差分目标代码等。稍后将描述更新信息文件50的细节。在下文中将通过使用注入代码来描述实施例。然而,通过使用由调用函数的名称和函数的变元序列制成的数据序列来置换注入代码,可以实现一种从嵌入式设备中的数据序列构成与注入代码相对应的函数的形式。通过采用这种实现方法,在构成与注入代码相对应的函数时,能够更加安全地实现对注入代码的有效性验证,诸如对数据序列签名的验证。

接下来,将描述管理服务器30的构造。图4是图示管理服务器30的构造示例的框图。管理服务器30是一旦处于信息系统10中便接收开发环境20的输出,并且在此之后将更新信息文件50分配到一个或多个嵌入式设备40的计算机系统。管理服务器30具有输入单元31、显示单元32、数据处理单元33、存储单元34以及网络连结单元35。

输入单元31是用于将更新信息文件50传递到数据处理单元33的设备。开发环境20与输入单元31可以被任意连结,只要使它们互相连结即可。因此,连结可以是有线连结和/或无线连结。针对连结,例如,使用因特网或者广播波。

显示单元32是显示作为到管理服务器30的输入信息的各种数据等以及处理结果的输出设备。例如,使用crt(阴极射线管,cathoderaytube)显示器或者液晶显示器作为显示单元32。

数据处理单元33由图中未示出的处理设备和存储器构成。处理设备解释读取的更新信息文件50中的数据并且执行数据处理。处理设备例如是cpu、mpu等。存储器是临时地存储在处理设备中使用的处理数据的存储设备。存储器例如是ram等。在存储器中,存储用于协助将更新信息文件50转换成适于网络15中的传输协议的形式的程序。该程序包括:在划分传送包括在更新信息文件50中的更新差分程序目标代码和地址转换表的情况下,进行分割他们的处理、校正根据划分将已分割的更新差分程序目标代码和已分割的地址转换表定位到嵌入式设备中所需的注入代码中的每一个的处理等的程序。

存储单元34是向/从其存储/读取各种数据的设备。存储单元34例如是hdd(硬盘驱动器,harddiskdrive)、光存储设备或者闪存设备。就本示例而言,在存储单元34中存储更新信息文件50等。网络连结单元35是用于将管理服务器30连结到网络15的通信设备。

接下来,将描述嵌入式设备40。图5是图示嵌入式设备40的构造示例的框图。信息系统10中的嵌入式设备40是在其上操作要更新的程序的设备。嵌入式设备40例如是嵌入式控制器,其控制受控设备400,并且具有:cpu401、转换由cpu401执行的程序的地址的地址转换器402、中断控制器403、加密处理单元404、dma(直接存储器存取,directmemoryaccess)控制器405、sram(静态随机存取存储器,staticrandomaccessmemory)406、具有能够独立地从/向其读取/写入/擦除数据的三个层面的构造的程序rom(只读存储器,readonlymemory)407、具有能够独立地从/向其读取/写入/擦除数据的三个层面的构造的数据rom408、can(控制器局域网络,controllerareanetwork)接口409、以及输入/输出接口410。程序rom407和数据rom408例如具体是非易失性存储器,诸如闪存。cpu401通过使用配置在数据rom408中的数据来执行配置在程序rom407中的程序。程序rom407和数据rom408具体是非易失性存储器,诸如闪存。cpu401通过使用配置在数据rom408中的数据来执行配置在程序rom407中的程序。加密处理单元404是进行安全管理密钥、使用密钥加密或解码程序或数据、颁发签名、验证签名等的单元。加密处理单元404例如验证更新信息的签名。加密处理单元404也被称作签名验证单元。加密处理单元404例如通过由包括在加密处理单元404中的未示出的cpu执行程序来进行上述处理。在程序rom407中,默认程序被配置在任一个层面中,并且不同于默认程序的差分程序被配置在另一个层面中。在数据rom408中,默认数据被配置在任一个层面中,并且不同于默认数据的差分数据被配置在第二层面中。差分程序和差分数据包括在由can接口409接收的更新信息中。can接口409也被称作网络输入/输出单元并且经由网络15接收更新信息。地址转换器402通过使用包括在由can接口409接收的更新信息中的地址转换表来进行地址转换。

虽然在图5所示的示例中嵌入式设备40不具有子cpu,但如图6所示,嵌入式设备40可以具有:主cpu401、转换由cpu401执行的程序的地址的地址转换器402、中断控制器403、加密处理单元404、子cpu411、由子cpu411使用的程序rom412、dma控制器405、sram406、具有能够独立地从/向其读取/写入/擦除数据的三个层面的构造的程序rom407、具有能够独立地从/向其读取/写入/擦除数据的三个层面的构造的数据rom408、can接口409以及输入/输出接口410。程序rom412可以物理地配置在程序rom407中。

图7是图示根据实施例的地址转换器402的概要的示意图。例如,在输入到地址输入单元421的地址是要转换的地址的情况下,地址转换器402通过使用两个地址转换表420a和420b中的任一个来转换该地址并且从地址输出单元422输出结果地址。例如,两个地址转换表420a和420b中的一个是由第n次更新使用的表格,并且另一个是由第(n+1)次更新使用的表格。如上所述,在第(n+1)次更新中,例如,在通过地址转换表420a的转换的基础上进行的程序的执行切换为在通过地址转换表420b的转换的基础上进行的程序的执行。

地址输入单元421是地址转换器402中的地址输入接口并且接收通过由cpu401(更具体地,cpu401的内核)解码指令而生成的地址。可以直接地从cpu401的内核或者经由总线输入地址。地址输出单元422是地址转换器402中的地址的输出接口并且将地址输出到程序rom407和数据rom408连结的存储器总线。地址输出单元422可以不经由存储器总线而直接地输入到程序rom407和数据rom407。

在这种构造下,在地址转换器402中,将包括在更新信息文件50中的地址转换表52设定为地址转换表420a或420b。针对来自地址输入单元421的输入地址,地址转换器402使用由选择器424基于选择位423选择的地址转换表来进行转换,并且输出来自地址输出单元422的输出地址。地址转换器402能够切换使用由选择器425选择的地址转换表的转换的有效性/无效性。

通过上述地址转换来进行由cpu执行的程序地址的转换,并且作为更新前程序目标代码的更新部分的更新差分程序目标代码被适当地制成可执行的,由此使得能够执行已更新的程序目标代码。

接下来,将更加具体地描述地址转换器402的连结关系。图8是图示地址转换器402的更加具体的连结示例的框图。具体地,嵌入式设备40具有作为地址转换器402的用于程序rom407的地址转换器402a以及用于数据rom408/的地址转换器402b。在本实施例中,鉴于程序rom的层面的数目是三个,嵌入式设备40具有两个用于程序rom407的地址转换器402a。类似地,嵌入式设备40具有两个用于数据rom408的地址转换器402b。用于程序rom407的地址转换器402a提供在指令总线接口426与存储器总线427之间并且将通过转换来自指示总线接口426的转换前地址而获得的地址输出到存储器总线427。用于数据rom408的地址转换器402b提供在操作数总线接口428与存储器总线427之间并且将通过转换来自操作数总线接口428的转换前地址而获得的地址输出到存储器总线427。指令总线接口426和操作数总线接口428中的每一个均被连结到由哈佛结构构成的处理器内核429(cpu401)。

当通过由cpu401解码指令而获得的地址是与默认程序中的变更部分相对应的地址时,用于程序rom407的地址转换器402a将该地址转换成差分程序位于其中的地址。当通过由cpu401解码指令而获得的地址是与默认数据中的变更部分相对应的地址时,用于数据rom408的地址转换器402b将该地址转换成差分数据位于其中的地址。cpu401根据由用于数据rom408的地址转换器402b转换的地址来执行差分程序。如上所述,在本实施例中,除用于程序rom407的地址转换器402a之外,嵌入式设备40还具有用于数据rom408的地址转换器402b。因此,不仅能够处理程序代码的更新,而且能够处理数据的更新。一般地,当数据位于程序rom中并且更新数据rom时,因为地址不同于原始数据的地址,因此用于访问已更新的数据的程序代码也被变更。因为这种变更,出现差分代码数量增多的问题。通过使用地址转换器,能够在尽可能抑制程序代码上地址的改变的同时更新数据,并且能够减少差分代码的增加量。

接下来,将描述已更新的程序的执行处理。图9是解释已更新的程序的执行处理的示例的示意图。将详细分析更新前程序目标代码位于程序rom407的第一层面中,并且更新差分程序目标代码的一部分位于程序rom407的第二层面中的实例。假设位于第二层面中的代码块800与作为更新前程序目标代码的一部分的代码块801相对应。在由cpu401执行程序时,通过由地址转换器402执行地址转换,将代码块801替换为代码块800,并且执行程序。通过这种方法,能够执行已更新的程序。在下文中将对图9中执行已更新的程序的示例予以描述。

首先,cpu401中的程序计数器的值为w(参照图中的(1))。由于此时在地址转换表中的转换源地址中不存在w,地址转换器402输出w(参照图中的(2))。随后,cpu401执行地址w中的指令jumpx并且将程序计数器改写成x(参照图中的(3))。接下来,cpu401尝试读取地址x中的指令(参照图中的(4))。然而,由于x匹配转换源地址(参照图中的(5)),地址转换器402输出地址y(参照图中的(6))。因此,cpu401从地址y中读取指令并且执行该指令(参照图中的(7))。此后,程序计数器的值被变更为x+1,由地址转换器402将x+1改为y+1,并且执行地址y+1中的指令。指令jumpz位于已更新的代码块800的末尾并且由cpu401来执行(参照图中的(8))。此后,cpu401从更新前程序的地址z继续执行(参照图中的(9))。

现将描述由地址转换器402进行的地址转换的细节。地址转换器402具体地变更通过由cpu401解码指令而获得的地址中的预定位数的高位比特序列(下文称作高位地址),并且将已变更的高位比特序列与地址中的低位比特序列(下文也称作低位地址)连结来实现地址转换。特别地,地址转换器402确定输入的高位地址是否匹配在地址转换表中注册的转换源地址,当它们匹配时,将高位地址替换为转换目的地地址,将低位地址连结到已转换的高位地址,并且输出结果。如上所述,地址转换器402通过使用高位地址的一定数目的比特作为一个区段来进行地址转换。通过这种方式,能够使得地址转换表的大小小于在转换地址的全部比特的情况下的地址转换表的大小。图10是解释由地址转换器402进行地址转换的细节的示意图。在此,假设地址的比特数是32比特,并且在地址转换器402中设定的区段大小是2s字节。在此情况下,在例如最多写入k条转换的地址转换表中,存储一对作为转换源地址的32比特的高位地址和作为转换目的地地址的32比特的高位地址。地址转换器402通过比较器430确定转换前地址的高位地址是否匹配在地址转换表中指示的转换源的地址。当地址匹配时,选择器431输出在地址转换表中指示的转换目的地的地址,并且当地址不匹配时,输出转换前地址的高位地址。此后,连结设备430将从选择器431输出的32比特的高位地址与s比特的转换前地址的低位地址连结以生成已转换的地址。

使用用于数据rom的地址转换器402b来执行更新程序的处理也是将转换源的高位地址转换成转换目的地的高位地址、将低位地址连结到结果地址、以及在重新定位的数据rom408上访问数据表等的处理。可以添加将描述的设备。通过下列设备,也在新定位的序列的数据表等变成超过由用于数据rom的地址转换器402b处理的区段大小的大数据表的情况下,能够实现更新。图11a和11b是解释在数据表的大小在更新之后超过由用于数据rom的地址转换器402b处理的区段大小的情况下地址转换的示例示意图。图11a图示在第一次访问数据表时的转换。图11b图示在第二次和随后多次访问数据表时的转换。

在此情况下,同样假设地址的比特数是32比特并且在地址转换器402中设定的区段大小是2s字节。即,区段大小变成s比特地址空间的大小。一般地,在访问数据表中,访问的地址仅因序列元素等的地址偏移而变化。

在第一次访问数据表时,用于数据rom的地址转换器402b基于地址转换表将转换前高位地址(pre_addr_old)和已转换的高位地址(post_addr_old)存储一次到寄存器等中。在第一次访问时,用于数据rom的地址转换器402b在转换之后连结与高位地址连结的全部为0的s位比特序列,并且输出结果作为已转换的地址。在第二次和随后多次访问数据表时,用于数据rom的地址转换器402b如下输出已转换的地址。将第二次和随后多次访问时的转换前高位地址被描述为pre_addr_new。当pre_addr_new匹配地址转换表的转换源地址时,用于数据rom的地址转换器402b将在地址转换表中指示的转换目的地高位地址与输入的低位地址连结并且输出结果作为低位地址。反之,当pre_addr_new不匹配地址转换表的转换源地址时,用于数据rom的地址转换器402b获得pre_addr_new与pre_addr_old之差addr_diff。即,计算addr_diff=pre_addr_new-pre_addr_old。当差值addr_diff中除预定t个低位比特以外的全部比特都为零时,用于数据rom的地址转换器402b将通过post_addr_old与addr_diff之和生成的高位地址(post_addr_old+addr_diff)连结到低位地址并且输出结果。当差值addr_diff中除预定t个低位比特以外的全部位都非零时,用于数据rom的地址转换器402b将pre_addr_new与低位地址连结并且输出结果。即,在此情况下,用于数据rom的地址转换器402b确定访问不再是对数据表的访问并且在不转换的情况下输出输入地址。

通过地址转换方法,新程序能够适合于例如原始地配置在数据rom中的序列大小变大到超过区段边界的情况。关于到序列大小匹配的部分的地址,在默认程序和更新程序中,地址转换器能够访问相同的地址。因此,当相同地址的值不存在改变时,只有进行对增加部分的访问的程序代码变成差分代码。具体地,在下文将公开的地址转换方法中,进行对增加部分的访问的差分代码能够是进行对序列大小匹配的部分的地址之后的地址的访问的代码。

接下来,将描述更新前程序与差分程序之间的程序执行转移。图12是图示更新前程序与差分程序之间的程序执行转移状态的示意图。在此情况下,更新前程序的目标代码被配置在存储空间a中。在存储空间a中,例如,const变量,配置在文本区段中的常数变量,诸如枚举类型的值及其值被配置在存储区域802中,函数f被配置在存储区域803中,函数g被配置在存储区域804中,函数h被配置在存储区域805中,具有初始值的变量被配置在存储区域806中,不具有初始值的变量被配置在存储区域807中,并且堆栈等被配置在存储区域808中。在存储空间b中配置更新差分程序的目标代码。假设补丁809与对应于函数f的一部分的更新差分程序目标代码相对应,补丁809与对应于函数g的一部分的更新差分程序目标代码相对应,并且补丁811与对应于函数h的一部分的更新差分程序目标代码相对应。现将描述图12中写入的代码之间的程序执行转移的示例。

首先,在由cpu401执行函数f期间,程序的执行转移到补丁809的报头地址。在补丁809中执行函数g期间,调用配置在存储空间a中的函数g的报头地址。在完成函数g的调用之后,程序的执行转移到在补丁809中调用函数g的位置的下一地址,并且执行补丁809中的剩余程序。在完成补丁809的执行之后,程序的执行转移到程序应返回的函数f的地址。接下来,在由cpu401执行函数g期间,程序的执行由地址转换转移到补丁810的报头地址。在补丁810中执行函数h期间,调用配置在存储空间a中的函数h的报头地址。在完成函数h的调用之后,程序的执行转移到在补丁810中函数g的调用位置的下一地址,并且执行补丁810的剩余程序。然后,在完成补丁810的执行之后,程序的执行转移到程序应返回的函数g的地址。接下来,在cpu401中执行函数h期间,通过地址转换,程序的执行转移到补丁811的报头地址。在完成补丁811的执行之后,程序的执行转移到程序应返回的函数h的地址。此后,cpu401继续函数h的执行并且完成程序的执行。

现将参照图13至图16描述已转换的地址与差分代码之间对应关系的示例。图13是图示已转换的地址与差分代码之间对应关系的示例的示意图。作为示例,将描述通过替换要用差分代码813置换的代码812来执行已更新的程序的情况予以。图13中所示的示例涉及差分代码的大小t与要置换的代码的大小s相同或者小于要置换代码的大小s的情况,以及s和t等于或小于在用于程序的地址转换器402a中设定的区段大小的情况。当由cpu401对程序的执行达到要置换的代码812的报头地址时,由用于程序的地址转换器402将在程序计数器中设定的地址转换为差分代码813的报头地址,并且执行程序转换。在用于程序的地址转换器402a将转换前地址依次地转换为差分代码813的地址时,程序的执行继续到差分代码813的末尾地址。在差分代码813的末尾地址中,配置到要置换的代码812的末尾地址的下一地址的跳转指令,并且重新启动剩余程序的执行。

图14是图示已转换的地址与差分代码之间对应关系的另一示例的示意图。作为示例,将描述通过替换要用差分代码815置换的代码814来执行已更新的程序的情况。图14中所示的示例对应于差分代码的大小t大于要置换的代码的大小s的情况或者s或t中的任一个大于在用于程序的地址转换器402中设定的区段大小的情况。当cpu401的程序执行达到要置换的代码814的报头地址时,由用于程序的地址转换器402将在程序计数器中设定的地址替换成差分代码815的报头地址,并且执行程序转换。在差分代码815的报头,配置与到更新差分程序的起始地址的跳转指令有关的指令。与跳转指令有关的指令包括执行跳转的目标代码,并且视需要可以包括执行保存和恢复存储在寄存器中的数据的目标代码、以及执行计算跳转目的地的地址的目标代码。存在执行保存和恢复存储在寄存器中的数据的目标代码出于下列原因而变得必要的情况。一般地,需要插入计算跳转指令的跳转目的地地址的指令。在生成更新差分二进制码时插入对于跳转指令的地址计算所需的指令序列和跳转指令,并且指令序列并非原始存在于用于生成更新差分二进制码的更新程序中。即,指令序列是当执行更新程序时并未原始出现的指令序列。因而,指令序列的执行可以产生与原始的cpu寄存器状态不同的cpu寄存器状态。因此,通过在执行指令序列之前将其保存在寄存器中来保持cpu的寄存器状态并且在执行之后恢复寄存器状态,能够消除指令序列对cpu寄存器状态的影响。跳转目的地的地址例如是完成与跳转指令有关的指令序列的目标代码的地址的下一地址。因而,在通过跳转指令进行程序转移之后,cpu401继续程序执行直到差分代码815的末尾地址。在差分代码815的末尾地址,配置到要置换的代码814的末尾地址的下一地址的跳转指令,并且重新启动更新前代码的剩余程序的执行。

如上所述,当能够替换要置换的部分的代码的差分代码的大小大于程序中要置换的部分的代码的大小时,或者当要置换的代码的大小或差分代码的大小大于区段大小时,地址转换器402进行下列地址转换。特别地,地址转换器402将要置换的部分的代码的起始地址转换到存储指示的地址,该指示与到替换要置换的部分的代码的指令序列的起始地址的跳转指令有关。通过这种方式,当替换要置换的部分的代码的差分代码的大小大于程序中要置换的部分的代码的大小时,或者当要置换的的代码的大小或差分代码的大小大于区段大小时,能够适当地实现已更新的程序的执行。

将参照图15和图16对变量被更新的情况下的示例予以描述。图15是图示在更新变量的情况下已转换的地址与差分代码之间对应关系的示例的示意图。本图涉及由差分代码替换要置换的代码并且执行已更新的程序的情况,并且与存在诸如const变量或枚举值的配置在文本区段中的常数变量的添加或改变或者存在具有初始值的变量的添加并且仅从差分代码访问这些变量的示例相对应。关于配置在存储空间b中的变量而不是相对于添加或改变变量的部分原始配置在存储空间a中的变量,根据图13或图14的执行方法来执行程序。变量被新配置为配置有差分代码的存储空间b中的差分代码的一部分。在执行差分代码时,相对于添加或变更变量的部分,参照存储空间b中的变量而不是原始配置在存储空间a中的变量来执行程序,由此实现变量值的更新。

图16是图示在更新变量的情况下已转换的地址与差分代码之间对应关系的另一示例的示意图。本图涉及要置换的代码被差分代码置换并且执行已更新的程序的情况,并且与在作为全局变量的具有初始值的变量或者作为局部变量的具有初始值的变量的初始值中存在改变或者在具有被称为来自更新前代码的初始值的变量中存在添加的示例相对应。关于使用地址转换机制来新配置在存储空间b中的变量组,相对于添加或变更值的部分,根据图13或图14的执行方法来执行程序。相对于变更初始值或者添加具有初始值的变量的部分,用于配置在存储空间a中并且受变更或添加影响的变量的组合的要添加的变量组或者已变更的变量组被新配置在配置有差分代码的存储空间b中。在执行差分代码时,通过使用地址转换机制相对于变量来执行差分代码,能够实现伴同程序执行的添加或变更。具体地,在局部变量的情况下,访问配置在存储空间b中的变量。另一方面,在全局变量的情况下,当重启配置在存储空间b中的变量时,在其被扩展到数据段之后(在数据段被分配的情况下的sram406或者在数据段被分配给数据rom408的情况下的数据rom408),执行伴同添加或变更具有初始值的变量的程序执行。通过用于更新bios函数的全局变量的数据rom擦除/写入处理函数或者用于更新稍后将描述的全局变量的数据rom编写处理函数来执行这样的扩展。更新差分二进制码被构造使得适当的自变量被传给那些函数以实行调用和执行。

接下来,将描述更新信息文件50的细节。更新信息文件50用于更新嵌入式设备的程序。如上所述,更新信息文件50由回滚信息位置地址64、地址转换表52、注入代码70以及更新差分程序目标代码51构成(图17)。在下文中,将描述更新信息文件50的元素中的每一个。

回滚信息位置地址64例如是当在程序更新中检测到一些异常时的程序恢复点的信息。在本实施例中,这是指在地址转换表中与之前曾补丁的更新差分程序目标代码相对应的存储区域的报头地址。假设地址转换表存储在数据rom408等中。存在配置多个地址转换表的可能性。在指定未在地址转换表中被提及的状态,即未应用补丁的状态作为恢复点的情况下,生成用于无效地址转换器402的注入代码。

如上所述,地址转换表52是描述用于更新差分程序执行的地址转换的对应关系的表格,该更新差分程序执行使用在更新前程序中应用补丁的代码部分的报头地址作为转换源地址以及补丁的报头地址作为转换目的地地址的。具体地,在本实施例中,地址转换表52是描述转换源地址的高位地址与转换目的地地址的高位地址之间的对应关系的表格。在此,假设能够指定k条地址转换的对应关系。k表示诸如32的常数并且通过硬件规格等来确定。

注入代码70是用于下述的程序组:调用bios程序使得执行将更新差分程序目标代码51配置到程序rom407中、将地址转换表52配置到数据rom408中、将地址转换表52设定到地址转换器402、使地址转换器402有效、视需要擦除程序rom407或数据rom408中的数据、使用异常检测作为触发条件的回滚处理、扩展bios程序使得执行从数据rom408到程序rom407的那些处理等。在此情况下,注入代码是用于将适当的自变量传给对应bios例程并且调用bios例程的程序。作为一种执行注入代码的方法,例如,经由can接口409将注入代码配置在sram406中,由中断控制器403使程序计数器移动到在其中配置注入代码的地址,并且执行注入代码。通过执行注入代码,对应bios启动,并且经由can接口409传送到sram406的诸如更新差分二进制码的数据被配置在程序rom407或数据rom408中。bios代码的配置位置可以在不执行程序rom407的层面中,或者在不执行数据rom408的层面中。可以在由can接口409的中断激活的中断处理程序中执行注入代码。例如,在由中断始终执行注入代码的情况下,可以写入全部bios代码以清除中断并且在执行结束时执行停止指令。

图18是注入代码的构造示例的示意图。通过下述的注入代码来构成注入代码70:例如更新二进制码的到程序rom407的写入处理的委托的注入代码701、地址转换表的到数据rom408的写入处理的委托的注入代码702、加载数据rom408上的地址转换表的注入代码703、使地址转换表有效/无效的注入代码704、用于更新局部变量的初始值的程序rom407的擦除/写入处理委托的注入代码705、用于更新全局变量的初始值的数据rom408的擦除/写入处理委托的注入代码706、用于更新局部变量的初始值的程序rom407的写入处理委托的注入代码707、用于更新全局变量的初始值的数据rom408的写入处理委托的注入代码708、到指定恢复点的回滚处理的注入代码709、到默认操作的回滚处理的注入代码710、更新取消处理的注入代码711、切换程序rom407的默认层面的注入代码712、切换数据rom408的默认层面的注入代码713、更新差分代码的验证处理(签名验证处理)委托的注入代码714、地址转换表的验证处理(签名验证处理)委托的注入代码715、将数据rom408上的bios代码写入程序rom407的写入处理委托的注入代码716等。稍后将对注入代码中的每一个的细节予以描述。

接下来,将描述执行注入代码前的流程。图19是解释执行注入代码前的流程的示意图。首先,从管理服务器30中的注入代码模板组中选择要生成的注入代码(注入代码a)的模板并且将其扩展到管理服务器30的存储器36上(参照图中的(1))。接下来,在管理服务器30中,根据注入代码的自变量定义,将实际自变量设定到注入代码a(参照图中的(2))。然后,将设定有实际自变量的注入代码a从诸如管理服务器30中的网络连结单元35的网络i/f发送到网络15(参照图中的(3))。嵌入式设备40从诸如can接口409的网络i/f经由网络接收设定有实际自变量的注入代码a(参照图中的(4))。例如,由来自can接口409的中断启动dma405或cpu401上的数据传送程序,并且将设定有实际自变量的注入代码a配置在sram控制器406中的特定区域中(参照图中的(5))。在使用dma控制器405的情况下,在通知表达配置完成的中断之后,或者在使用数据传送程序的情况下,在通知cpu401上的数据传送程序之后,将设定有实际自变量的注入代码a配置在sram406中的特定区域中。

在下文中,将描述注入代码中的每一个。图20是图示与下述注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图:加载数据rom408上的地址转换表的注入代码703、进行更新差分代码的验证处理委托的注入代码714、或者进行地址转换表的验证处理委托的注入代码715。

首先,在步骤2000(s2000),将数据报头地址配置到第一自变量arg1。在加载数据rom408上的地址转换表的注入代码703的情况下,将读取源的报头地址设定为第一自变量arg1。在进行更新差分代码的验证处理委托的注入代码714或者进行地址转换表的验证处理委托的注入代码715的情况下,将要验证对象的报头地址设定为第一自变量arg1。接下来,在步骤2001(s2001),将数据长度配置为第二自变量arg2。在加载数据rom408上的地址转换表的注入代码703的情况下,将要读取数据的数据长度设定为第二自变量arg2。在进行更新差分代码的验证处理委托的注入代码714或者进行地址转换表的验证处理委托的注入代码715的情况下,将要验证对象的数据长度设定为第二自变量arg2。接下来,在步骤2002(s2002),调用对应bios例程。

在由加载数据rom408上的地址转换表的注入代码703调用的bios例程中,加载数据rom408上的地址转换表。执行的示例如下。在由来自can接口409的中断通过dma传输在sram406中配置地址转换表的状态下,将数据rom408上的地址转换表的注入代码703配置在sram406中。由中断执行注入代码,并且生成bios例程调用。在bios例程中,在地址转换器402中设定配置在sram406中的地址转换表。

在由更新差分代码的验证处理委托的注入代码714调用的bios例程中,执行验证更新差分程序的目标代码的处理。执行示例如下。在由来自can接口409的中断通过dma传输在sram406中配置具有签名的更新差分程序的目标代码的状态下,由来自can接口409的中断将代码的验证处理委托的注入代码714配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行验证配置在sram406中的更新差分程序的目标代码的签名的处理。

在由地址转换表的验证处理委托的注入代码715调用的bios例程中,执行验证地址转换表的签名的处理。执行示例如下。在由来自can接口409的中断通过dma传输在sram406中配置具有签名的地址转换表的状态下,由来自can接口409的中断将地址转换表的验证处理委托的注入代码715配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,验证配置在sram406中的地址转换表的签名。

图21是图示与进行地址转换表的到数据rom408的写入处理委托的注入代码702中的处理相对应的调用bios例程代码的处理的处理示例的流程图。首先,在步骤2100(s2100),将读取数据的报头地址配置到第一自变量arg1。在步骤2101(s2101),将数据长度配置到第二自变量arg2。在步骤2102(s2102),将数据写入目的地的报头地址配置到第三自变量arg3。在步骤2103(s2103),调用对应bios例程。在由地址转换表的到数据rom408的写入处理的委托的注入代码702调用的bios例程中,执行地址转换表的到数据rom408的写入处理。执行示例如下。在由来自can接口409的中断通过dma传输在sram406中配置地址转换表的状态下,由来自can接口409的中断将地址转换表的到数据rom408的写入处理委托的注入代码702配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行配置在sram406中的地址转换表的到数据rom408的写入处理。

图22是图示与下述注入代码中的处理相对应的调用bios例程代码的处理的处理示例的流程图:进行更新差分程序的目标代码的到rom407的写入处理委托的注入代码701、或者进行配置在数据rom408上的bios例程代码的到程序rom407的写入处理委托的注入代码716。首先,在步骤2200(s2200),将在sram406上的在其中配置到程序rom407的写入处理程序(驱动程序)的地址配置到第一自变量arg1。写入处理程序被初步地配置在程序rom407中的特定地址上。接下来,在步骤2201(s2201),将传给写入处理程序的自变量的帧指针配置到第二自变量arg2。在步骤2200和2201设定的自变量是操作rom的驱动程序所需的自变量。这是由于在sram406上必须执行对程序rom407的改写。随后,在步骤2202(s2202),将读取数据的报头地址配置到第三自变量arg3。在步骤2203(s2203),将读取数据的数据长度配置到第四自变量arg4。在步骤2204(s2204),将数据写入目的地的报头地址配置到第五自变量arg5。在步骤2205(s2205),调用对应的bios例程。

在由更新差分程序的目标代码的到程序rom407的写入处理的委托的注入代码701调用的bios例程中,将到程序rom407的写入处理程序配置在被指定为第一自变量的sram406的地址中,作为第二自变量的帧指针被传给写入处理程序,并且执行写入处理程序,由此进行将更新差分程序的目标代码写入程序rom407的处理。执行示例如下。在由来自can接口409的中断通过dma传送在sram406中配置更新差分程序的目标代码的状态下,由来自can接口409的中断将更新差分程序的目标代码的到程序rom407的写入处理委托的注入代码701配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行将配置在sram406中的更新差分程序的目标代码写入程序rom407的处理。配置在sram406中的写入程序rom407的写入处理程序可以实现为使用sram406作为工作存储器的专用硬件。

在由将配置在数据rom4048上的例程代码写入程序rom407的处理的委托调用的bios例程中,到rom407的写入程序配置在指定为第一自变量的sram406的地址中,指定为第二自变量的帧指针传给写入处理程序,并且执行写入处理程序,由此进行将配置在数据rom408上的bios例程代码写入程序rom407的处理。执行示例如下。通过来自can接口409的中断,配置在数据rom408上的bios例程代码的到程序rom407的写入处理的委托的注入代码716被配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行将配置在数据rom406中的bois例程代码写入程序rom407的处理。

图23是图示与进行到默认程序操作的回滚处理的委托的注入代码710以及进行更新取消处理的委托的注入代码711中的处理相对应的调用bios例程代码的处理的处理示例的流程图。在步骤2300(s2300),调用对应bios例程。在由到默认程序操作的回滚处理委托的注入代码710调用的bios例程中,执行默认程序操作的回滚处理。执行示例如下。由来自can接口409的中断将到默认程序的回滚处理委托的注入代码710配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行到默认程序操作的回滚处理。在到默认程序操作的回滚处理中,例如,进行设定,使得在下一次重新启动时执行地址转换器402的无效化。在由更新取消处理委托的注入代码711调用的bios例程中,执行更新取消处理。执行示例如下。通过来自can接口409的中断,更新取消处理委托的注入代码711被配置在sram406中,由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行更新取消处理。在更新取消处理中,例如,检查程序rom407或者数据rom408中写入的部分,并且擦除写入的部分。当在更新操作之前保存程序状态时,进行从保存的状态重启程序的处理。

图24是图示与进行到指定恢复点的回滚处理的委托的注入代码709中的处理相对应的调用bios例程代码的处理的处理示例的流程图。例如,存在下列用于回滚的先决条件。特别地,先决条件是:更新差分代码被多次配置在程序rom407中,更新差分代码中不包括具有初始值的局部变量和全局变量的程序被配置在程序rom407中而不被重写,并且在更新差分代码中包括的具有初始值的局部变量和全局变量直到随后被存储在rom408中,如同地址转换表被存储在数据rom408中。通过设定对应地址转换表,能够设定处理回滚的更新差分代码(不包括具有初始值的局部变量和全局变量的程序)。存在在一些更新中已经重写具有初始值的局部变量和全局变量,使得在回滚时必须改写变量的可能性。

在步骤2400(s2400),将与恢复点相对应的地址转换表的报头地址配置到第一变量arg1。在步骤2401(s2401),将与恢复点相对应的地址转换表的条目数配置到第二变量arg2。在步骤2402(s2402),调用设定与恢复点相对应的地址转换表的bios例程a。下列步骤2403至2407仅执行必要的次数。在步骤2403(s2103),将擦除块编号配置到第一自变量arg1。擦除块编号是为实现变量更新而要在程序rom407或者数据rom408中擦除的块的编号。在步骤2404(s2404),在其中配置与回滚到差分程序中变量更新部分相对应的代码的在数据rom408上的区域的报头地址被配置到第二自变量arg2。即,报头地址是读取数据的报头地址。在步骤2405(s2405),将读取数据的数据长度配置到第三自变量arg3。在步骤2406(s2406),将数据写入目的地的报头地址配置到第四自变量arg4。在步骤2407(s2407),调用擦除/写入程序rom407和数据rom408的bios例程b,使得实现在指定恢复点的具有初始值的局部变量和全局变量的配置状态。通过如上所述设定变量,写入在具有初始值的局部变量和全局变量中的要写入的对象,该具有初始值的局部变量和全局变量被包括在更新差分代码中,直到随后被存储在数据rom408中。具体地,在局部变量的情况下,将其写入其报头地址是程序rom407上指定用于程序执行的地址的区域内。在全局变量的情况下,将其写入其报头地址是数据rom408上指定用于程序执行的地址的区域内。在由到指定恢复点的回滚处理的委托的注入代码709调用的bios例程中,进行到指定恢复点的回滚处理。执行示例如下。由来自can接口409的中断在sram406中配置到指定恢复点的回滚处理委托的注入代码709,由中断执行注入代码,并且调用bios例程。在bios例程中,执行到指定恢复点的回滚处理。在到指定恢复点的回滚处理中,首先,在地址转换器402中设定与最初指定的恢复点相对应的地址转换表,其次,执行擦除/写入程序rom407和数据rom408,使得实现在指定恢复点的具有初始值的局部变量和全局变量配置状态的处理。

图25是图示与进行切换程序rom407的默认程序配置层面的处理的委托的注入代码712或者进行切换数据rom408中的默认程序配置层面的处理的委托的注入代码713中的处理相对应的调用bios例程代码的处理的处理示例的流程图。在步骤2500(s2500),将作为默认使用的rom的报头地址配置到第一变量arg1。在步骤2501(s2501),调用对应bios例程。在由切换程序rom407中的默认程序配置层面的处理的委托的注入代码712调用的bios例程中,执行切换程序rom407中的默认程序配置层面的处理。在由切换数据rom408中的默认程序配置层面的处理的委托的注入代码713调用的bios例程中,执行切换数据rom408中的默认程序配置层面的处理。执行示例如下。通过来自can接口409的中断,将切换程序rom407和数据rom408中的默认程序配置层面的处理的委托的注入代码712和713配置在sram406中。由中断执行注入代码,并且调用bios例程。在bios例程中,执行切换程序rom407和数据rom408中的默认程序配置层面的处理。

图26是图示与进行用于实现全局变量更新的数据rom408的擦除和写入处理的委托的注入代码706中的处理相对应的调用bios例程代码的处理的处理示例的流程图。在步骤2600(s2600),将擦除块编号配置到第一自变量arg1。擦除块编号是为实现变量更新而在数据rom408中擦除的编号。在步骤2601(s2601),将数据rom408或者sram406中的区域的报头地址配置到第二自变量arg2,该区域中代码与作为回滚对象的差分程序中全局变量更新部分相对应。即,报头地址是读取数据的报头地址。在步骤2602(s2602),将读取数据的数据长度配置到第三自变量arg3。在步骤2603(s2603),将数据写入目的地的报头地址配置到第四自变量arg4。在步骤2604(s2604),调用对应的bios例程。在由用于实现全局变量更新的数据rom408的写入和擦除处理的委托的注入代码706调用的bios例程中,执行用于实现全局变量更新的数据rom408的擦除和写入处理。执行示例如下。通过来自can接口409的中断,将用于实现全局变量更新的数据rom408的擦除和写入处理的委托的注入代码706配置在sram406中。由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行用于实现全局变量更新的数据rom408的擦除和写入处理。

图27是图示与进行用于实现全局变量更新的到数据rom408的写入处理的委托的注入代码708中的处理相对应的调用bios例程代码的处理的处理示例的流程图。在步骤2700(s2700),将(数据rom408或者sram406中的)区域的报头地址配置到第一自变量arg1,该区域中代码与作为回滚对象的差分程序中全局变量更新部分相对应。即,报头地址是读取数据的报头地址。在步骤2701(s2701),将读取数据的数据长度配置到第二自变量arg2。在步骤2702(s2702),将数据写入目的地的报头地址配置到第三自变量arg3。在步骤2703(s2703),调用对应bios例程。在由用于实现全局变量更新的到数据rom408的写入处理的委托的注入代码708调用的bios例程中,执行用于实现全局变量更新的到数据rom408的写入处理。执行示例如下。通过来自can接口409的中断,用于实现全局变量更新的到数据rom408的写入处理的委托的注入代码708被配置在sram406中。由中断执行注入代码,并且生成bios例程调用。在bios例程中,执行用于实现全局变量更新的到数据rom408的写入处理。

图28是图示与执行用于实现全局变量更新的到程序rom407的擦除和写入处理的委托的注入代码705中的处理相对应的调用bios例程代码的处理的处理示例的流程图。首先,在步骤2800(s2800),将在其中配置到程序rom407的擦除和写入处理程序(驱动程序)的sram406中的地址配置到第一自变量arg1。擦写处理程序被初步地配置在程序rom407中的特定地址上。接下来,在步骤2801(s2801),将传给擦写处理程序的自变量的帧指针配置到第二自变量arg2。在步骤2800和2801中设定的自变量是操作rom的驱动程序所需的自变量。这是由于在sram406上必须执行对程序rom407的改写。随后,在步骤2802(s2802),将擦除块编号配置到第三自变量arg3。擦除块编号是为实现变量更新而在程序rom407中要擦除的块的编号。在步骤2803(s2803),将在其中配置要回滚到的差分程序中局部变量更新部分的代码的在数据rom408或者sram406上的区域的报头地址配置到第四自变量arg4。即,报头地址是读取数据的报头地址。在步骤2804(s2804),将读取数据的数据长度配置到第五自变量arg5。在步骤2805(s2805),将数据写入目的地的报头地址配置到第六自变量arg6。在步骤2806(s2806),调用对应bios例程。在由用于实现局部变量更新的程序rom407的擦除和写入处理的委托的注入代码705调用的bios例程中,将用于程序rom407的擦除和写入程序配置在sram406中被指定为第一变量的地址上,并且被指定成第二变量的帧指针传给擦除和写入程序。通过执行擦除和写入程序,执行用于实现局部变量更新对程序rom407的擦除和写入处理。执行示例如下。由来自can接口409的中断将用于实现局部变量更新的到程序rom407的擦除和写入处理的委托的注入代码705配置在sram406中,由中断执行注入代码,并且调用bios例程。在bios例程中,进行用于局部全局变量更新的到程序rom407的擦写处理。配置在sram406中的用于程序rom407的擦写程序可以被实现为使用sram406作为工作存储器的专用硬件。

图29是图示与进行用于实现全局变量更新的到程序rom407的写入处理的委托的注入代码707中的处理相对应的调用bios例程代码的处理的处理示例的流程图。首先,在步骤2900(s2900),将在其中配置到程序rom407的写入处理程序(驱动程序)的sram406中的地址配置到第一自变量arg1。写入处理程序被初步地配置在程序rom407中的特定地址上。接下来,在步骤2901(s2901),将传给写入处理程序的自变量的帧指针配置到第二自变量arg2。在步骤2900和2901中设置的自变量是操作rom的驱动程序所需的自变量。这是由于在sram406上必须执行对程序rom407的改写。随后,在步骤2902(s2902),将在其中配置与要回滚到的差分程序中局部变量更新部分相对应的代码的在数据rom408或者sram406上的区域的报头地址配置到第三自变量arg3。即,报头地址是读取数据的报头地址。在步骤2903(s2903),将读取数据的数据长度配置到第四自变量arg4。在步骤2904(s2904),将数据写入目的地的报头地址配置到第五自变量arg5。在步骤2905(s2905),调用对应bios例程。在由用于实现局部变量更新的到程序rom407的写入处理的委托的注入代码707调用的bios例程中,写入处理程序配置在sram406中被指定为第一变量的地址上,并且被指定为第二变量的帧指针传给写入处理程序。通过执行写入程序,进行用于实现局部变量更新的程序rom407中的写入处理。执行示例如下。由来自can接口409的中断将用于实现局部变量更新的到程序rom407的写入处理的委托的注入代码707配置在sram406中,由中断执行注入代码,并且调用bios例程。在bios例程中,进行用于局部全局变量更新的到程序rom407的写入处理。配置在sram406中的写入处理程序可以被实现为使用sram406作为工作存储器的专用硬件。

图30是图示与进行地址转换有效/无效处理的委托的注入代码704中的处理相对应的调用bios例程代码的处理的处理示例的流程图。在步骤3000(s3000),将指定地址转换器402有效/无效的值配置到第一自变量arg1。在步骤3001(s3001),调用对应bios例程。在由使地址转换器有效/无效的处理的委托的注入代码704调用的bios例程中,进行使地址转换器有效/无效的处理。执行示例如下。由来自can接口409的中断将地址转换有效/无效处理的委托的注入代码704配置在sram406中,由中断执行注入代码,并且调用bios例程。在bios例程中,进行使地址转换器有效/无效的处理。

上文已经描述了各种注入代码。在图5的构造的情况下,由cpu401配置和执行注入代码,并且执行由注入代码调用的bios例程。在图6的构造的情况下,可以由主cpu401或者子cpu411执行操作。在由子cpu411执行操作的情况下,bios代码可以被配置在程序rom412中。在bios代码被配置在程序rom412中的情况下,由子cpu411执行bios例程,并且如图6中的虚线所示,复制到程序rom407和数据rom408中的每一个的传输路径,而不对主cpu401中目前正执行的程序的功能以及执行操作周期产生影响,在目前正执行的程序的运行期间,更新信息文件50能够被动态地配置在程序rom407和数据rom408中。在未使用如虚线所示的复制的传输路径的情况下,通过执行各种bios代码而将从子cpu411到程序rom407和数据rom408的访问设定为优先级最低的抢先访问,能够大幅减小对主cpu401中目前正执行的程序的执行操作的影响。

接下来,将描述注入代码的构造示例。图31a和图31b图示出注入代码的构造示例。图31a图示与由函数调用执行bios例程的情况相对应的示例,并且图31b图示出与由到bios例程的跳转指令执行bios例程的情况相对应的示例。在图31a和图31b中的每个图中,图示更新二进制码的到程序rom407的写入处理的委托的注入代码701作为示例。在由函数调用执行bios例程的情况下,注入代码由下述构成:通过设定到bios自变量的帧指针而制成的bios例程函数调用部分816、以及到bios例程的自变量的bios例程函数调用指示和配置部分817(参照图31a)。另一方面,在由到bios例程的跳转指令执行bios例程的情况下,注入代码由下述构成:通过设定到bios自变量的帧指针而制成的bios例程函数调用部分818、以及到bios例程的自变量的跳转指令和配置部分819(参照图31b)。

接下来,将描述bios代码配置示例。图32a和图32b是各自图示在三个层面的程序rom407中的bios代码的配置示例的示意图。图32a图示与更新程序而不伴同bios代码更新的情况相对应的示例。图32b图示与更新整个默认程序、包括bios代码的更新的情况相对应的示例。

首先,参照图32a,将描述更新程序而不伴同bios代码更新的情况。在图32a中,将相同的bios代码配置在三个层面中。将默认程序配置在层面a中,并且将目前执行的差分代码配置在层面b中。在层面a和b中,从默认程序更新的程序正被执行。现在,假设将新的更新差分程序配置在层面c中,在到层面c的更新差分程序的配置中,使用配置在层面c中的bios代码。在到层面c的更新差分程序的配置中,在sram406中扩展的程序rom的写入驱动程序执行写入。通过这种方式,在不干扰从cpu401到层面a和b的访问的情况下,能够将更新差分程序配置在层面c中。即,在层面a和b中的程序的执行期间,能够将更新差分程序配置在层面c中。配置在层面b和c中的更新差分程序中的每一个都是来自配置在层面a中的默认程序的更新差分程序。配置在层面b中的更新差分程序可以通过重用已经配置在层面b中的更新差分程序来构成。配置在层面c中的更新差分程序可以通过重用已经配置在层面c中的更新差分程序来构成。

接下来,参照图32b,将描述更新整个默认程序、包括bios代码的更新的情况。图32b图示层面a和c被擦除,新的默认程序和新的bios代码被配置在层面b中,并且配置在层面b中的新的bios代码被复制到层面a和c的状态。在该状态下进行下列处理。首先,通过由程序rom407的擦除处理的委托的注入代码调用和执行程序rom407中的擦除处理bios,擦除层面b。接下来,通过调用和执行来自程序rom的写入处理的委托的注入代码的程序rom写入处理,将新默认程序和新bios代码配置在层面b中。通过调用和执行来自默认层面切换处理委托的注入代码712和713的默认层面切换处理bios,在层面b的报头设定重启时的启动地址。在重启之前,将用于在程序rom407的层面a和c的重启期间执行擦除的程序rom擦除的委托的注入代码、以及用于在新的bios代码的重启期间执行复制到层面a和c的程序rom写入处理的委托的注入代码从sram406配置到数据rom408,将这两个注入代码从数据rom408扩展到sram406并且执行。注入代码被配置到数据rom408中一次的原因在于,存储在sram406中的数据在重启时丢失。重启之后,实现图32b中所示的程序配置结构,在层面b的报头设定程序起始地址,并且执行层面b的新默认程序。新的bios可以被配置在数据rom408中一次并且然后在适当的定时扩展到程序rom407。

接下来,将描述生成更新信息文件50的处理。图33a和图33b是图示生成与差分更新相对应的更新二进制码以及更新信息的处理的示例的流程图。流程图由开发环境20的数据处理单元22执行。具体地,本流程例如通过由数据处理单元22的处理设备执行存储在数据处理单元22的存储器中的程序来实现。

在步骤3300(s3300),数据处理单元22用初始值0置换变量“flag”。

在步骤3301(s3301),数据处理单元22确定回滚点是否被指定。当存在指定时,处理转移到步骤3302。当不存在指定时,处理转移到步骤3304。

在步骤3302(s3302),数据处理单元22从用户接收回滚点的指定的输入并且将其存储。

在步骤3303(s3303),数据处理单元22将变量flag的值更新为1。

在步骤3304(s3304),数据处理单元22比较更新前后的程序(地址未解决)以提取差分程序。在提取中,也可以考虑函数结构。具体地,在没有内联扩展包括在程序之一中的函数的情况下,使用调用图中的函数名称之间的对应关系作为函数对应结构,可以针对对应结构中的每一个提取差分。

在步骤3305(s3305),通过能够包括两个程序之间没有改变的部分的方法,数据处理单元22合并代码块,使得构成差分代码的代码块(替代块)的数目变成n或更小。例如,n是在地址转换表中能够设定的条目数和在其中配置更新差分程序的存储器区域中的区段数的最大值中较小的一个值。将参照图35a和图35b来描述合并处理的具体示例。

在步骤3306(s3306),数据处理单元22用构成差分代码的代码块的数目(替代块的数目)置换变量m。

在步骤3307(s3307),数据处理单元22将步骤3308重复m次,同时使变量“i”逐一从1增至m。

在步骤3308(s3308),数据处理单元22通过链接提取作为地址解决程序的更新前程序(默认程序)中的差分代码中的第i个代码块的报头地址。该报头地址与更新时的转换源的地址相对应。当代码块是指默认程序中的函数时,数据处理单元22提取函数的调用地址。

在步骤3309(s3309),数据处理单元22确定在地址转换表中设定的区段大小。该区段大小与要转换的高位地址的比特数相对应。在区段大小的确定中,可以考虑构成差分代码的代码块中的每一个的大小。例如,可以使用大小的最大值、中间值或者平均值。当确定区段大小的高位地址的比特数很小而不需要设备就能配置很大差分代码时,能够配置的差分代码块的数目变小。另一方面,当确定区段大小的高位地址的比特数很大时,在配置时需要如图11a、图11b或图14中所示的设备。然而,对于作为上限的地址转换表的条目数,能够配置较多数目的差分代码块。

在步骤3310(s3310),数据处理单元22参考在开发环境中保持的要更新的嵌入式设备40的rom的使用状态,并且确定构成差分程序的代码块中的每一个的配置位置(报头地址)。确定配置位置(报头地址),使得在步骤3309获得的每一区段大小配置到多一个代码块。在构成差分代码的代码块的配置中,可以重用程序rom407中的区域。这对设备而言也有可能,使得在任何范围内对程序rom407中的要重用区域的擦除次数变得一致。当擦除次数超过特定数目时,可以产生警报。基于警报,用户可以将来自差分代码更新的更新变更成图34中所示的通用程序更新或者将下一次更新设定为通用程序更新。参考擦除次数具有下列优点。例如,当使用闪存作为rom时,由于闪存因擦除和写入而发生劣化,通过设计使得擦除和写入不会集中发生在特定区域中,能够提高闪存的使用寿命。从质量保证的观点考虑,优选管理使得在改写次数的上限之后不进行改写。

在步骤3311(s3311),数据处理单元22参考更新前程序的符号信息(链接)并且获得从构成差分程序的代码块中的每一个中参考的地址解决符号的地址值。数据处理单元22通过使用在步骤3310确定的代码块中的每一个的报头地址,对地址未解决的符号或者地址未解决的代码进行地址解决。

在步骤3312(s3312),数据处理单元22生成地址解决的差分程序。

在步骤3313(s3313),数据处理单元22重复步骤3314,同时使变量j逐一从1增至m。

在步骤3314(s3314),数据处理单元22提取构成差分程序的代码块j中的每一个的在步骤3310中获得的报头地址作为已转换的地址。

在步骤3315(s3315),数据处理单元22合并在步骤3308获得的代码块中的每一个的转换前地址以及在步骤s3314提取的已转换的地址作为对应关系表以生成地址转换表。

在步骤3316(s3316),数据处理单元22生成地址转换表的到数据rom408的写入处理的委托的注入代码702。

在步骤3317(s3317),数据处理单元22生成更新二进制码的到程序rom的写入处理的委托的注入代码701。

在步骤3318(s3318),数据处理单元22确定变量flag的值是否匹配1。当该值匹配1时,处理转移到步骤3319。当该值不匹配时,处理结束。

在步骤3319(s3319),数据处理单元22生成到指定恢复点的回滚处理的委托的注入代码709。例如,当由差分程序更新或者安全异常发生中断时,执行该注入代码。在从注入代码执行的回滚bios代码完成执行后,可以执行更新取消bios代码调用。

图34是图示生成与通用程序更新相对应的更新二进制码以及更新信息的处理的示例的流程图。本流程在开发环境20中的数据处理单元22中执行。本流程具体通过例如由数据处理单元20的处理设备执行存储在数据处理单元22的存储器中的程序来实现。

在步骤3400(s3400),数据处理单元22用初始值0置换变量“flag”。

在步骤3401(s3401),数据处理单元22确定回滚是否被指定。当指定回滚时,处理转移到步骤3402。当未指定回滚时,处理转移到步骤3404。

在步骤3402(s3402),数据处理单元22从用户接收回滚点的指定的输入并且存储输入的数据。

在步骤3403(s3403),数据处理单元22将变量“flag”的值更新为1。

在步骤3404(s3404),数据处理单元22进行已更新的程序的地址解决(链接)并且生成更新二进制码。

在步骤3405(s3405),数据处理单元22确定是否将bios代码从数据rom408写入程序rom407。当其被写入时,处理转移到步骤3406。当其未被写入时,处理转移到步骤3407。

在步骤3406(s3406),数据处理单元22生成存储在数据rom408中的bios代码的到程序rom407的写入处理的委托的注入代码716。当bios代码尚未被配置在程序rom407的一部分或全部中时,进行将bios代码写入程序rom407。在三个层面的程序rom407的情况下,当bios代码未被配置在程序rom407中要写入差分代码的层面中时,将bios代码写入程序rom407的该层面中。通过操作,将初步地存储在数据rom408中的bios代码写入程序rom407。

在步骤3407(s3407),数据处理单元22生成更新二进制码的程序写入处理的委托的注入代码701。在此,假设注入代码也调用用于使通用程序更新的恢复点无效的擦除数据rom408的bios代码。

在步骤3408(s3408),数据处理单元22生成用于切换程序rom407的默认层面的注入代码712以及用于切换数据rom408的默认层面的注入代码713。

在步骤3409(s3409),数据处理单元22生成使地址转换表无效的注入代码。

在步骤3410(s3410),数据处理单元22比较变量flag的值是否为1。在匹配的情况下,处理转移到步骤3411。在不匹配的情况下,处理结束。

在步骤3411(s3411),数据处理单元22生成到默认操作的回滚处理委托的注入代码710。当因差分程序更新或者安全异常发生中断时,执行该注入代码。在由注入代码执行的回滚bios代码完成执行后,可以执行更新取消bios代码调用。

接下来,将描述图33a中的处理步骤3305的细节。图35a和35b是图示步骤3305的合并差分程序的处理的示例的流程图。在下文的描述中,n表示程序rom407中的地址转换表的条目数,即,在地址转换表中能够设定的地址转换的最大值。m表示用于数据rom408的地址转换表的条目数,即,在地址转换表中能够设定的地址转换的最大值。如后所述,在生成由于更新配置在程序rom407或者数据rom408中的数据表或者添加新的数据表而成变得必要的各种注入代码之后,执行合并处理,使得构成差分代码的代码块的数目变成等于或小于特定数目的代码块的数目。数据表指示具有初始值的局部变量或者全局变量。当将多个要更新的数据表配置在相同的区段区域中时,将它们作为一个数据表处理。具体地,在使用图11a和图11b的地址转换处理的情况下,可以将其报头地址被配置在相同的区段区域内的多个要更新的数据表作为一个数据表处理。在下文中,在图35a和图35b的描述中,假设数据表表示针对每个区段作为一个数据表处理的数据表。假设配置新数据表使得区段数变得最小。具体地,这通过解决渐缩问题来实现。作为使区段数变得最小的配置的示例,例如,当多个具有初始值的新局部变量(序列)被写入相同的函数时,将尽可能多的新局部变量配置在相同的区段中。还假设已经计算出设定为区段中的一个数据表的数据表(即,连结之前的数据表)的元素中的每一个的报头地址。在图33a的步骤3312生成链接的差分程序时参考那些报头地址。

在步骤3500(s3500),数据处理单元22将到程序rom407的写入数据表的数目设定为n,并且将到数据rom的写入数据表的数目设定为m。写入数据表的数目是通过改写或添加数据表而要写入的数据表的数目。

在步骤3501(s3501),数据处理单元22确定是否满足n>n以及是否满足m≤m。如果其满足,则处理转移到步骤3503。如果其不满足,则处理转移到步骤3502。

由于数目超过条目数,在步骤3502(s3502),相对于步骤3501的具有违反的写入,数据处理单元22进行合并包括要写入的数据表的相邻区段的处理。当不存在相邻区段时,数据处理单元22合并包括要写入的数据表的最接近的区段。数据处理单元22向用户通知不可能进行差分更新并且询问是否允许更新超过区段大小的数据表格。如果其被允许,则处理转移到步骤3500。如果其不被允许,则处理中断。当处理中断时,用户修改更新程序并且再次进行更新准备处理或者变更更新整个程序的策略。

在步骤3503(s3503),数据处理单元22确定在差分程序中是否变更程序rom407上的现有数据表。当存在改变时,处理转移到步骤3504。当不存在变更时,处理转移到步骤3510。

在步骤3504(s3504),数据处理单元22仅将步骤3505至3509的处理重复已改变的数据表的数目的次数。

在步骤3505(s3505),数据处理单元22计算在程序rom407上的在其中配置已改变的数据表的报头地址。在报头地址的计算中,优先地使用自由区域。在没有足够空间的情况下,当在上一次或之前的更新中配置要更新的数据表时,向用户询问是否重用报头地址。当用户允许重用时,执行被认为要重用的报头地址的计算。当用户不允许重用时或者当不存在要重用对象时,处理中断。当处理中断时,用户修改更新程序并且再次执行更新准备处理或者变更更新整个程序的策略。

在步骤3506(s3506),当已经在已计算的地址中包括数据表时,数据处理单元22计算包括已计算的地址的擦除块编号。

在步骤3507(s3507),当存在要擦除的块时,数据处理单元22使用块中的数据表变量作为包括更新部分的写入数据。当不存在要擦除的块时,数据处理单元22使用包括变更的整个数据表作为写入数据。数据处理单元22还计算由更新写入的数据表的数据长度。

在步骤3508(s3408),数据处理单元22通过使用下列用于操作rom擦除和写入驱动程序的变量来生成到程序rom407的擦除/写入处理的委托的注入代码705。特别地,作为自变量,使用:驱动程序的配置地址、传给驱动程序的帧指针、在步骤3506计算出的要擦除块的数目、由更新写入的数据在内置存储器中的配置位置的报头地址、由更新写入的数据的数据长度以及在步骤3505计算出的程序rom407上的报头地址。上文和稍后描述的内置存储器例如是sram406,但可以是具有要写入数据的存储器,诸如数据rom408。当在步骤3506确定不存在要擦除块时,数据处理单元22生成程序rom写入处理的委托的注入代码707,其并不伴同要擦除块的数目。

在步骤3509(s3509),数据处理单元22用通过从n的现值减去1获得的值置换变量n。

在步骤3510(s3510),数据处理单元22确定是否在差分程序中向程序rom407上的现有数据表添加变量或者添加新数据表。当存在添加时,处理转转移到步骤3511。当不存在变更时,处理转移到步骤3516。当向现有数据表添加变量时,由于仅从差分代码进行到变量的访问,此后,该变量被用作新数据表。特别地,当仅向现有数据表进行变量的添加而不改变现有数据表时,仅使用添加的部分作为新数据表来生成更新差分二进制码。

在步骤3511(s3511),数据处理单元22仅将步骤3512至3515的处理重复对其进行添加的表的数目的次数。

在步骤3512(s3512),数据处理单元22计算程序rom407上的在其中配置添加的表的报头地址。具体地,由于例如通过解决渐缩问题,确定要添加的数据表中的每一个的配置状态,使得区段的数目变为最小,数据处理单元22确定在其中包括要添加的数据表的区段的报头地址。数据处理单元22计算要添加的数据表的数据长度。在报头地址的计算中,优先使用自由区。当没有足够空间时,处理中断。当处理中断时,用户修改更新程序并且再次执行更新准备处理或者变更更新整个程序的策略。

在步骤3513(s3513),数据处理单元22将在具有在步骤3512确定的报头地址的区段中包括的数据表设定为写入数据。

在步骤3514(s3414),数据处理单元22通过使用下列用于操作rom擦除/写入驱动程序的变量来生成程序rom写入处理的委托的注入代码707。特别地,作为自变量,使用:驱动程序的配置地址、传给驱动程序的帧指针、写入数据在内置存储器中的配置位置的报头地址、写入数据的数据长度以及在步骤3512计算出的程序rom407上的报头地址。

在步骤3515(s3515),数据处理单元22用通过从n的现值减去1所得的值置换变量n。

在步骤3516(s3516),数据处理单元22确定在差分程序中是否存在对程序rom407上的现有数据表的变更。当存在变更时,处理转移到3517。当不存在变更时,处理转移到步骤3523。

在步骤3517(s3517),数据处理单元22仅将步骤3518至3522的处理重复各自具有变更的表的数目的次数。

在步骤3518(s3518),数据处理单元22计算数据rom408上的在其中配置具有变更的表的报头地址。在报头地址的计算中,优先使用自由空间。在没有足够空间的情况下,当在上一次或之前的更新中配置要更新的数据表时,使用报头地址。否则,处理中断。当处理中断时,用户修改更新程序并且再次执行更新准备处理或者变更更新整个程序的策略。

在步骤3519(s3519),当已经在计算出的地址中包括数据表时,数据处理单元22计算包括计算出的地址的擦除块编号。

在步骤3520(s3520),当存在要擦除的块时,数据处理单元22将块中的数据表变量设定为包括已更新的数据的写入数据。当不存在要擦除的块时,数据处理单元22将具有变更的整个数据表设定为写入数据。数据处理单元22还计算由更新写入的数据表的数据长度。

在步骤3521(s3521),数据处理单元通过使用在步骤3519计算出的要擦除块的数目、写入数据在内置存储器中的配置位置的报头地址、写入数据的长度以及在步骤3518计算出的报头地址作为自变量,生成数据rom擦除/写入处理的委托的注入代码706。当在步骤3519确定不存在要擦除的块时,数据处理单元22生成数据rom写入处理的委托的注入代码708,其不伴同要擦除的块的数目。

在步骤3522(s3522),数据处理单元22用通过从m的现值减去1获得的值置换变量m。

在步骤3523(s3523),数据处理单元22确定在差分程序中是否存在向数据rom408上的现有数据表添加变量或者添加新数据表。当存在变更时,处理转移到步骤3524。当不存在变更时,处理转移到步骤3529。当向现有数据表添加变量时,仅从差分代码进行到变量的访问。因此,此后,变量被用作新数据表。

在步骤3524(s3524),数据处理单元22仅将步骤3525至3528的处理重复各自具有添加的表的数目的次数。

在步骤3525(s3525),数据处理单元22计算数据rom408上的在其中配置具有添加的表的报头地址。具体地,由于例如通过解决渐缩问题,确定要添加的数据表中的每一个的配置状态,使得区段的数目变为最小,数据处理单元22确定包括要添加的数据表的区段的报头地址。数据处理单元22还计算要添加的数据表的数据长度。在报头地址的计算中,优先使用自由区。当没有足够空间时,处理中断。当处理中断时,用户修改更新程序并且再次执行更新准备处理或者变更更新整个程序的策略。

在步骤3526(s3526),数据处理单元22将具有在步骤3525确定的报头地址的区段中包括的数据表设置为写入数据。

在步骤3527(s3527),数据处理单元通过使用写入数据在内置存储器中的配置位置的报头地址、写入数据的长度以及在步骤3525计算出的报头地址作为自变量,生成数据rom写入处理的委托的注入代码708。

在步骤3528(s3528),数据处理单元22用通过从变量m的现值减去1获得的值置换变量m。

在步骤3529(s3529),数据处理单元22执行令差分代码的数目为n或更小的合并处理,使得下列目标函数变为最优。在合并处理中,进行合并在更新程序中分散地配置的两个或更多个差分代码的处理使得包括公共代码作为在更新前后公共的代码。通过本处理,能够将不包括具有初始值的局部变量和全局变量的更新差分代码块的数目设定为n或更小。最优化的目标函数如下。在目标函数1至3中,目标函数1具有最高的优先级,并且目标函数2具有第二高的优先级。

目标函数1:minimize{最大序列码}

本目标函数优化使得通过连结更新差分代码的块获得的代码(序列码)的最大大小变为最小。优化的目的是防止区段大小变得过大,即,使n变得尽可能大。

目标函数2:minimize{公共代码中的函数调用的总数}

本目标函数优化使得公共代码中函数调用的数目变为最小。在连结差分代码块时,包括不同的差分代码块之间的不是要改变的对象的代码(公共代码)。当来自公共代码的函数调用的数目较大时,在程序rom的层面中执行程序。由于程序rom的层面具有不同的电源,这就涉及到功耗的增大以及程序rom的读取周期数的增大。因此,通过目标函数2,调用的数目最小化。

目标函数3:已经配置的差分代码的重用的最大化。

本目标函数的目的如下。当通过之前的更新多次进行更新差分代码的配置时,存在之前配置了几次的更新差分代码块能够照样被重用于此次更新的可能性。在此情况下,通过将其重用,能够减少配置处理。

本目标函数可以通过用公式表示为线性规划问题并且解决该问题来优化。本目标函数也可以通过使用诸如拉格朗日松弛的技术进行加速来解决。其还可以通过用公式表示为覆盖问题的线图来解决,其中该线图通过下述来表达:通过其顶点使用差分代码中的每一个的大小作为权数的大小来连结差分函数、以及使用大小之和与调用函数作为权数、以及考虑认为可重用的顶点来表达。也可以启发式地解决覆盖问题的线图。总之,对本目标函数的优化能够通过有关优化问题的常识来解决。

接下来,将描述嵌入式设备40的更新操作。图36图示在其中配置嵌入式设备40的系统的构造示例,用于解释嵌入式设备40中的程序更新操作。如图36所示,作为示例,管理服务器30被连结到用户界面37并且具有用于进行向/从无线网络发送/接收的天线38。将在假设嵌入式设备40包括嵌入式控制器的情况下给出描述。用户界面37显示到嵌入式控制器的更新差分程序的存在/不存在作为程序更新操作的对象并且从用户接收是否实际执行更新的指令。管理服务器30从天线38接收更新信息作为构成包括更新差分程序的更新信息文件的信息。在接收到更新信息后,管理服务器30向用户界面37通知更新的存在。当用户基于在用户界面37中显示的信息指令更新许可时,更新差分程序被配置在嵌入式设备40中的嵌入式控制器中。

在程序rom407和数据rom408的层面数目是三个情况下的更新程序的示例如下。图37是图示程序更新处理的示例的流程图。

在步骤3700(s3700),管理服务器30询问用户是否能够经由用户界面37加载更新程序。当允许加载时,处理转移到步骤3701。当不允许加载时,处理转移到步骤3705。

在步骤3701(s3701),管理服务器30启动更新程序的动态加载,即,到程序rom407和数据rom408的更新程序的动态配置。动态配置表示在不停止程序的操作的情况下将差分从程序配置到rom中。

在步骤3702(s3702),管理服务器30确认更新程序的动态配置的完成。

在步骤3703(s3703),管理服务器30询问用户是否可能经由用户界面37进行更新。当允许更新时,处理转移到步骤3704。当不允许更新时,处理转移到步骤3706。

在步骤3704(s3704),在完成诸如允许地址转换表的设定的更新所需的设定之后,重置并且重启嵌入式设备40。在重启时,完成更新。

在步骤3705(s3705),预定的等待时间流逝之后,处理转移到步骤3700。类似地,在步骤3706中,预定的等待时间流逝之后,处理转移到步骤3703。

接下来,将描述嵌入式设备40中的程序的动态配置操作。图38是解释嵌入式设备40中的程序的动态配置操作的示例的示意图。嵌入式设备40中的sram406具有在启动时固定地分配的程序更新工作区域442。假设cpu401具有通用中断向量表440以及专用中断向量表441。专用中断向量表441是用于动态程序配置的中断向量表,并且在物理上可以安装为通用中断向量表440的一部分。程序的动态配置操作的示例如下。

(1)由中断控制器403从can接口409接收要求传送更新信息的中断,并且中断控制器403中断cpu401。

(2)cpu401参考专用中断向量表441,并且执行对应中断处理程序。通过该操作,在cpu401或者dma控制器405的控制下,使更新信息从can接口409传送到sram406。包括在更新信息中的注入代码被配置在程序更新工作区域442中。假设接收的数据中的每一个均被初步地添加签名,并且程序更新工作区域442中的预定地址被存储为报头地址。

(3)从中断控制器403接收指示从can接口409传送更新信息的分离的中断直到cpu401接收到中断为止,重复上述操作(1)和(2)。

(4)由中断控制器403接收来自can接口409的指示传送更新信息分离的中断,并且由cpu401接收该中断。

(5)cpu401参考专用中断向量表441,并且执行对应中断处理程序。通过该操作,执行配置在程序更新工作区域442中的注入代码。注入代码根据其种类执行:更新数据表(即,更新差分代码中包括的具有初始值局部变量和全局变量)对于不由cpu401访问的程序rom407和数据rom408的配置,更新差分二进制码的到不由cpu401访问的程序rom407的配置,以及地址转换表的到目前不执行的数据rom408的配置。

(6)从中断控制器403接收指示从can接口409传送更新信息完成的中断直到cpu401接收到中断为止,重复上述操作(1)至(5)。

(7)中断控制器403接收指示从can接口409传送更新信息完成的中断,并且cpu401接收该中断。

(8)cpu401参考专用中断向量表441,并且执行对应中断处理程序。通过所述操作,执行对配置在程序rom407和数据rom408中的数据表以及差分代码的签名的验证、以及对配置在地址转换器402和数据rom408中的地址转换表的签名的验证。当签名通过签名验证时,嵌入式设备40将差分代码的签名(哈希值)存储到数据rom408中并且从can接口409向外输出完成通知。嵌入式设备40设置指示在重启之后切换差分代码配置层面的标志。当在签名验证中出现不匹配时,嵌入式设备40擦除配置在程序rom408和数据rom408中的数据表和差分代码,并且擦除配置在地址转换器和数据rom中的地址转换表,并且从can接口409向外输出签名验证不匹配的通知。

图39是解释嵌入式设备40中的程序动态配置操作的另一示例的示意图。在图39中所示的示例是在具有子cpu411的嵌入式设备40中的动态配置操作的示例。以类似于上文的方式,sram406具有在启动时固定地分配的程序更新工作区域442。假设子cpu411具有通用中断向量表443以及专用中断向量表444。程序rom412是存储图32a和图32b中bios代码的程序rom区域并且可以物理地安装程序rom407或者其整体中一部分中的任意一个。在具有这种构造的嵌入式设备40中的程序的动态配置操作的示例如下。

(1)由中断控制器403从can接口409接收要求传送更新信息的中断,并且中断控制器403中断子cpu411。可替选地,可以由主cpu401暂时地接收来自中断控制器403的中断,并且主cpu401可以中断子cpu411。

(2)子cpu411参考专用中断向量表444,并且执行对应中断处理程序。通过该操作,在子cpu411或者dma控制器405的控制下,使更新信息从can接口409传送到sram406。包括在更新信息中的注入代码被配置在程序更新工作区域442中。假设接收的数据中的每一个均被初步地添加签名,并且程序更新工作区域442中的预定地址被存储为报头地址。

(3)从中断控制器403接收指示从can接口409传送更新信息的分离的中断直到子cpu411接收到中断为止,重复上述操作(1)和(2)。

(4)由中断控制器403接收指示从can接口409传送更新信息的分离的中断,并且由子cpu411接收该中断。

(5)子cpu411参考专用中断向量表444,并且执行对应中断处理程序。通过该操作,执行配置在程序更新工作区域442中的注入代码。注入代码根据其种类执行:更新数据表的到不由子cpu411访问的程序rom407和数据rom408的层面的配置,更新差分二进制码的到不由子cpu411访问的程序rom407的配置,以及地址转换表的到目前不执行的数据rom408的配置。

(6)从中断控制器403接收指示从can接口409传送更新信息完成的中断直到子cpu411接收到中断为止,重复上述操作(1)至(5)。

(7)中断控制器403接收指示从can接口409传送更新信息完成的中断,并且子cpu411接收该中断。

(8)子cpu411参考专用中断向量表444,并且执行对应中断处理程序。通过该操作,执行对配置在程序rom407和数据rom408中的数据表以及差分代码的签名的验证、以及对配置在地址转换器402和数据rom408中的地址转换表的签名的验证。在签名通过签名验证情况下的操作以及在签名验证中出现不匹配情况下的操作类似于在如上所述的图38中的操作(8)的描述中的那些操作。

接下来,将描述嵌入式设备40中的启动操作。图40是图示嵌入式设备40的启动操作的示例的流程图。启动流程是在设定更新信息完成之后重启时的操作流程的示例。例如,本启动流程通过由嵌入式设备40的cpu401执行包括bios的固件来实现。

在步骤4000(s4000),从关闭状态接通电源,并且嵌入式设备40在特权模式下启动处理。

在步骤4001(s4001),在sram406上指配程序更新工作区域442。将工作区域的报头地址设定为work_addr。

在步骤4002(s4002),在专用中断向量表441或者专用中断向量表444中设定work_addr。

在步骤4003(s4003),嵌入式设备40变更特权级别并且转移到正常模式。

在步骤4004(s4004),嵌入式设备40执行初始化cpu401和外围模块的处理。

在步骤4005(s4005),嵌入式设备40确定是否设定差分代码配置层面切换标志。当设定标志时,处理转移到步骤4006。当未设定标志时,处理转移到步骤4007。

在步骤4006(s4006),进行“定位更新差分代码后的初始化处理”。稍后将描述“定位更新差分代码后的初始化处理”的示例。

在步骤4007(s4007),嵌入式设备40执行主程序。

在步骤4008(s4008),主系统启动。

图41是图示图40的步骤4006的“更新差分代码配置后的初始化处理”的示例的流程图。在“更新差分代码配置后的初始化处理”中,例如,执行下列操作。

在步骤4100(s4100),嵌入式设备40将程序场境保存到c_tmp。程序场境表示程序的状态并且具体指cpu寄存器和存储器的状态。c_tmp是存储器上的保存区域。签名验证等是不包括在原始程序中的处理以及改变原始程序场境的处理。因此,在执行诸如签名验证的处理之前程序场境暂时性存储并且在处理完成后返回,由此实现原始程序执行状态。

在步骤4101(s4101),嵌入式设备40从程序rom407和数据rom408中读取数据表和差分代码并且计算哈希值。

在步骤4102(s4102),嵌入式设备40将在配置数据表和差分代码时用于签名验证的哈希值与在步骤4101计算出的哈希值相比较。当两值匹配时,处理转移到步骤4103。当两值不匹配时,处理转移到步骤4108。

在步骤4103(s4103),嵌入式设备40计算配置在数据rom408中的地址转换表的哈希值。

在步骤4104(s4104),嵌入式设备40将在配置地址转换表时用于签名验证的哈希值与在步骤4103计算出的哈希值相比较。当两值匹配时,处理转移到步骤4105。当两值不匹配时,处理转移到步骤4108。

在步骤4105(s4105),嵌入式设备40切换差分代码配置层面。

在步骤4106(s4106),嵌入式设备40从数据rom408中加载地址转换表并且将其设定在地址转换器402中。

在步骤4107(s4107),嵌入式设备40使地址转换有效。

在步骤4108(s4108),嵌入式设备40将保存(存储)在c_tmp中的程序场境设置为新的程序场境。即,嵌入式设备40恢复保存在c_tmp中的程序场境。

如上所述,更新信息在其被存储到嵌入式设备40中的rom中时受限于签名验证,并且在其应用于嵌入式设备40时也受限于签名验证(步骤4101至4104)。因此,在接收更新信息时能够检测篡改并且在接收后也能够检测篡改。由于在确认更新信息的有效性的情况下,cpu401执行差分程序,能够避免基于程序的执行具有篡改等风险,使得提高安全性。

接下来,将描述将bios调用到sram406的代码的配置处理以及bios的执行。图42是图示将bios调用到sram406中的代码配置的处理并且执行bios的示例的流程图。作为示例,将描述经由can接口的配置处理。

在步骤4200(s4200),由cpu401从can接口409接收要求传送更新信息的中断。

在步骤4201(s4201),确定中断是否是指令执行注入代码的中断。如果是,则处理转移到步骤4204。如果否,则处理转移到步骤4202。

在步骤4202(s4202),cpu401将接收到的数据传送到其报头地址是work_addr的程序工作区域。

在步骤4203(s4203),中断处理结束,并且处理转移到步骤4200。

在步骤4204(s4204),cpu401通过中断处理程序执行配置在程序更新工作区域中的注入代码。cpu401从注入代码读取bios,将自变量传给bios并且执行bios。

在步骤4205(s4205),在执行bios函数之后,cpu401进行bios函数中的中断结束处理。

接下来,将描述更新信息文件50的传送。图43是图示将包括在更新信息文件50中的更新差分二进制码从管理服务器30传送到嵌入式设备40的处理的示例的流程图。本流程由管理服务器30的数据处理单元33执行。具体地,例如,本流程通过由数据处理单元33的处理设备执行存储在数据处理单元33中的存储器中的程序来实现。

如上所述,更新信息文件50由开发环境20生成、被传送到管理服务器30、并且从管理服务器30被传送到嵌入式设备40。如上所述,更新信息文件50包括地址转换表52等的除更新差分二进制码之外的各种信息。作为从管理服务器30向嵌入式设备40传送信息的示例,在图43中图示传送更新差分二进制码的示例。对包括在更新信息文件50中的除更新差分二进制码以外的信息的传送也类似。为了描述,如下定义s、m和n1。在下列定义中,n2是自然数并且根据闪存的写入单位来设定。“ceil()”是返回括号中的数值的舍入整数值的函数。假设can的数据有效载荷大小为八。

s=256×n2字节

m=ceil(更新差分二进制码的字节长度/s)

n1=256/8,其中8表示can的数据有效载荷大小

能够根据系统要求而适当地变更这些常数值.

在示例中,图示在八字节单位的基础上进行从管理服务器30到嵌入式设备40的数据传送以及在s字节单位的基础上向闪存写入数据的处理。在下文中,将具体描述本处理。

在步骤4300(s4300),数据处理单元33将步骤4301至4307的处理重复m次。在重复期间,数据处理单元33递增变量i(初始值为1)。

在步骤4301(s4301),当更新差分二进制码按s字节被划分为变量c时,数据处理单元33代入第i个数据。

在步骤4302(s4302),数据处理单元33将步骤4303至4306的处理重复n2次。在重复期间,数据处理单元33递增变量j(初始值为1)。

在步骤4303(s4303),当代入c中的数据按256字节单位被分离为变量d时,数据处理单元33代入第j个数据。

在步骤4304(s4304),数据处理单元33将步骤4305和4306的处理重复n1次。在重复期间,数据处理单元33递增变量k(初始值为1)。

在步骤4305(s4305),数据处理单元33发出将从嵌入式设备40中的can接口409接收到的更新二进制区段经由can总线传送到嵌入式设备40的sram406的请求。

在步骤4306(s4306),当代入d中的数据按8字节被划分时,数据处理单元将第k个数据发送到can总线以便发送到嵌入式设备40。

在步骤4307(s4307),数据处理单元33将执行更新二进制码的到程序rom407的写入处理的委托的注入代码701的指令发送到can总线,并且将注入代码发送到can总线。

上文已经描述了第一实施例。根据第一实施例,嵌入式设备40根据由地址转换器402转换的地址来执行更新程序。因此,即使在嵌入式设备40不具有动态的地址解决方程的情况下,也能够进行使用差分代码的程序更新。由于仅由差分代码进行更新,而未执行基于模块单位的更新,能够抑制更新时存储在嵌入式设备的存储器中的数据量。因而,其有助于缩减存储器。由于可能进行模块单位或更小单位的更新,能够在极小单位的基础上进行对闪存的写入和擦除。因此,能够实现闪存的使用寿命比在基于模块单位的更新方法中的使用寿命更长。由于构成程序恢复点的信息被包括在更新信息文件50中,在更新中检测到异常时或者基于来自外部的指令回滚到更新前程序变得可能。另外,在检查更新程序的有效性时,即,在签名验证时,例如,存在一种通过在嵌入式设备与另一设备之间进行通信来检测有效性的方法。在本实施例中,并未采用这一方法。由于由嵌入式设备40计算和确认摘要值(哈希值),能够避免在验证时产生通信延迟等影响。因此,与通过在嵌入式设备与另一设备之间进行通信来检查有效性的情况相比,能够缩短从开始通电实际需要的时间。当在使用更新差分程序的摘要值(哈希值)的检查中检测到异常时,通过恢复初步地保存在堆栈中的程序场境,能够使操作返回到执行更新前程序,而不用关闭再接通电源。因此,能够缩短检测到异常时的恢复时间。在本实施例中,由于rom具有三个层面,即使正在执行更新程序,也有一个层面空闲。因此,在进一步进行更新的情况下,如上所述,通过使用空闲的一个层面,不会干扰程序的执行。rom的层面数目不限于三个。显然,即使当层面数目是四个或四个以上时,类似地,能够使用空闲的层面。

第二实施例

接下来,将描述第二实施例。第二实施例在变更嵌入式设备40方面有别于第一实施例,具体地,第二实施例的嵌入式设备40中的程序rom407的构造和数据rom408的构造被改变。在下文中,便于理解起见,将适当省略与第一实施例相似方面的描述。图44是图示根据第二实施例的嵌入式设备40的构造示例的框图。

根据本实施例的程序rom407是具有能够独立地向/从其写入、读取和擦除数据的两个层面的构造的rom。即,虽然第一实施例中的程序rom407具有三个层面的构造,但第二实施例中的程序rom407具有两个层面的构造。第二实施例中的数据rom408是具有能够独立地向/从其写入、读取和擦除数据的两个层面的构造的rom。即,虽然第一实施例中的数据rom408具有三个层面的构造,但第二实施例中的数据rom408具有两个层面的构造。在下文中,在第二实施例的描述中,除非另作说明,否则程序rom407是具有根据第二实施例的两个层面构造的rom。类似地,数据rom408是具有根据第二实施例的两个层面构造的rom。当rom具有三个或三个以上层面时,如上所述,通过使用空闲的层面,不会干扰程序的执行。然而,在两个层面的情况下,当正在执行已更新的程序时,rom中不存在空闲的层面。因此,无法照样应用第一实施例中所述的方法。在第二实施例中,将描述一种在rom具有两个层面的情况下也实现更新的方法。

图45图示出根据第二实施例的嵌入式设备40的另一构造示例。如图所示,通过类似于第一实施例的方式,第二实施例的嵌入式设备40可以具有子cpu411。

图46是图示根据第二实施例的地址转换器402的概要的示意图。在第一实施例中,默认程序被配置在程序rom407的三个层面之一中,并且更新差分程序被配置在剩余的两个层面中。因此,使用两个地址转换表420a和420b中的任意一个。另一方面,在第二实施例中,层面数目是两个。因此,如图46所示,根据第二实施例的地址转换器402通过使用一个地址转换表420a来进行地址转换。出于使得在地址转换表的程序执行期间能够设定的目的,可以提供两个地址转换器。

根据第二实施例的地址转换器402的连结关系以如图8中类似于第一实施例的方式来表示。具体地,嵌入式设备40具有,如地址转换器402,用于程序rom407的地址转换器402a以及用于数据rom408/的地址转换器402b。在本实施例中,鉴于程序rom具有两个层面的构造,嵌入式设备40具有一个用于程序rom407的地址转换器402a。类似地,嵌入式设备40具有一个用于数据rom408的地址转换器402b。

更新信息文件可以类似于第一实施例的更新信息文件或者可以被构造如下。图47是解释在构造新差分代码时重用以往曾配置的差分代码的方法的示意图。在程序rom407的层面数目是两个的情况下,在其中能够配置更新差分代码的区域小于层面数据是三个的情况下的在其中能够配置更新差分代码的区域。因此,通过重用差分代码本身,能够减少配置在程序rom407中的数据量。即,能够抑制程序rom407所需的存储器容量。该重用不限于rom具有两个层面的情况,而是也能够方便地应用于层面数据是三个或三个以上的情况。在下文中,将参照附图给出描述。

在图47所示的示例中,除多个差分代码的配置示例之外,还图示出与差分代码相对应的地址转换表的配置示例。在第一次更新中,差分代码a、b、c和d被配置在存储空间b中,并且地址转换表420a_1被配置在数据rom408中。在第二次更新中,差分代码e、f、g和h被配置在存储空间b中,并且地址转换表420a_2被配置在数据rom408中。将审查在第k次更新中,差分代码d和e以及差分代码i和j被配置到存储空间b中,并且地址转换表420a_k被配置到数据rom408中的情况。

由于已经通过使用已配置在地址转换表420a_k中的差分代码d和e的报头地址作为转换之后的地址而将差分代码d和e配置在地址空间b中,无需再重新将差分代码d和e配置在地址空间b中。即,通过这种方式来重用已经配置的差分代码。相对于地址转换表420a_k中与差分代码d和e相对应的条目,已经配置的条目可以被重用或者被重新配置到数据rom408中。图47图示出将全部条目重新配置到数据rom408中的地址转换表420a_k中而不重用条目的构造示例。

通过本构造,在嵌入式设备40中,由can接口409接收不包括与已经配置在程序rom407或者数据rom408中的更新信息重叠的部分的更新信息。在程序rom407或者数据rom408中,除已经配置的重叠部分之外,重新配置不包括重叠部分的更新信息。通过这种方式,能够抑制程序rom407或者数据rom408所需的存储器容量。

接下来,将描述本实施例中bios代码的配置示例。图48a和图48b是图示将bios代码配置到两个层面的程序rom407中的配置示例的示意图。图48a图示与不伴同bios代码更新的更新程序的情况相对应的示例。图48b图示出与包括bios代码更新的更新整个默认程序的情况相对应的示例。

首先,参照图48a,将描述不伴同bios代码更新的更新程序的情况。在图48a中,相同的bios代码被配置在两个层面中。默认程序被配置在层面a中,并且与上一次更新相对应的差分程序以及正在写入的更新差分程序被配置在层面b中。在更新差分程序的到层面b的配置中,通过重启,将默认程序与由上一次差分程序制成的上一次更新程序在层面a和b中的执行状态改变为默认程序在层面a上的执行状态。此后,在更新差分程序的到层面b的配置中,使用配置在层面b中的bios代码,并且由在sram406或者程序rom写入专用硬件中扩展的程序rom写入驱动程序执行写入。通过该操作,在不干扰从cpu401到层面a访问的情况下,能够将更新差分程序配置在层面b中。即,能够在层面a中的程序的执行期间将更新差分程序配置在层面b中。配置在层面b中的更新差分程序是相对于配置在层面a中的默认程序的更新差分程序。配置在层面b中的更新差分程序也可以由重用已经配置在层面b中的更新差分程序来构成。

参照图48b,将描述包括bios代码更新的更新整个默认程序的情况。图48a图示层面a被擦除、新默认程序和新bios代码被配置在层面b中、并且配置在层面b中的新bios代码被复制到层面a的状态。通过该构造,执行下列处理。首先,通过从程序rom407的擦除处理的委托的注入代码调用程序rom407的擦除处理bios并且使其执行,来进行对层面b的擦除。接下来,通过从程序rom的写入处理的委托的注入代码调用程序rom写入处理并且使其执行,将新默认程序和新bios代码配置到层面b。通过从默认层面切换处理的委托的注入代码712和713调用默认层面切换处理bios并且使其执行,将重启时的启动地址设定到层面b的报头。在重启之前,将用于在程序rom407的层面a的重启期间执行擦除的程序rom擦除的委托的注入代码以及用于在新的bios代码的重启期间执行到层面a的复制的程序rom写入处理委托的注入代码从sram406配置到数据rom408,将这两个注入代码从数据rom408扩展到sram406并且在重启期间执行。重启之后,实现图48b中所示的程序配置结构,程序起始地址被设定于层面b的报头,并且执行层面b中的新默认程序。新的bios代码可以被暂时地配置在数据rom408中,并且此后再在适当的定时扩展到程序rom407。

例如,在程序rom407和数据rom408的层面数目是两个情况下的更新程序如下。图49是图示程序更新处理的示例的流程图。

在步骤4900(s4900),管理服务器30询问用户是否能够经由用户界面37加载更新程序。当准许加载时,处理转移到步骤4901。当准许加载时,处理转移到步骤4906。

在步骤4901(s4901),完成设定默认程序执行状态所需的设定,诸如禁用地址转换表的设定,并且此后,重置并且重启嵌入式设备40。重启之后,嵌入式设备40转移到默认程序的执行状态。

在步骤4902(s4902),管理服务器30启动更新程序的动态加载,即,将更新程序动态地配置到程序rom407和数据rom408。

在步骤4903(s4903),管理服务器30识别更新程序的动态配置的完成。

在步骤4904(s4904),管理服务器30询问用户是否准许经由用户界面37进行更新。当准许更新时,处理转移到步骤4905。当不准许加载时,处理转移到步骤4907。

在步骤4905(s4905),在完成更新所需的设定,诸如准许地址转换表的设定之后,重置并且重启嵌入式设备40。在重启时,完成更新。

在步骤4906(s4906),预定的等待时间流逝之后,处理转移到步骤4900。类似地,在步骤4907(s4907),预定的等待时间流逝之后,处理转移到步骤4904。

接下来,将描述第二实施例中的嵌入式设备40中的启动操作。图50是图示根据第二实施例的嵌入式设备40的启动操作的示例的流程图。在下文中,将描述有别于图40所示的嵌入式设备40中的启动操作的方面。除了用步骤5005替代步骤4005这一点以外,图50中所示的嵌入式设备40的启动操作与图40中所示的嵌入式设备40中的启动操作相同。在步骤5005,嵌入式设备40确定是否设定差分代码配置层面有效的标志。当设定标志时,处理转移到步骤5006。当未设定标志时,处理转移到步骤5007。

接下来,将描述图50中的步骤5006的“配置更新差分代码后的初始化处理”。图51是图示图50的步骤5006中的“配置更新差分代码后的初始化处理”的示例的流程图。在“配置更新差分代码后的初始化处理”中,例如,进行下列操作。在下文中,将描述有别于图41中所示处理的方面,并且将适当地省略对类似于图41中所示处理的方面的描述。

步骤5100(s5100)至5104(s5104)类似于图41中所示的步骤4100至4104。当步骤5102中的哈希值匹配时,处理转移到步骤5103。在不匹配的情况下,处理转移到步骤5107。当步骤5104中的哈希值匹配时,处理转移到步骤5105。当值不匹配时,处理转移到步骤5107。

在步骤5105(s5105),嵌入式设备40从数据rom408中加载地址转换表并且将其设定在地址转换器402中。

在步骤5106(s5106),嵌入式设备40使地址转换有效。

在步骤5107(s5107),嵌入式设备40将保存(存储)在c_tmp中的程序场境设置为新程序场境。即,嵌入式设备40恢复保存在c_tmp中的程序场境。

上文已经描述了第二实施例。根据第二实施例,即使在rom具有两个层面的情况下,也能够产生类似于第一实施例的效果。由于全局变量被存储在数据rom408中,当不使用全局变量时,能够将数据rom408的层面数目设定为1。

第三实施例

接下来,将描述第三实施例。本实施例涉及实现嵌入式设备中更新差分程序的安全动态配置以及安全更新操作的改进的示例。具体地,在本实施例中,实现应对程序或者数据破坏的对策以及应对对rom的恶意擦除和的写入的对策。第三实施例也能够与第一和第二实施例中的任意一个组合。可以仅应用应对程序或者数据破坏的对策以及应对恶意擦写rom的对策中的一个。

首先,将描述应对程序或者数据破坏的对策。在第一和第二实施例中描述的示例中,在构成更新信息文件的注入代码当中,包括程序rom407或者数据rom408的擦除处理的注入代码是:到指定恢复点的回滚处理的委托的注入代码709、用于更新局部变量的初始值的程序rom擦除/写入处理的委托的注入代码705、以及用于更新全局变量的初始值的程序rom擦除/写入处理的委托的注入代码706。当不考虑安全性时,地址转换表的到数据rom408的写入处理的委托的注入代码702持续存储地址转换表,直到数据rom408溢出。当考虑安全性时,优选地进行擦除处理以便仅保持预定数目的以往的地址转换表。在通过那些注入代码的擦除处理中,当擦除块编号以某种方式被篡改并且进一步,篡改检测失败时,存储的程序和数据受到破坏并且这会导致出现问题。在下文中,将描述一种在不将相对于注入代码中擦除块编号的自变量传给bios例程的情况下实现擦除的方法。方便起见,在下文中通过以如同类似于第一和第二实施例的方式使用注入代码来描述本实施例。然而,合理提出,使用由调用函数名称以及函数的自变量序列制成的数据序列置换注入代码。其被实现为在嵌入式设备中由数据序列构成对应于注入代码的函数的形式。通过采用这种实现方法,在构成对应于注入代码的函数时,能够更加安全地实现对注入代码的有效性验证,诸如对数据序列签名验证。

图52是图示根据第三实施例的注入代码的构造示例的示意图。在第三实施例中,注入代码702被替换成地址转换表的到数据rom408的写入处理的委托的注入代码720,注入代码705被替换成用于更新局部变量的初始值的程序rom407的擦除/写入处理的委托的注入代码721,注入代码706被替换成用于更新全局变量的初始值的数据rom408的擦除/写入处理的委托的注入代码722,并且注入代码709被替换成到指定恢复点的回滚处理的注入代码723。其他注入代码与第一和第二实施例的那些类似。

在下文中,将描述与第一和第二实施例中那些注入代码不同的注入代码。

图53是图示根据第三实施例使调用bios例程代码的处理与将地址转换表写入数据rom408的写入处理委托的注入代码720中的处理相对应的处理示例的流程图。

在步骤5300(s5300),将读取数据的报头地址配置到第一自变量arg1。在步骤5301(s5301),将数据长度配置到第二自变量arg2。在步骤5302(s5302),将数据写入目的地的报头地址配置到第三自变量arg3。在步骤5303(s5303),调用rom擦除bios例程。在步骤5304(s5304),调用对应bios例程。

稍后将参照图58来描述在步骤5303调用的rom擦除bios例程的细节。在步骤5304调用的bios例程执行地址转换表的到数据rom408的写入处理。执行示例如下。在由来自can接口409的中断通过dma传输将地址转换表配置在sram406中的状态下,进一步由来自can接口409的中断地址转换表的到数据rom408的写入处理的委托的注入代码720被配置在sram406中,由中断执行注入代码,并且调用bios例程。在步骤5303调用的bios例程执行擦除被改写的区域中的块的处理。通过该处理,擦除以往的地址转换表。在步骤5304调用的bios例程执行将配置在sram406中的地址转换表的到数据rom408的写入处理。

图54是图示与执行到指定恢复点的回滚处理的委托的注入代码723中的处理相对应的调用bios例程代码的处理的处理示例的流程图,其中考虑安全响应。

在步骤5400(s5400),与恢复点相对应的地址转换表的报头地址被配置到第一变量arg1。在步骤5401(s5401),与恢复点相对应的地址转换表的条目数被配置到第二变量arg2。在步骤5402(s5402),调用设定与恢复点相对应的地址转换表的bios例程a。此后,下列步骤5403至5407仅被执行必要的次数。在步骤5403(s5403),将在其中配置具有初始值的局部变量或者全局变量的要回滚到的差分程序中的指定恢复点的在数据rom408上的区域的报头地址配置到第一自变量arg1。即,报头地址是读取数据的报头地址。在步骤5404(s5404),将读取数据的数据长度配置到第二自变量arg2。在步骤5405(s5405),将数据写入目的地的报头地址配置到第三自变量arg3。在步骤5406(s5406),调用rom擦除bios例程。在步骤5407(s5407),调用进行写入程序rom407和数据rom408的bios例程b,以实现恢复在指定恢复点的具有初始值的局部变量或者全局变量的配置状态。

将参照图58来描述在步骤5406中调用的rom擦除bios例程的细节。在步骤5402和5407调用的两个bios例程执行到指定恢复点的回滚处理。执行示例如下。通过来自can接口409的中断,到指定恢复点的回滚处理的委托的注入代码723被配置到sram406中。由中断执行注入代码,并且制成两个bios例程调用。在bios例程的每一个中,执行到指定恢复点的回滚处理。在到指定恢复点的回滚处理中,首先,在地址转换器402中设定与指定恢复点相对应的地址转换表(bios例程a)。随后,进行到程序rom407和数据rom408的写入处理,使得实现恢复在指定恢复点的具有初始值的局部变量或者全局变量的配置状态(bios例程b)。当执行注入代码723时,还调用rom擦除bios例程。rom擦除bios例程执行擦除要被改写的区域的处理。

图55是图示根据第三实施例与进行用于实现全局变量更新的程序rom407的擦除和写入处理的委托的注入代码721中的处理相对应的调用bios例程代码的处理示例的流程图。

首先,在步骤5500(s5500),将在其中配置用于程序rom407的擦除和写入处理程序的在sram406上的地址配置到第一自变量arg1。擦除和写入处理程序被初步地配置在程序rom407中的特定地址上。在步骤5501(s5501),将传给擦除和写入处理程序的自变量的帧指针配置到第二自变量arg2。在步骤5502(s5502),将在其中配置与差分程序中局部变量更新部分相对应的代码作为回滚目标的数据rom408或者sram406上的区域的报头地址配置到第三自变量arg3。即,报头地址是读取数据的报头地址。在步骤5503(s5503),将读取数据的数据长度配置到第四自变量arg4。在步骤5504(s5504),将数据写入目的地的报头地址配置到第五自变量arg5。在步骤5505(s5505),调用rom擦除bios例程。在步骤5506(s5506),调用对应bios例程。

稍后将参照图58来描述在步骤5505调用的rom擦除bios例程的细节。rom擦除bios例程执行在要被改写的区域中擦除块的处理。在步骤5506调用的bios例程执行程序rom407的写入处理,以通过将用于程序rom407的擦写程序配置在sram406中被指定为第一变量的地址上,并且执行该擦写程序来实现局部变量改变。执行示例如下。通过来自can接口409的中断,用于实现局部变量更新的程序rom407的擦写处理的委托的注入代码721被配置到sram406中。由中断执行注入代码,并且调用bios例程。在bios例程中,执行用于局部变量更新的对程序rom407的擦写处理。配置在sram406中的用于程序rom407的擦写程序可以实现为使用sram406作为工作存储器的专用软件。

图56是图示根据第三实施例与执行用于实现全局变量更新对数据rom408的擦写处理委托的注入代码722中的处理相对应的调用bios例程代码的处理示例的流程图。

首先,在步骤5600(s5600),将在其中配置的与差分程序中全局变量更新部分相对应的代码作为回滚目标的在数据rom408或者sram406上的区域的报头地址配置到第一自变量arg1。即,报头地址是读取数据的报头地址。在步骤5601(s5601),将读取数据的数据长度配置到第二自变量arg2。在步骤5602(s5602),将数据写入目的地的报头地址配置到第三自变量arg3。在步骤5603(s5603),调用rom擦除bios例程。在步骤5604(s5604),调用对应bios例程。

稍后将参照图58来描述在步骤5603调用的rom擦除bios例程的细节。rom擦除bios例程执行在要被改写的区域中擦除块的处理。在步骤5604调用的bios例程执行用于实现全局变量更新的数据rom408的写入处理。执行示例如下。通过来自can接口409的中断,用于实现全局变量更新的数据rom408的擦除和写入处理的委托的注入代码722被配置到sram406中。由中断执行注入代码,并且调用bios例程。在bios例程中,执行用于实现全局变量更新的对数据rom408的擦除和写入处理。

接下来,将描述rom擦除bios例程。在第三实施例中,不通过如第一和第二实施例中描述的从外部传递块擦除数的方法来实现更新差分二进制程序的动态配置所需的程序rom407和数据rom408的擦除处理。在第三实施例中,通过管理在其中更新信息被配置在嵌入式设备40的内部的程序rom407和数据rom408的地址信息,抑制了rom的意外擦除。具体地,通过使用存储在数据rom408中的对应关系表,进行擦除处理。图57是图示存储在数据rom408中的对应关系表的示例的图示。对应关系表是管理当更新信息被写入程序rom407或者数据rom408中时的写入目的地的报头地址以及该报头地址属于的擦除块编号的管理信息。当更新信息中的每一个被存储在程序rom407或者数据rom408中时,由嵌入式设备40构成和更新对应关系表。

图58是图示使用对应关系表的rom擦除bios例程的示例的流程图。

在步骤5800(s5800),用改写报头地址置换变量addr。改写报头地址与图53至图56中所示的数据写入目的地的报头地址相对应。接下来,在步骤5801(s5801),从对应关系表中搜索对应于addr的擦除块编号。在步骤5802(s5802),确定是否搜索到对应擦除块编号。如果是,则处理转移到步骤5803。如果否,则处理结束。在步骤5803(s5803),用擦除块编号置换变量blkno。在步骤5804(s5804),擦除程序rom407或者数据rom中具有编号blkno的块。

接下来,将描述生成更新信息文件50的处理。在根据本实施例生成更新信息文件50的处理中,将图33a中的处理步骤3305的细节从图35a和图35b替换成图59a和图59b。图59a和图59b是图示图33a中的步骤3305的细节的流程图。在下文中,将描述与图35a和图35b中所示的处理不同的方面,并且将适当省略对类似处理的描述。

从步骤5900(s5900)到步骤5903(s5903)的处理类似于图35a中从步骤3500到步骤3503的处理。

在步骤5904(s5904),数据处理单元22仅将步骤5905至5908中处理重复各自具有变更的数据表的数目的次数。

步骤5905(s5905)的处理类似于图35a中的步骤3505的处理。

在步骤5906(s5906),当在步骤5905计算出的地址中已经包括数据表时,数据处理单元22确定存在要擦除的块并且将块中的数据表变量以及更新信息设定为写入数据。如上所述,在本实施例中,通过参考对应关系表来确定要擦除的块的数目。因此,并未作出如在图35a的步骤3506中对要擦除块的数目的判定。然而,当在步骤5905计算出的地址中已经包括数据表时,计算包括计算出的地址的块的数目并且将其用于管理开发环境中的擦除/写入次数。当在步骤5905计算出的地址中不包括数据表时,数据处理单元22将具有变更的整个数据表设定为写入数据。数据处理单元22还计算由更新写入的数据表的数据长度。

在步骤5907(s5907),数据处理单元22通过使用下列用于操作rom擦写驱动程序的变量,生成程序rom407的擦除/写入处理的委托的注入代码721。具体地,使用驱动程序的配置地址、传给驱动程序的帧指针、由更新写入的数据在内置存储器中的配置位置的报头地址、由更新写入的数据的数据长度以及在步骤5905计算出的程序rom407上的报头地址作为自变量。虽然并未传递在步骤5906计算出的块编号作为自变量,但在此生成注入代码,如上所述,当执行注入代码时,擦除通过参考对应关系表确定的编号的块。当在步骤5905计算出的地址中不包括任何数据表时,数据处理单元22生成程序rom写入处理的委托的注入代码707。

从步骤5908(s5908)至步骤5915(s5915)的处理类似于图35a和图35b中从步骤3509至步骤3516的那些处理。

在步骤5916(s5916),数据处理单元22仅将步骤5905至5908中处理重复各自具有变更的数据表的数目的次数。

步骤5917(s5917)的处理类似于图35b所示的步骤3518的处理。

当在步骤5917计算出的地址中已经包括数据表时,在步骤5918(s5918),数据处理单元22确定存在要擦除的块并且将块中的数据表变量以及更新信息设定为写入数据。如上所述,在本实施例中,通过参考对应关系表,确定要擦除的块的数目。因此,并未作出如在图35b的步骤3519中对要擦除块的数目的判定。然而,当在步骤5917计算出的地址中已经包括数据表时,计算包括计算出的地址的块的数目,并且将其用于管理开发环境中的擦除/写入次数。当在步骤5917计算出的地址中不包括数据表时,数据处理单元22将具有变更的整个数据表设定为写入数据。数据处理单元22还计算由更新写入的数据表的数据长度。

在步骤5919(s5919),数据处理单元通过使用写入数据在内置存储器中的配置位置的报头地址、写入数据的长度、以及在步骤5917计算出的报头地址作为自变量,生成数据rom擦除/写入处理的委托的注入代码722。虽然在此情况下没有传递在步骤5918计算出的块编号作为自变量而生成注入代码,但如上所述,当执行注入代码时,擦除通过参考对应关系表确定的编号的块。当在步骤5918计算出的地址中不包括任何数据表时,数据处理单元22生成数据rom写入处理的委托的注入代码708。

此后,从步骤5920(s5920)至步骤5927(s5927)的处理类似于图35b中所示的从步骤3522至步骤3529的那些处理。

如上所述,在本实施例中,数据rom408存储管理当包括在更新信息中的信息被写入程序rom407或者数据rom408时的写入目的地地址以及与该地址相对应的擦除块编号的管理信息,并且在擦除存储在程序rom407或者数据rom408中的信息时,嵌入式设备40消除由在管理信息中指示的擦除块编号指定的区域。因而,与消除由外部指定的区域相比,安全性有所提高。

接下来,将描述应对恶意擦写rom的对策。在第一和第二实施例中,在写入程序rom407或者数据rom408完成之后,执行签名验证。在此情况下,缩短对程序rom407或者数据rom408的写入时间。然而,例如,存在通过发送不必要的数据而有意重复对闪存进行写入以及因签名验证失败进行擦除的可能性。从闪存特性的观点考虑,当频繁执行擦写操作时,恐怕会缩短产品的使用寿命。在本实施例中,出于抑制这种恶意擦写的目的,描述了在签名验证之后进行写入的程序更新操作的示例。

在本实施例中,在将数据写入程序rom407或者数据rom408之前,进行签名验证。通过由硬件管理在写入程序rom407或者数据rom408之前是否进行签名验证,能够更加安全地动态配置更新信息。图60是图示控制是否允许写入rom的控制电路450的示例的示意图。

在本实施例中,嵌入式设备40具有控制电路450。控制电路450具有更新控制寄存器451、逆变电路452、and电路453以及or电路454。向and电路453供应更新控制寄存器451的“f1”位和“f2”位。向or电路454供应and电路453的输出以及逆变电路452的输出。将or电路454的输出供应到作为程序rom407或者数据rom408的控制电路的写入控制器。“许可”位指示仅当cpu401处于特权模式时才可读/可写。仅当在位中设定“1”时,控制电路450的控制才变得有效。“f1”位是指示在写入程序rom407或者数据rom408之前执行到sram406的数据传送完成的位。在“f1”位中,在完成向sram406的数据传送后设定“1”。“f2”位是指示签名验证是否成功的位,并且在完成签名验证后设定“1”。当执行读取时,“f1”位和“f2”位被清为“0”。在控制电路450中,通过将“许可”位设定为“1”,控制电路450的控制变得有效。此后,仅当“f1”位以及“f2”位都被设定为“1”时,才使程序rom407或者数据rom408中的写入控制器有效。当在控制电路450的控制有效的状态下跳过签名验证时,使程序rom407或者数据rom408中的写入控制器无效。因此,即使当通过某种装置执行写入bios时,也不执行到程序rom407或者数据rom408的写入。在位“r”,启用信号值被写入程序rom407或者数据rom408中的写入控制器。位“r”是只读的并且当其被读取时清为“0”。控制电路450可以被单独地提供给程序rom407和数据rom408中的每一个。

接下来,将描述使用控制电路450的操作示例。图61是图示使用控制电路450的写入控制操作的示例的流程图。在本流程图中,假设处理在执行步骤6100之后启动。

在步骤6100(s6100),根据第一和第二实施例中所述的更新操作,将更新差分程序传送到sram406。

在步骤6101(s6101),在完成传送之后,cpu401设定“f1”位。cpu401在传送正常结束的情况下设定“1”并且在其他情况下设定“0”。

在步骤6102(s6102),加密处理单元404(签名验证单元)验证更新差分程序的签名。

在步骤6103(s6103),在完成签名验证之后,cpu401设定“f2”位。cpu401在签名验证结果正常的情况下设定“1”并且在其他情况下设定“0”。

在步骤6104(s6104),检查“许可”位是否为“1”。在“1”的情况下,处理转移到步骤6105。在其他情况下,处理转移到步骤6106。

在步骤6105(s6105),确定“f1”位是否为“1”以及“f2“位是否为“1”。在两个位都为“1”的情况下,处理转移到步骤6106。在其他情况下,处理转移到步骤6108。

在步骤6106(s6106),在程序rom407或者数据rom408中的写入控制器中设定写入许可,并且位“r”中设定“1”。

在步骤6107(s6107),cpu4014始终读取更新控制寄存器451。通过读取操作,检查位“f1”、“f2”和“r”中的数据。这三个位被清为“0”并且处理结束。当在步骤6107完成写入处理时,通过检查位“r”,cpu401能够检查在进行写入处理时到写入控制器的启用信号值是否真正为1。由于除许可位外的所有位都被清为“0”,在向程序或数据rom写入下一个更新差分程序的处理中,有必要检查签名验证与传送完成是否正常进行。能够消除因跳过检查而进行的攻击。

在步骤6108(s6108),在位“r”中设定“0”,并且处理转移到步骤6107。

如上所述,在本实施例中,嵌入式设备40具有当确认签名验证结果有效时准许向程序rom407或者数据rom408写入更新信息的控制电路450。通过该构造,能够抑制其签名验证结果无效的更新信息被写入程序rom407或者数据rom408,并且能够抑制由于无效的更新信息而擦除程序rom407或者数据rom408的处理。

最后,将描述本实施例中的嵌入式设备中的更新操作。在将本实施例应用到程序rom407和数据rom408中的每一个均具有三个层面的嵌入式设备40的情况下的更新操作类似于图37中的更新操作,但在以下方面有所不同。在将本实施例应用到程序rom407和数据rom408中的每一个均具有两个层面的嵌入式设备40的情况下的更新操作类似于图49中的更新操作,但在以下方面有所不同。在应用本实施例的情况下,在图37的步骤3701以及图49的步骤4902,管理服务器30启动更新程序的到程序rom407和数据rom408的动态配置,其中考虑安全地动态加载更新程序,即,本实施例中描述的安全响应。

上文已经描述了第三实施例。根据本实施例,能够抑制通过恶意地使用注入代码而擦除程序和数据,并且还能够抑制对rom的恶意地擦除和写入。

第四实施例

接下来,将描述第四实施例。在第四实施例中,将描述一种在嵌入式设备40中的更新信息的动态配置期间或者在嵌入式设备40中的更新操作期间,在嵌入式设备40中发生电源停止的情况下,恢复时的处理方法。根据本实施例的嵌入式设备40在将更新信息存储到程序rom407或者数据rom408中时存储上述管理信息,其管理更新信息的写入目的地的报头地址以及该报头地址属于的擦除块编号。图62是图示在嵌入式设备40中的动态配置或者更新操作更新信息期间停止电力情况下的恢复处理的示例的流程图。在下文中,将参照本流程图来给出描述。例如,通过由cpu401执行存储在程序rom407等中的诸如固件的程序,实现本流程中嵌入式设备40的操作。

在步骤6200(s6200),嵌入式设备40启动更新信息的动态配置或者关于配置的更新信息的更新操作。

在步骤6201(s6201),在更新信息的动态配置或者更新操作期间,在嵌入式设备40中发生断电。当不发生断电时,步骤6200中的处理持续直到完成该处理。

在步骤6202(s6202),嵌入式设备40的电源恢复,并且嵌入式设备40重启。

在步骤6203(s6203),嵌入式设备40参考对应关系表并且检查是否能够识别程序rom407或者数据rom408中的擦除块编号。具体地,嵌入式设备40通过参考正好在断电前更新信息的配置中生成的对应关系表而在每一个更新信息的配置生成的对应关系表中做出检查。

在步骤6204(s6204)识别成功的情况下,处理转移到步骤6207。在其他情况下,处理转移到步骤6205。步骤6203的识别成功意指能够确认写入目的地的块,其写入正好在断电前更新信息的配置中直到发生断电。如上所述,构成更新信息文件50,当数据在写入更新信息时已经被存储在写入目的地时,擦除作为写入目的地的块,使得能够写入更新信息。因此,当在发生断电之前将更新信息写入程序rom407或者数据rom408中时,出于有可能在不应该存储数据的写入目的地中写入数据的原因,在更新信息文件50中无法重新进行更新。然而,当发生断电前写入数据的位置能够被指定时,通过擦除作为写入目的地的块,能够解决这样的问题。即,在不修改更新信息文件50的情况下,能够再次配置更新信息。

在步骤6205(s6205),嵌入式设备40执行回滚到默认程序的操作的处理。

在步骤6206(s6206),在开发环境20中,重建断电之前生成的更新信息。在此情况下,在全部更新信息都被写入的假设下,进行重建。即,在数据已经被存储在程序rom407或者数据rom408中的写入目的地的假设下,进行重建。在重建中,具体地,生成在其中擦除处理被添加到写入目的地的块的更新信息文件50。此后,处理转移到步骤6200,并且进行基于重建后更新信息的更新信息的动态配置和更新操作。在步骤6206,进行经由网络到管理服务器30的通知以及从管理服务器30到开发环境20的通知并且重建更新信息,或者可以在不向开发环境20发送通知的情况下,在管理服务器30上进行上述重建。

在步骤6207(s6207),嵌入式设备40通过使用在步骤6203中识别的块擦除编号来擦除程序rom407或者数据rom408中的块。此后,处理转移到步骤6200,并且进行基于断电前生成的更新信息的更新信息的动态配置和更新操作。

如上所述,在根据本实施例的嵌入式设备40中,存储管理信息。在将更新信息写入程序rom407或者数据rom408时或者在应用更新信息的操作时电源停止的情况下,在电源恢复之后,当能够参考管理信息时,根据管理信息,消除在电源停止之前写入的更新信息。在本实施例中,即使当发生断电时,也能够实现重启之后的适当更新。特别地,由于通过使用对应关系表指定写入目的地,所以指定了要擦除的块。因此,在不重建更新信息的情况下,能够实现重启之后的适当更新。第四实施例能够与第一、第二和第三实施例中的任何一个组合。

虽然已经在实施例的基础上具体描述了由本发明的发明人实现的发明,但本发明显然不限于这些实施例,而在不脱离主旨的情况下,能够对其作出各种变更。例如,虽然在第一实施例中已描述rom的层面数目是三个的情况,但层面数目可以是四个或四个以上。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1