(57)【特許請求の範囲】
【請求項１】
ネットワークを介して更新情報を受信するネットワーク入出力部と、
独立して読み出し及び書き込みが可能な複数の面を備えた第１の不揮発性メモリと、
独立して読み出し及び書き込みが可能な複数の面を備えた第２の不揮発性メモリと、
前記第１の不揮発性メモリに配置されたプログラムを実行するＣＰＵと、
前記ネットワーク入出力部により受信された更新情報に含まれたアドレス変換テーブルを用いてアドレス変換を行う第１のアドレス変換器と、
前記ネットワーク入出力部により受信された更新情報に含まれたアドレス変換テーブルを用いてアドレス変換を行う第２のアドレス変換器と
を有し、
前記ＣＰＵは、前記第２の不揮発性メモリに配置されたデータを用いて前記第１の不揮発性メモリに配置されたプログラムを実行し、
前記第１の不揮発性メモリは、第１の面にデフォルトプログラムが配置され、第２の面に、前記ネットワーク入出力部により受信された更新情報に含まれた、前記デフォルトプログラムに対する差分プログラムが配置され、
前記第２の不揮発性メモリは、第１の面にデフォルトデータが配置され、第２の面に、前記ネットワーク入出力部により受信された更新情報に含まれた、前記デフォルトデータに対する差分データが配置され、
前記第１のアドレス変換器は、前記ＣＰＵにより命令がデコードされることによって取得されたアドレスが、前記デフォルトプログラムにおける変更箇所に対応するアドレスである場合に、該アドレスを前記差分プログラムが配置されたアドレスへと変換し、
前記第２のアドレス変換器は、前記ＣＰＵにより命令がデコードされることによって取得されたアドレスが、前記デフォルトデータにおける変更箇所に対応するアドレスである場合に、該アドレスを前記差分データが配置されたアドレスへと変換し、
前記ＣＰＵは、前記第１のアドレス変換器により変換されたアドレスに従って前記差分プログラムを実行し、
前記ＣＰＵは、前記第２のアドレス変換器により変換されたアドレスに従って前記差分データを用いた処理を実行する
組込み機器。
【請求項２】
前記第１の不揮発性メモリの面数が３以上である
請求項１に記載の組込み機器。
【請求項３】
前記第１のアドレス変換器は、前記ＣＰＵにより命令がデコードされることによって取得されたアドレスにおける予め定められたビット数の上位ビット列を変更し、かつ、変更された上位ビット列と前記アドレスの下位ビット列とを連結することにより、前記差分プログラムが配置されたアドレスへと変換する
請求項１に記載の組込み機器。
【請求項４】
前記デフォルトプログラムにおける置換対象部分のコードのサイズよりも、前記置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、前記置換対象のコードのサイズ若しくは前記差分コードのサイズが、前記予め定められたビット数に対応するメモリ領域の大きさであるセグメントサイズより大きい場合、前記第１のアドレス変換器は、前記置換対象部分のコードの開始アドレスを所定のアドレスへと変換し、
前記所定のアドレスは、前記置換対象部分のコードに代わる命令列の開始アドレスへのジャンプ命令に関わる命令が記憶されたアドレスである
請求項３に記載の組込み機器。
【請求項５】
前記更新情報についての署名検証を行う署名検証部をさらに有し、
前記ＣＰＵは、前記署名検証部により正当であることが確認された場合、前記差分プログラムを実行する
請求項１に記載の組込み機器。
【請求項６】
前記第２の不揮発性メモリは、前記更新情報に含まれる情報が前記第１の不揮発性メモリ又は前記第２の不揮発性メモリに書き込まれた際の書き込み先アドレスと、該アドレスに対応する消去ブロック番号とを管理する管理情報を記憶し、
前記第１の不揮発性メモリ又は前記第２の不揮発性メモリに記憶された情報の削除の際、前記管理情報に示される消去ブロック番号により指定された領域が削除される
請求項１に記載の組込み機器。
【請求項７】
前記署名検証部により正当であることが確認された場合、前記更新情報の前記第１の不揮発性メモリへの書き込みを許可する制御回路をさらに有する
請求項５に記載の組込み機器。
【請求項８】
前記ネットワーク入出力部は、既に前記第１の不揮発性メモリに配置された更新情報と重複する部分を除く更新情報を受信し、
前記第１の不揮発性メモリには、既に配置されている前記重複する部分に加え、前記重複する部分が除かれた前記差分プログラムが新たに配置される
請求項１に記載の組込み機器。
【請求項９】
前記第２の不揮発性メモリは、前記更新情報に含まれる情報が前記第１の不揮発性メモリ又は前記第２の不揮発性メモリに書き込まれた際の書き込み先アドレスと、該アドレスに対応する消去ブロック番号とを管理する管理情報を記憶し、
前記更新情報の前記第１の不揮発性メモリ若しくは前記第２の不揮発性メモリへの書き込みの際、又は前記更新情報の適用動作の際に電源が停止した場合、電源回復後、前記管理情報が参照可能であるとき前記管理情報に従って電源停止前に書き込まれた前記更新情報が削除される
請求項１に記載の組込み機器。
【請求項１０】
ネットワークを介して更新情報を受信するネットワーク入出力部と、
独立して読み出し及び書き込みが可能な複数の面を備えた第１の不揮発性メモリと、
前記第１の不揮発性メモリに配置されたプログラムを実行するＣＰＵと、
前記ネットワーク入出力部により受信された更新情報に含まれたアドレス変換テーブルを用いてアドレス変換を行う第１のアドレス変換器と
を有し、
前記第１の不揮発性メモリは、第１の面にデフォルトプログラムが配置され、第２の面に、前記ネットワーク入出力部により受信された更新情報に含まれた、前記デフォルトプログラムに対する差分プログラムが配置され、
前記第１のアドレス変換器は、前記ＣＰＵにより命令がデコードされることによって取得されたアドレスが、前記デフォルトプログラムにおける変更箇所に対応するアドレスである場合に、該アドレスを前記差分プログラムが配置されたアドレスへと変換し、
前記ＣＰＵは、前記第１のアドレス変換器により変換されたアドレスに従って前記差分プログラムを実行し、
前記ネットワーク入出力部は、前記差分プログラムに加え、プログラム復元ポイントを構成する情報を含む前記更新情報を受信する
組込み機器。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は組込み機器及びプログラムの更新方法に関し、例えば差分プログラムを用いた更新を行う組込み機器及びプログラムの更新方法に関する。
【背景技術】
【０００２】
近年、車載機器及び産業機器などに組み込まれる組込み機器が増加している。そして、このような組込み機器におけるプログラムをいわゆるＯＴＡ（Ｏｖｅｒ  Ｔｈｅ  Ａｉｒ）により更新する方法が求められている。プログラムの更新に関しては、種々の技術が提案されている。例えば、特許文献１では、モジュール単位の更新プログラムに対して基準アドレスと相対アドレスを予め割当てておく事で、組込み機器上で動作するプログラムの動作を停止させることなく、プログラムをモジュール単位で動的に更新する技術について開示している。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−２１８３３４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、特許文献１に記載された技術では、組込み機器において基準アドレスと相対アドレスから実アドレスを算出することにより、更新プログラムの動的なアドレス解決（すなわち、動的リンク）が可能である事を前提としている。すなわち、特許文献１に記載された技術では、そのようなアドレス解決を行って、更新前のプログラムと、更新前のプログラム及び更新後のプログラムの差分である更新差分プログラムと、を用いたプログラムの再構成を行う必要がある。
【０００５】
しかしながら、このような再構成の実施にあたっては、大容量メモリが必要であること、再構成中は更新前プログラムの読出しが必要となるためＭＣＵ（Ｍｉｃｒｏ  Ｃｏｎｔｒｏｌｌｅｒ  Ｕｎｉｔ）コアでのユーザサービスを停止する必要があることなどの課題がある。このため、更新前プログラムと更新差分プログラムを用いたプログラムの再構成を行うことなく、プログラムの更新を行うことが望まれている。
【０００６】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００７】
一実施の形態によれば、組込み機器は、独立して読み出し及び書き込みが可能な複数の面を備えた不揮発性メモリと、アドレス変換テーブルを用いてアドレス変換を行うアドレス変換器とを有し、前記アドレス変換器は、ＣＰＵにより命令がデコードされることによって取得されたアドレスが、デフォルトプログラムにおける変更箇所に対応するアドレスである場合に、該アドレスを差分プログラムが配置されたアドレスへと変換するものである。
【発明の効果】
【０００８】
前記一実施の形態によれば、更新前プログラムと更新差分プログラムを用いたプログラムの再構成を行うことなく、プログラムの更新処理を行うことができる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態の概要にかかる組込み機器の構成を示すブロック図である。
【図２】実施の形態１にかかる情報システムの構成例を示す模式図である。
【図３】開発環境の構成例を示すブロック図である。
【図４】管理サーバの構成例を示すブロック図である。
【図５】組込み機器の構成例を示すブロック図である。
【図６】組込み機器の他の構成例を示すブロック図である。
【図７】実施の形態１にかかるアドレス変換器の概要を示す模式図である。
【図８】アドレス変換器の接続例を示すブロック図である。
【図９】更新後のプログラム実行手順例を説明する模式図である。
【図１０】アドレス変換器によるアドレス変換の詳細を説明する模式図である。
【図１１Ａ】更新後のデータテーブルのサイズが、データＲＯＭ用アドレス変換器が扱うセグメントサイズを超える場合のアドレス変換例について説明する模式図であり、データテーブルへの１回目のアクセスの際の変換について示す。
【図１１Ｂ】更新後のデータテーブルのサイズが、データＲＯＭ用アドレス変換器が扱うセグメントサイズを超える場合のアドレス変換例について説明する模式図であり、データテーブルへの２回目以降のアクセスの際の変換について示す。
【図１２】更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。
【図１３】変換されたアドレスと差分コードの対応例を示す模式図である。
【図１４】変換されたアドレスと差分コードの別の対応例を示す模式図である。
【図１５】変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。
【図１６】変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。
【図１７】更新情報ファイルの構成例を示す模式図である。
【図１８】インジェクションコードの構成例を示す模式図である。
【図１９】インジェクションコードが実行されるまでの流れを説明する模式図である。
【図２０】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２１】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２２】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２３】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２４】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２５】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２６】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２７】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２８】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図２９】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図３０】インジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図３１Ａ】ＢＩＯＳルーチンを関数呼び出しで実行する場合のインジェクションコードの構成例を示す模式図である。
【図３１Ｂ】ＢＩＯＳルーチンへのＪｕｍｐ命令によりＢＩＯＳルーチンを実行する場合のインジェクションコードの構成例を示す模式図である。
【図３２Ａ】ＢＩＯＳコードの更新を伴わないプログラムの更新の場合の３面のプログラムＲＯＭへのＢＩＯＳコードの配置例を示す模式図である。
【図３２Ｂ】ＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合の３面のプログラムＲＯＭへのＢＩＯＳコードの配置例を示す模式図である。
【図３３Ａ】差分更新に対応する、更新バイナリコードと更新情報の生成の処理の一例を示すフローチャートである。
【図３３Ｂ】差分更新に対応する、更新バイナリコードと更新情報の生成の処理の一例を示すフローチャートである。
【図３４】全体プログラム更新に対応する、更新バイナリコードと更新情報の生成の処理の一例を示すフローチャートである。
【図３５Ａ】差分プログラムのマージの処理の一例を示すフローチャートである。
【図３５Ｂ】差分プログラムのマージの処理の一例を示すフローチャートである。
【図３６】組込み機器が配置されたシステムの構成例を示す。
【図３７】プログラム更新手順の一例を示すフローチャートである。
【図３８】組込み機器におけるプログラムの動的な配置動作の一例を説明する模式図である。
【図３９】組込み機器におけるプログラムの動的な配置動作の別の一例を説明する模式図である。
【図４０】組込み機器の起動動作の一例を示すフローチャートである。
【図４１】「更新差分コード配置後初期化処理」の一例を示すフローチャートである。
【図４２】ＢＩＯＳの呼び出しを行うコードのＳＲＡＭへの配置及びＢＩＯＳの実行の手順の一例を示すフローチャートである。
【図４３】更新情報ファイルに含まれる更新差分バイナリを管理サーバから組込み機器に転送する手順の一例を示すフローチャートである。
【図４４】実施の形態２にかかる組込み機器の構成例を示すブロック図である。
【図４５】実施の形態２にかかる組込み機器の他の構成例を示すブロック図である。
【図４６】実施の形態２にかかるアドレス変換器の概要を示す模式図である。
【図４７】新たな差分コードの構築時に、以前配置した差分コードを再利用する方法について説明する模式図である。
【図４８Ａ】ＢＩＯＳコードの更新を伴わないプログラムの更新の場合の２面のプログラムＲＯＭへのＢＩＯＳコードの配置例を示す模式図である。
【図４８Ｂ】ＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合の２面のプログラムＲＯＭへのＢＩＯＳコードの配置例を示す模式図である。
【図４９】実施の形態２にかかるプログラム更新手順の一例を示すフローチャートである。
【図５０】実施の形態２にかかる組込み機器の起動動作の一例を示すフローチャートである。
【図５１】実施の形態２にかかる「更新差分コード配置後初期化処理」の一例を示すフローチャートである。
【図５２】実施の形態３にかかるインジェクションコードの構成例を示す模式図である。
【図５３】実施の形態３にかかるインジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図５４】実施の形態３にかかるインジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図５５】実施の形態３にかかるインジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図５６】実施の形態３にかかるインジェクションコードでの処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【図５７】データＲＯＭに格納される対応表の一例を示す図である。
【図５８】対応表を用いたＲＯＭ消去ＢＩＯＳルーチンの一例を示すフローチャートである。
【図５９Ａ】実施の形態３にかかる、差分プログラムのマージの処理の一例を示すフローチャートである。
【図５９Ｂ】実施の形態３にかかる、差分プログラムのマージの処理の一例を示すフローチャートである。
【図６０】ＲＯＭへの書込みの許否を制御する制御回路の一例を示す模式図である。
【図６１】制御回路を用いた書き込みの制御動作の一例を示すフローチャートである。
【図６２】組込み機器で更新情報の動的な配置又は更新動作の途中で電源停止が発生した場合の復旧処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００１１】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００１２】
＜概要＞
まず、実施の形態の詳細な説明に先立って、実施の形態の概要について説明する。図１は、実施の形態の概要にかかる組込み機器１の構成を示すブロック図である。組込み機器１は、図１に示すように、ネットワーク入出力部２と、不揮発性メモリ３と、ＣＰＵ４と、アドレス変換器５とを有する。
ネットワーク入出力部２は、ネットワークを介して更新情報を受信する。更新情報は、組込み機器１のプログラム及びデータを更新するための情報である。不揮発性メモリ３は、独立して読み出し及び書き込みが可能な複数の面を備えたＲＯＭであり、例えばフラッシュメモリである。不揮発性メモリ３は、第１の面にデフォルトプログラム（更新前プログラム）が配置され、第２の面にデフォルトプログラムに対する差分プログラムが配置される。なお、差分プログラムは、ネットワーク入出力部２により受信される更新情報に含まれており、ネットワーク入出力部２が更新情報を受信後、不揮発性メモリ３に配置されることとなる。なお、差分プログラムは更新差分プログラムと呼ばれることがある。ＣＰＵ４は、不揮発性メモリ３に配置されたプログラムを実行する。また、アドレス変換器５は、ネットワーク入出力部２により受信された更新情報に含まれたアドレス変換テーブルを用いてアドレス変換を行う。アドレス変換器５は、ＣＰＵ４により命令がデコードされることによって取得されたアドレスが、デフォルトプログラムにおける変更箇所に対応するアドレスである場合に、このアドレスを差分プログラムが配置されたアドレスへと変換する。そして、ＣＰＵ４は、アドレス変換器５により変換されたアドレスに従って差分プログラムを実行する。これにより、ＣＰＵ４は、デフォルトプログラム及び差分プログラムからなる更新後のプログラムを実行することとなる。
このように、組込み機器１では、アドレス変換器５によりアドレス変換を行っているため、更新前プログラムと差分プログラムを用いたプログラムの再構成を行う必要がない。
【００１３】
＜実施の形態１＞
以下、図面を参照しつつ、実施の形態１について具体的に説明する。
図２は、実施の形態１にかかる情報システム１０の構成例を示す模式図である。情報システム１０は、開発環境２０と、管理サーバ３０と、組込み機器４０とを含む。管理サーバ３０と組込み機器４０は、ネットワーク１５で相互に接続されている。組込み機器４０は、例えば車載制御ＥＣＵ（Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）や産業ＦＡ（Ｆａｃｔｏｒｙ  Ａｕｔｏｍａｔｉｏｎ）制御機器などといった制御機器が相当する。なお、図２では、開発環境２０、管理サーバ３０、及び組込み機器４０が全て一台の場合を例に記載しているが、管理サーバ３０及び組込み機器４０は任意の台数で良い。また、管理サーバ３０は複数台を経由する形式にカスケードに接続された構成でも良い。更に、ネットワーク１５は、管理サーバ３０と組込み機器４０を相互に接続できる形態であれば任意で良い。従って、ネットワーク１５は、有線接続と無線接続のどちらか一方または両方で構成されていても良い。ネットワーク１５には、例えばインターネットや放送波、車載・産業ネットワークが含まれる。
【００１４】
このような情報システム１０において、開発環境２０には更新前のプログラムのソースコード、更新前のプログラムのオブジェクトコード、更新後のプログラムのソースコード等が入力される。そして、開発環境２０により生成された更新情報ファイル５０が、ネットワーク１５を介して組込み機器４０に送信される。組込み機器４０には予めメモリに更新前のプログラムのオブジェクトコード６５が配置されている。組込み機器４０は、更新情報ファイル５０に含まれる差分プログラムオブジェクトコード５１及びアドレス変換テーブル５２を受信し、更新後のプログラムの実行を行う。以下、具体的に説明する。
【００１５】
図３は、開発環境２０の構成例を示すブロック図である。開発環境２０は、情報システム１０において更新差分プログラムの作成者が使用するコンピュータシステムである。なお、以下の説明において、更新差分プログラム（差分プログラム）は、更新差分コード又は更新差分バイナリとも称され得る。更新差分プログラム（差分プログラム）は、更新前のプログラムと更新後のプログラムの差分のプログラムである。開発環境２０は、１つ以上の組込み機器４０に配信する更新情報ファイル５０を生成する。開発環境２０は、入力部２１、データ処理部２２、及び出力部２３を有する。
【００１６】
入力部２１は、更新差分プログラムの作成者が、開発環境２０に対する指示を与えるのに使用されるデバイスである。この例の場合、組込み機器４０で使用される更新情報ファイル５０の作成等の指示を与えるために使用される。入力部２１は、更新前プログラムのソースコード６１、この更新前プログラムのソースコード６１に対応する更新前プログラムのオブジェクトコード６２、更新後プログラムのソースコード６３、ロールバック情報配置アドレス６４を入力として受ける。ここで、更新前プログラムは、組込み機器で現在動作しているプログラムである。更新後プログラムは、組込み機器で新たに動作させるプログラムであり、更新プログラムと称されうる。ロールバック情報配置アドレス６４は、例えばプログラム更新で何らかの異常が検知された際に、ロールバック対象となるプログラム復元ポイントを構成する情報である。
【００１７】
出力部２３は、更新情報ファイル５０を管理サーバ３０に渡すために使用されるデバイスであり、例えば出力インターフェースである。
【００１８】
データ処理部２２は、図示しない処理装置とメモリから構成される。処理装置は、読み込んだプログラムの内容を解釈してデータ処理を実行する。処理装置は、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）又はＭＰＵ（Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）等で構成される。メモリは、処理装置で使用される処理データを一時的に記憶する記憶装置である。メモリは例えばＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等で構成される。尚、メモリには、更新情報ファイル５０の作成を支援するプログラム等が格納される。このプログラムには、更新後プログラムのソースコード６３を更新後プログラムのオブジェクトコードに変換するコンパイラと、２つのソースコード間の差分プログラムソースコードを抽出するプログラムと、この差分プログラムソースコードを適切なオブジェクトコードに変換するコンパイラ及びリンカ、若しくは２つのプログラムオブジェクトコード間の差分を差分プログラムオブジェクトコードに変換するコンパイラ及びリンカと、を含む。
【００１９】
更新情報ファイル５０は、組込み機器４０で動作する更新前プログラムオブジェクトコード６２を更新するための情報を含む。具体的には、更新情報ファイル５０は、更新差分コード５１、アドレス変換テーブル５２、インジェクションコード７０、ロールバック情報配置アドレス６４から成る。以下の説明において、更新差分コードは、更新差分バイナリ、更新差分オブジェクトコードなどと呼ばれうる。なお、更新情報ファイル５０の詳細については、後述する。以下、インジェクションコードを用いて実施の形態の説明を行うが、インジェクションコードの代わりに、呼び出し関数名と当該関数の引数列からなるデータ列を用い、組込み機器内部でこのデータ列からインジェクションコード相当の関数を構成する形式として実現しても良い。このような実現方式を取る事で、インジェクションコード相当の関数を構成時に、データ列の署名検証などといったインジェクションコードの正当性検証がより堅牢に実現可能となる。
【００２０】
次に、管理サーバ３０の構成について説明する。図４は、管理サーバ３０の構成例を示すブロック図である。管理サーバ３０は、情報システム１０において、開発環境２０の出力を一旦受けて、その後、一以上の組込み機器４０に更新情報ファイル５０を配信するコンピュータシステムである。管理サーバ３０は、入力部３１、表示部３２、データ処理部３３、記憶部３４、及びネットワーク接続部３５を有する。
【００２１】
入力部３１は、開発環境２０からの更新情報ファイル５０をデータ処理部３３に渡すために使用されるデバイスである。ここで、開発環境２０と入力部３１の接続は、相互に接続できる形態であれば任意で良い。従って、本接続は、有線接続と無線接続のどちらか一方または両方で構成されていても良い。本接続には、例えばインターネットや放送波が用いられる。
【００２２】
表示部３２は、管理サーバ３０に対する入力情報や処理結果としての各種データ等を表示する出力装置である。表示部３２として、例えばＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）ディスプレイ又は液晶ディスプレイが使用される。
【００２３】
データ処理部３３は、図示しない処理装置とメモリから構成される。処理装置は、読み込んだ更新情報ファイル５０の内容を解釈してデータ処理を実行する。処理装置は、例えばＣＰＵ又はＭＰＵ等で構成される。メモリは、処理装置で使用される処理データを一時的に記憶する記憶装置である。メモリは例えばＲＡＭ等で構成される。尚、メモリには、ネットワーク１５での転送プロトコルに適した形式への更新情報ファイル５０の変換を支援するプログラム等が格納される。このプログラムには、更新情報ファイル５０に含まれる更新差分プログラムオブジェクトコードやアドレス変換テーブルを分割転送する場合に、これらを分割する処理、及び、分割された更新差分プログラムオブジェクトコードや分割されたアドレス変換テーブルの組込み機器への配置などに必要となる各インジェクションコードを分割に合わせて修正する処理などを行うプログラムが含まれる。
【００２４】
記憶部３４は、各種データを記憶又は読み出す装置である。記憶部３４は、例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、光学記憶装置、又はフラッシュメモリデバイス等で構成される。この例の場合、記憶部３４には、更新情報ファイル５０等が格納される。ネットワーク接続部３５は、管理サーバ３０をネットワーク１５に接続するための通信装置である。
【００２５】
次に組込み機器４０について説明する。図５は、組込み機器４０の構成例を示すブロック図である。情報システム１０における組込み機器４０とは、更新対象のプログラムが動作する機器である。組込み機器４０は、例えば制御対象装置４００を制御する組込みコントローラであり、ＣＰＵ４０１、ＣＰＵ４０１が実行するプログラムのアドレスを変換するアドレス変換器４０２、割込みコントローラ４０３、暗号処理ユニット４０４、ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）コントローラ４０５、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０６、夫々独立に読み書き及び消去が可能な３面構成のプログラムＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０７、夫々独立に読み書き及び消去が可能な３面構成のデータＲＯＭ４０８、ＣＡＮ（Ｃｏｎｔｒｏｌｌｅｒ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）インターフェース４０９、及び入出力インターフェース４１０を有する。ここで、プログラムＲＯＭ４０７及びデータＲＯＭ４０８は、具体的には、例えばフラッシュメモリなどの不揮発性メモリである。ＣＰＵ４０１は、データＲＯＭ４０８に配置されたデータを用いて、プログラムＲＯＭ４０７に配置されたプログラムを実行する。なお、暗号処理ユニット４０４は、暗号鍵のセキュアな管理、暗号鍵を用いたプログラム又はデータの暗号化又は復号化、署名発行、署名検証などを行うユニットである。暗号処理ユニット４０４は、例えば、更新情報についての署名検証を行う。なお、暗号処理ユニット４０４は、署名検証部と称されることもある。暗号処理ユニット４０４は、例えば、暗号処理ユニット４０４に含まれる図示しないＣＰＵがプログラムを実行することにより、上述の処理を行う。プログラムＲＯＭ４０７は、いずれかの面にデフォルトプログラムが配置され、他の面に、デフォルトプログラムに対する差分プログラムが配置される。また、データＲＯＭ４０８は、いずれかの面にデフォルトデータが配置され、第２の面に、前記デフォルトデータに対する差分データが配置される。なお、差分プログラム及び差分データは、ＣＡＮインターフェース４０９により受信される更新情報に含まれている。また、ＣＡＮインターフェース４０９は、ネットワーク入出力部とも称され、ネットワーク１５を介して更新情報を受信する。アドレス変換器４０２は、ＣＡＮインターフェース４０９により受信された更新情報に含まれたアドレス変換テーブルを用いてアドレス変換を行う。
【００２６】
なお、図５に示した例では、組込み機器４０は、サブＣＰＵが設けられていないが、図６に示すように、組込み機器４０が、メインＣＰＵ４０１、ＣＰＵ４０１が実行するプログラムのアドレスを変換するアドレス変換器４０２、割込みコントローラ４０３、暗号処理ユニット４０４、サブＣＰＵ４１１、サブＣＰＵ４１１が用いるプログラムＲＯＭ４１２、ＤＭＡコントローラ４０５、ＳＲＡＭ４０６、夫々独立に読み書き及び消去が可能な３面構成のプログラムＲＯＭ４０７、夫々独立に読み書き及び消去が可能な３面構成のデータＲＯＭ４０８、ＣＡＮインターフェース４０９、及び入出力インターフェース４１０を有してもよい。またプログラムＲＯＭ４１２は物理的には、プログラムＲＯＭ４０７上に配置されていても良い。
【００２７】
図７は、本実施の形態にかかるアドレス変換器４０２の概要を示す模式図である。アドレス変換器４０２は、例えば、２つのアドレス変換テーブル４２０Ａ、４２０Ｂのうち、いずれかのアドレス変換テーブルを用いて、アドレス入力部４２１に入力されたアドレスが変換対象のアドレスである場合にこのアドレスを変換し、アドレス出力部４２２から出力する。なお、２つのアドレス変換テーブル４２０Ａ、４２０Ｂのうち、例えば、一方がｎ回目の更新により使用されるテーブルであり、他方がｎ＋１回目の更新により使用されるテーブルである。このように、ｎ＋１回目の更新では、例えば、それまでアドレス変換テーブル４２０Ａによる変換に基づいて行われていたプログラムの実行が、アドレス変換テーブル４２０Ｂによる変換に基づいて行われるプログラムの実行へと切り替えられる。
【００２８】
アドレス入力部４２１は、アドレス変換器４０２におけるアドレスの入力インターフェースであり、ＣＰＵ４０１（より具体的にはＣＰＵ４０１のコア）が命令をデコードして生成するアドレスが入力される。なお、この入力は、ＣＰＵ４０１のコアから直接入力されても良いし、バスを介して入力されても良い。アドレス出力部４２２は、アドレス変換器４０２におけるアドレスの出力インターフェースであり、プログラムＲＯＭ４０７及びデータＲＯＭ４０８が接続されたメモリバスにアドレスを出力する。なお、アドレス出力部４２２は、メモリバスを介さず、プログラムＲＯＭ４０７及びデータＲＯＭ４０８にアドレスを直接入力してもよい。
【００２９】
このような構成により、アドレス変換器４０２には、アドレス変換テーブル４２０Ａ又は４２０Ｂとして、更新情報ファイル５０に含まれるアドレス変換テーブル５２が設定される。そして、アドレス変換器４０２は、アドレス入力部４２１からの入力アドレスに対し、選択ビット４２３に基づくセレクタ４２４の選択により選ばれたアドレス変換テーブルを用いた変換を実施し、アドレス出力部４２２から出力アドレスを出力する。また、アドレス変換器４０２は、セレクタ４２５により、アドレス変換テーブルによる変換の有効化・無効化を切り替えることが可能になっている。
【００３０】
このようなアドレス変換により、ＣＰＵが実行するプログラムアドレスの変換を実施し、更新前プログラムオブジェクトコードの更新部分となる更新差分プログラムオブジェクトコードを適切に実行可能とする事で、更新後プログラムオブジェクトコードの実行を可能としている。
【００３１】
次に、アドレス変換器４０２の接続関係についてより詳細に説明する。図８は、アドレス変換器４０２のより具体的な接続例を示すブロック図である。組込み機器４０は、アドレス変換器４０２として、具体的には、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａと、データＲＯＭ４０８用のアドレス変換器４０２Ｂを有する。本実施の形態では、プログラムＲＯＭが３面であることに対応して、組込み機器４０は、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａを２個搭載している。また、同様に、組込み機器４０は、データＲＯＭ４０８用のアドレス変換器４０２Ｂを２個搭載している。ここで、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａは、命令用バスインターフェース４２６及びメモリバス４２７との間に設けられており、命令用バスインターフェース４２６からの変換前アドレスに対し変換後アドレスをメモリバス４２７に出力する。また、データＲＯＭ４０８用のアドレス変換器４０２Ｂは、オペランド用バスインターフェース４２８及びメモリバス４２７との間に設けられており、オペランド用バスインターフェース４２８からの変換前アドレスに対し変換後アドレスをメモリバス４２７に出力する。なお、命令用バスインターフェース４２６及びオペランド用バスインターフェース４２８は、それぞれ、ハーバードアーキテクチャで構成されたプロセッサコア４２９（ＣＰＵ４０１）に接続されている。
プログラムＲＯＭ４０７用のアドレス変換器４０２Ａは、ＣＰＵ４０１により命令がデコードされることによって取得されたアドレスが、デフォルトプログラムにおける変更箇所に対応するアドレスである場合に、このアドレスを差分プログラムが配置されたアドレスへと変換する。また、データＲＯＭ４０８用のアドレス変換器４０２Ｂは、ＣＰＵ４０１により命令がデコードされることによって取得されたアドレスが、デフォルトデータにおける変更箇所に対応するアドレスである場合に、このアドレスを差分データが配置されたアドレスへと変換する。そして、ＣＰＵ４０１は、データＲＯＭ４０８用のアドレス変換器４０２Ｂにより変換されたアドレスに従って、差分データを用いた処理を実行する。このように、本実施の形態では、組込み機器４０は、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａに加えて、データＲＯＭ４０８用のアドレス変換器４０２Ｂを有している。このため、プログラムコードの更新に限らず、データの更新にも対応することが可能となる。一般に、プログラムＲＯＭやデータＲＯＭに配置されているデータの更新がなされると、元々のデータとはアドレスが異なるため、更新されたデータへアクセスを行うプログラムコードも変更がなされる。この変更により、差分コード量が増加するという問題がある。アドレス変換器を用いる事で、プログラムコード上のアドレスの変更を極力抑えつつデータを更新する事が可能となり、差分コードの増加量を削減する事が可能となる。
【００３２】
次に、更新後のプログラムの実行手順について説明する。図９は、更新後のプログラム実行手順例を説明する模式図である。ここでは、プログラムＲＯＭ４０７の第１の面に、更新前プログラムオブジェクトコードが配置され、プログラムＲＯＭ４０７の第２の面に、更新差分プログラムオブジェクトコードの一部が配置されている場合を考える。ここで、第２の面に配置されているコードブロック８００は、更新前プログラムオブジェクトコードの一部であるコードブロック８０１に対応しているものとする。ＣＰＵ４０１によるプログラム実行の際、アドレス変換器４０２によるアドレス変換を実施する事で、コードブロック８０１がコードブロック８００に置き換えられて実行される。このような方法により、更新後のプログラム実行を可能としている。以下、図９での更新後プログラム実行例を示す。
【００３３】
まず、ＣＰＵ４０１のプログラムカウンタの値はＷである（図中（１）参照）。このとき、アドレス変換テーブルの変換元アドレスにＷが存在しないので、アドレス変換器４０２はＷを出力する（図中（２）参照）。続いて、ＣＰＵ４０１が、アドレスＷにある命令Ｊｕｍｐ Ｘを実行し、プログラムカウンタをＸに書き換える（図中（３）参照）。次に、ＣＰＵはアドレスＸにある命令を読み出そうとするが（図中（４）参照）、Ｘが変換元アドレスに一致したため（図中（５）参照）、アドレス変換器４０２はアドレスＹを出力する（図中（６）参照）。このため、ＣＰＵ４０１はアドレスＹから命令を読み出し、実行する（図中（７）参照）。その後、プログラムカウンタの値は、Ｘ＋１に変更され、アドレス変換器４０２によって、Ｘ＋１がＹ＋１に読み替えられ、アドレスＹ＋１にある命令が実行される。更新後コードブロック８００の末尾には命令Ｊｕｍｐ Ｚが配置されており、これをＣＰＵ４０１が実行する（図中（８）参照）。その後、ＣＰＵ４０１は、更新前プログラムのアドレスＺから実行を継続する（図中（９）参照）。
【００３４】
ここで、アドレス変換器４０２によるアドレス変換の詳細を説明する。アドレス変換器４０２は、具体的には、ＣＰＵ４０１により命令がデコードされることによって取得されたアドレスにおける予め定められたビット数の上位ビット列（以下、上位アドレスと称されうる）を変更し、かつ、変更された上位ビット列とアドレスの下位ビット列（以下、下位アドレスと称されうる）とを連結することにより、アドレスの変換を実現する。すなわち、アドレス変換器４０２は、入力された上位アドレスが、アドレス変換テーブルに登録された変換元アドレスに一致するか否か判定し、一致した場合、当該上位アドレスを変換先アドレスに置換し、変換した上位アドレスに下位アドレスを連接して出力する。このように、アドレス変換器４０２は、上位アドレスのビット数を一つのセグメントとして、アドレス変換を行う。これにより、アドレスの全ビットを変換対象とする場合に比べ、アドレス変換テーブルの大きさを小さくすることができる。図１０は、アドレス変換器４０２によるアドレス変換の詳細を説明する模式図である。ここでは、アドレスのビット数が３２ビットであるとし、アドレス変換器４０２に設定されるセグメントサイズが２Ｓバイトであるとする。この場合、例えば最大ｋ個の変換が記されるアドレス変換テーブルには、変換元のアドレスとしての（３２−ｓ）ビットの上位アドレスと、変換先のアドレスとしての（３２−ｓ）ビットの上位アドレスとの対が格納されている。アドレス変換器４０２は、比較器４３０により、変換前アドレスの上位アドレスが、アドレス変換テーブルに示される変換元のアドレスと一致するか否かを判定する。セレクタ４３１は、一致する場合、アドレス変換テーブルに示される変換先のアドレスを出力し、一致しない場合、変換前アドレスの上位アドレスを出力する。その後、連結器４３２が、セレクタ４３１が出力した（３２−ｓ）ビットの上位アドレスと、ｓビットの変換前アドレスの下位アドレスを連結し、変換後アドレスを生成する。
【００３５】
なお、データＲＯＭ用アドレス変換器４０２Ｂを用いた更新プログラムの実行手順も、このように変換元の上位アドレスを変換先の上位アドレスに変換後、下位アドレスを連接して、新たに配置されたデータＲＯＭ４０８上のデータテーブルなどにアクセスを実施する手順となるが、次のような工夫が追加されてもよい。以下に示す工夫により、新たに配置される配列等のデータテーブルが、データＲＯＭ用アドレス変換器４０２Ｂが扱うセグメントサイズを超える大きなデータテーブルとなった場合にも、更新を実現する事が可能となる。図１１Ａ及び図１１Ｂは、更新後のデータテーブルのサイズが、データＲＯＭ用アドレス変換器４０２Ｂが扱うセグメントサイズを超える場合のアドレス変換例について説明する模式図であり、図１１Ａは、データテーブルへの１回目のアクセスの際の変換について示し、図１１Ｂは、データテーブルへの２回目以降のアクセスの際の変換について示している。
【００３６】
ここでも、アドレスのビット数が３２ビットであるとし、アドレス変換器４０２に設定されるセグメントサイズが２Ｓバイトであるとする。つまり、セグメントサイズは、Ｓビットアドレス空間のサイズとなる。なお、一般的に、データテーブルへの各アクセスでは、配列要素間等のアドレス・オフセットだけ、アクセス先のアドレスが異なる。
【００３７】
データテーブルに対する１回目のアクセスの際、データＲＯＭ用アドレス変換器４０２Ｂは、変換前上位アドレス（ｐｒｅ＿ａｄｄｒ＿ｏｌｄとする）と、アドレス変換テーブルに基づく変換後上位アドレス（ｐｏｓｔ＿ａｄｄｒ＿ｏｌｄとする）をレジスタ等に一旦保存する。なお、１回目のアクセスの際、データＲＯＭ用アドレス変換器４０２Ｂは、変換後上位アドレスに、全て０であるｓビットのビット列を連接し、変換後のアドレスとして出力する。そして、データＲＯＭ用アドレス変換器４０２Ｂは、データテーブルに対する２回目以降のアクセスの際、次のように変換後のアドレスを出力する。なお、ここでは、２回目以降のアクセスの際の変換前上位アドレスをｐｒｅ＿ａｄｄｒ＿ｎｅｗとする。ｐｒｅ＿ａｄｄｒ＿ｎｅｗがアドレス変換テーブルの変換元アドレスと一致する場合、データＲＯＭ用アドレス変換器４０２Ｂは、アドレス変換テーブルに示される変換先上位アドレスと入力された下位アドレスとを連結して出力する。これに対し、ｐｒｅ＿ａｄｄｒ＿ｎｅｗがアドレス変換テーブルの変換元アドレスと一致しない場合、データＲＯＭ用アドレス変換器４０２Ｂは、ｐｒｅ＿ａｄｄｒ＿ｎｅｗとｐｒｅ＿ａｄｄｒ＿ｏｌｄとの差分ａｄｄｒ＿ｄｉｆｆを求める。すなわち、ａｄｄｒ＿ｄｉｆｆ ＝ ｐｒｅ＿ａｄｄｒ＿ｎｅｗ − ｐｒｅ＿ａｄｄｒ＿ｏｌｄが算出される。この差分ａｄｄｒ＿ｄｉｆｆの予め定められた下位ｔビット以外が全て０である場合、データＲＯＭ用アドレス変換器４０２Ｂは、ｐｏｓｔ＿ａｄｄｒ＿ｏｌｄとａｄｄｒ＿ｄｉｆｆとの和をとって生成される上位アドレス(ｐｏｓｔ＿ａｄｄｒ＿ｏｌｄ ＋ ａｄｄｒ＿ｄｉｆｆ)と、下位アドレスとを連結して出力する。また、この差分ａｄｄｒ＿ｄｉｆｆの予め定められた下位ｔビット以外が全て０でない場合、データＲＯＭ用アドレス変換器４０２Ｂは、ｐｒｅ＿ａｄｄｒ＿ｎｅｗと下位アドレスとを連結して出力する。つまり、この場合、データＲＯＭ用アドレス変換器４０２Ｂは、もはやデータテーブルへのアクセスではないとして、入力されたアドレスを変換せずに出力する。
【００３８】
このアドレス変換方式により、例えばデータROMに元々配置していた配列のサイズが新規プログラムではセグメントの境界を超えるほどに肥大化した場合に対応可能となる。配列サイズが一致する部分へのアクセスに関しては、アドレス変換器によりデフォルトプログラムと更新プログラムでは全く同一アドレスへのアクセスとする事が可能となるため、同一アドレス部の値に変更がなければ、増加した部分へのアクセスを行うプログラムコードのみが差分コードとなる。特に、以下に開示するアドレス変換方式では、増加した部分へのアクセスを行う差分コードは、配列サイズが一致する部分のアドレスに連続するアドレスへのアクセスを行うコードとする事が可能となる。
【００３９】
次に、更新前プログラムと差分プログラムの間のプログラム実行遷移について説明する。図１２は、更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。ここではメモリ空間Ａに更新前プログラムのオブジェクトコードが配置されている。メモリ空間Ａにおいて、Ｃｏｎｓｔ変数及び列挙型値などのテキストセグメントに配置される定数変数とその値がメモリ領域８０２に、関数ｆがメモリ領域８０３に、関数ｇがメモリ領域８０４に、関数ｈがメモリ領域８０５に、初期値付き変数がメモリ領域８０６に、初期値なし変数がメモリ領域８０７に、スタックなどをメモリ領域８０８に配置した例を示している。またメモリ空間Ｂに、更新差分プログラムのオブジェクトコードが配置されている。パッチ８０９は、関数ｆの一部に対応する更新差分プログラムオブジェクトコード、パッチ８１０は、関数ｇの一部に対応する更新差分プログラムオブジェクトコード、パッチ８１１は、関数ｈの一部に対応する更新差分プログラムオブジェクトコード、に夫々対応しているものとする。図１２に記載のコード間のプログラム実行遷移例を以下に示す。
【００４０】
まず、ＣＰＵ４０１による関数ｆの実行中に、アドレス変換により、パッチ８０９の先頭アドレスにプログラムの実行が遷移する。パッチ８０９における関数ｇの実行では、メモリ空間Ａに配置された関数ｇの先頭アドレスが呼び出される。関数ｇの呼び出し完了後は、パッチ８０９の関数ｇの呼び出し位置の次のアドレスにプログラムの実行が遷移し、パッチ８０９の残りのプログラムの実行がなされる。そして、パッチ８０９の実行完了後に戻るべき関数ｆのアドレスへと、プログラムの実行が遷移する。次に、ＣＰＵ４０１による関数ｇ実行中に、アドレス変換により、パッチ８１０の先頭アドレスにプログラムの実行が遷移する。パッチ８１０における関数ｈの実行では、メモリ空間Ａに配置された関数ｈの先頭アドレスが呼び出される。関数ｈの呼び出し完了後は、パッチ８１０の関数ｈの呼び出し位置の次のアドレスに、プログラムの実行が遷移し、パッチ８１０の残りのプログラムの実行がなされる。そして、パッチ８１０の実行完了後に戻るべき関数ｇのアドレスへと、プログラムの実行が遷移する。次に、ＣＰＵ４０１での関数ｈの実行中に、アドレス変換により、パッチ８１１の先頭アドレスにプログラムの実行が遷移する。そして、パッチ８１１の実行完了後に戻るべき関数ｈのアドレスへと、プログラムの実行が遷移する。その後、ＣＰＵ４０１は、関数ｈの実行を継続し、プログラムの実行を完了する。
【００４１】
次に、変換されたアドレスと差分コードの対応例について図１３〜図１６を参照しながら説明する。図１３は、変換されたアドレスと差分コードの対応例を示す模式図である。ここでは、置換対象コード８１２を差分コード８１３で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図１３に示す例は、差分コードサイズｔが置換対象コードのサイズｓと同じ、又は置換対象コードのサイズｓより小さい場合であって、ｓとｔがプログラム用アドレス変換器４０２Ａに設定されるセグメントサイズ以下の場合の例である。置換対象コード８１２の先頭アドレスにＣＰＵ４０１によるプログラム実行が到達すると、プログラム用アドレス変換器４０２Ａにより、プログラムカウンタに設定されたアドレスが、差分コード８１３の先頭アドレスに変換され、プログラム遷移が実施される。プログラム用アドレス変換器４０２Ａが順次、変換前アドレスを差分コード８１３のアドレスに変換しつつ、差分コード８１３の終了アドレスまでプログラム実行が継続される。差分コード８１３の終了アドレスには、置換対象コード８１２の終了アドレスの次のアドレスへのＪＵＭＰ(ジャンプ)命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
【００４２】
図１４は、変換されたアドレスと差分コードの別の対応例を示す模式図である。ここでは、置換対象コード８１４を差分コード８１５で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図１４に示す例は、差分コードサイズｔが置換対象コードのサイズｓより大きい場合か、またはｓとｔの何れかがプログラム用アドレス変換器４０２Ａに設定されるセグメントサイズより大きい場合に対応している。置換対象コード８１４の先頭アドレスにＣＰＵ４０１によるプログラム実行が到達すると、プログラム用アドレス変換器４０２Ａにより、プログラムカウンタに設定されたアドレスが、差分コード８１５の先頭アドレスに変換され、プログラム遷移が実施される。差分コード８１５の先頭には、更新差分プログラムの開始アドレスへのジャンプ命令に関わる命令が配置されている。ここで、ジャンプ命令に関わる命令には、ジャンプを実施するオブジェクトコードが含まれるが、必要に応じて、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコード、及びジャンプ先のアドレス計算を実施するオブジェクトコードが含まれてもよい。なお、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコードは、次のような理由により必要となる場合がある。ジャンプ命令のジャンプ先アドレスの計算を行う命令の挿入が一般には必要となるが、ジャンプ命令のためのアドレス計算に必要となる命令列とジャンプ命令は、更新差分バイナリ生成時に挿入されるものであり、更新差分バイナリを生成するための更新プログラムには元々存在しない命令列である。つまり、この命令列は、更新プログラムを実行した場合には本来現れない命令列である。従って、これら命令列の実行は、本来あるべきＣＰＵレジスタ状態と異なるＣＰＵレジスタ状態を構成し得る。それ故、これら命令列の実行前のＣＰＵのレジスタ状態をレジスタ退避により保持し、実行後にレジスタ復旧する事で、これら命令列のＣＰＵレジスタ状態への影響が排除される。ここで、ジャンプ先のアドレスは、例えば、ジャンプ命令に関わる命令列のオブジェクトコードが完了するアドレスの次のアドレスである。これにより、ジャンプ命令によるプログラム遷移後、ＣＰＵ４０１は、差分コード８１５の終了アドレスまでプログラム実行を継続する。差分コード８１５の終了アドレスには、置換対象コード８１４の終了アドレスの次のアドレスへのジャンプ命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
【００４３】
このように、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合、アドレス変換器４０２は、次のようなアドレス変換を行う。すなわち、アドレス変換器４０２は、置換対象部分のコードの開始アドレスを、置換対象部分のコードに代わる命令列の開始アドレスへのジャンプ命令に関わる命令が記憶されたアドレスへと変換する。このようにすれば、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合であっても、適切に更新後のプログラムの実行を実現することが可能となる。
【００４４】
次に、変数についての更新がある場合の例について図１５及び図１６を参照して説明する。図１５は、変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、更新に伴い、Ｃｏｎｓｔ変数や列挙型値などテキストセグメントに配置される定数変数の追加、定数変数の変更、又は初期値付き変数の追加があり、これら変数に差分コードのみからアクセスされる例に対応している。変数の追加又は変更があった部分は元々メモリ空間Ａに配置されている変数ではなく、メモリ空間Ｂに配置した変数を参照しつつ、図１３又は図１４の実行方法に従ってプログラム実行が行われる。これら変数は差分コードが配置されるメモリ空間Ｂに新たに差分コードの一部として配置され、差分コード実行時には、追加又は変更があった部分に関しては、元々メモリ空間Ａに配置されている変数ではなく、メモリ空間Ｂの変数が参照されてプログラムが実行される事で、変数の値更新が実現される。
【００４５】
図１６は、変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、大域変数である初期値付き変数又は局所変数である初期値付き変数の初期値の変更があるとき、又は更新前コードから参照される初期値付き変数の追加があるときの例に対応している。これら変更又は追加があった部分はメモリ空間Ｂに新たに配置した変数群をアドレス変換機構を援用して参照しつつ、図１３又は図１４の実行方法に従ってプログラム実行が行われる。初期値変更又は、初期値付き変数の追加があった部分に関しては、メモリ空間Ａに配置されている変数であって変更又は追加の影響を受ける変数群に対して、追加される変数群又は変更後の変数群を、差分コードが配置されているメモリ空間Ｂに新たに配置し、差分コード実行時には、アドレス変換機構を用いてこれら変数を参照し実行する事で、追加又は変更を伴うプログラム実行が実現される。特に、局所変数の場合は、メモリ空間Ｂ上に配置された変数へのアクセスを実施するのに対し、大域変数の場合は、メモリ空間Ｂに配置された変数がリブート後にデータセグメント(データセグメントがＳＲＡＭ４０６に割り当てられている場合はＳＲＡＭ４０６、データＲＯＭ４０８に割り当てられている場合はデータＲＯＭ４０８)に展開された後、初期値付き変数の追加又は変更を伴うプログラム実行がなされる。なお、このような展開は、後述する、ＢＩＯＳ（バイオス）関数の大域変数更新のためのデータＲＯＭ消去書込み処理関数、または大域変数更新のためのデータＲＯＭ書込み処理関数により実行される。これら関数に対し適切な引数が渡されて呼び出し実行されるよう、更新差分バイナリは構成される。
【００４６】
次に、更新情報ファイル５０の詳細について説明する。更新情報ファイル５０は、組込み機器のプログラムを更新するために使用される。上述の通り、更新情報ファイル５０は、ロールバック情報の配置アドレス６４、アドレス変換テーブル５２、インジェクションコード７０、更新差分プログラムオブジェクトコード５１で構成される（図１７）。以下に、更新情報ファイル５０を構成する要素のそれぞれを説明する。
【００４７】
ロールバック情報の配置アドレス６４は、例えばプログラム更新で何らかの異常を検知した際のプログラム復元ポイントを構成する情報である。本実施の形態では、以前にパッチ当てを実施した更新差分プログラムオブジェクトコードに対応するアドレス変換テーブルの記憶領域の先頭アドレスを示す。ここで、アドレス変換テーブルはデータＲＯＭ４０８などに格納されているものとする。アドレス変換テーブルは、複数配置されている可能性がある。なお、どのアドレス変換テーブルも参照しない状態、即ち、どのパッチ当ても行われていない状態を復元ポイントとして指定する場合は、アドレス変換器４０２を無効化するためのインジェクションコードの生成が実施される。
【００４８】
アドレス変換テーブル５２は、上述の通り、更新前プログラムのパッチ当て対象コード部の先頭アドレスを変換元アドレスとし、このパッチの先頭アドレスを変換先アドレスとした、更新差分プログラム実行のためのアドレス変換の対応関係を記載したテーブルである。なお、本実施の形態では、具体的には、アドレス変換テーブル５２は、変換元アドレスの上位アドレスと変換先アドレスの上位アドレスとの対応関係を記載したテーブルである。ここで、アドレス変換の対応関係は、ｋ個まで指定可能であるとする。ｋは例えば３２などの定数であり、ハードウェア仕様等により定まる。
【００４９】
インジェクションコード７０は、更新差分プログラムのオブジェクトコード５１のプログラムＲＯＭ４０７への配置、アドレス変換テーブル５２のデータＲＯＭ４０８への配置、アドレス変換テーブル５２のアドレス変換器４０２への設定、アドレス変換器４０２の有効化、必要に応じたプログラムＲＯＭ４０７又はデータＲＯＭ４０８のデータ消去、異常検出などをトリガとしたロールバック処理、これら処理を実行するためのＢＩＯＳプログラムのデータＲＯＭ４０８からプログラムＲＯＭ４０７への展開、などを実行するためのＢＩＯＳプログラムを呼び出すために使用されるプログラム群である。ここで、インジェクションコードは、対応するＢＩＯＳルーチンへ適切な引数を渡して、ＢＩＯＳルーチンを呼び出すプログラムである。インジェクションコードの実行方法としては、例えば、ＣＡＮインターフェース４０９を介してＳＲＡＭ４０６にインジェクションコードを配置し、割込みコントローラ４０３によりプログラムカウンタをインジェクションコードが配置されたアドレスへと遷移させ、インジェクションコードを実行する。インジェクションコードの実行により対応するＢＩＯＳが起動し、更新差分バイナリなどＣＡＮインターフェース４０９を介してＳＲＡＭ４０６に転送されたデータのプログラムＲＯＭ４０７／データＲＯＭ４０８へのデータ配置が実施される。ここで、ＢＩＯＳコードの配置位置は、プログラムＲＯＭ４０７の実行中ではない面であっても良いし、データＲＯＭ４０８の実行中ではない面であっても良い。また、インジェクションコードの実行はＣＡＮインターフェース４０９からの割込みで起動した割り込みハンドラ内で実施しても良い。また、例えば、インジェクションコードの実行を必ず割込みにて実施する場合、全ＢＩＯＳコードは、実行終了時に、当該割込みのクリアを実施し、Ｈａｌｔ命令を実行するよう記述されていてもよい。
【００５０】
図１８は、インジェクションコードの構成例を示す模式図である。インジェクションコード７０は、例えば、更新バイナリのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７０１、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７０２、データＲＯＭ４０８上のアドレス変換テーブルのロードのインジェクションコード７０３、アドレス変換有効化・無効化のインジェクションコード７０４、局所変数の初期値の更新のためのプログラムＲＯＭ４０７の消去/書込み処理委譲のインジェクションコード７０５、大域変数の初期値の更新のためのデータＲＯＭ４０８の消去/書込み処理委譲のインジェクションコード７０６、局所変数の初期値の更新のためのプログラムＲＯＭ４０７の書込み処理委譲のインジェクションコード７０７、大域変数の初期値の更新のためのデータＲＯＭ４０８の書込み処理委譲のインジェクションコード７０８、指定復元ポイントへのロールバック処理のインジェクションコード７０９、デフォルト動作へのロールバック処理のインジェクションコード７１０、更新キャンセル処理のインジェクションコード７１１、プログラムＲＯＭ４０７のデフォルト面切り替えのインジェクションコード７１２、データＲＯＭ４０８のデフォルト面切り替えのインジェクションコード７１３、更新差分コードのベリファイ処理（署名検証処理）委譲のインジェクションコード７１４、アドレス変換テーブルのベリファイ処理（署名検証処理）委譲のインジェクションコード７１５、データＲＯＭ４０８上のＢＩＯＳコードのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７１６、などから構成される。なお、各インジェクションコードの詳細については、後述する。
【００５１】
次に、インジェクションコードが実行されるまでの流れについて説明する。図１９は、インジェクションコードが実行されるまでの流れを説明する模式図である。まず、管理サーバ３０にて、インジェクションコードテンプレート群から作成対象のインジェクションコード（インジェクションコードＡとする）のテンプレートを選択し、管理サーバ３０のメモリ３６上に展開する（図中（１）参照）。次に、管理サーバ３０にて、インジェクションコードの引数定義に従い、インジェクションコードＡへの実引数設定を実施する（図中（２）参照）。次に、実引数設定済みのインジェクションコードＡを管理サーバ３０のネットワーク接続部３５などのネットワークＩ／Ｆからネットワーク１５へ送信する（図中（３）参照）。次に、組込み機器４０は、ＣＡＮインターフェース４０９などのネットワークＩ／Ｆからネットワーク経由で実引数設定済みインジェクションコードＡを受信する（図中（４）参照）。そして、例えばＣＡＮインターフェース４０９からの割込みでＤＭＡコントローラ４０５またはＣＰＵ４０１上のデータ転送プログラムを起動し、ＳＲＡＭ４０６上の特定領域に実引数設定済みインジェクションコードＡを配置する（図中（５）参照）。ＤＭＡコントローラ４０５を用いた場合は、配置完了を表す割込み通知後、ＣＰＵ４０１上のデータ転送プログラムを用いた場合は、当該プログラムからの通知後、ＳＲＡＭ４０６の特定領域に配置した実引数設定済みインジェクションコードＡが実行される。
【００５２】
以下、各インジェクションコードについて説明する。図２０は、データＲＯＭ４０８上のアドレス変換テーブルのロードを行うインジェクションコード７０３、更新差分コードのベリファイ処理委譲を行うインジェクションコード７１４、又はアドレス変換テーブルのベリファイ処理委譲を行うインジェクションコード７１５での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
【００５３】
まず、ステップ２０００（Ｓ２０００）で、第一引数ａｒｇ１にデータ先頭アドレスを配置する。データＲＯＭ４０８上のアドレス変換テーブルのロードを行うインジェクションコード７０３の場合、読み出し元の先頭アドレスが、第一引数ａｒｇ１に設定される。また、更新差分コードのベリファイ処理委譲を行うインジェクションコード７１４及びアドレス変換テーブルのベリファイ処理委譲を行うインジェクションコード７１５の場合、ベリファイする対象の先頭アドレスが第一引数ａｒｇ１に設定される。次に、ステップ２００１（Ｓ２００１）で第二引数ａｒｇ２にデータ長を配置する。データＲＯＭ４０８上のアドレス変換テーブルのロードを行うインジェクションコード７０３の場合、読み出されるデータのデータ長が、第二引数ａｒｇ２に設定される。また、更新差分コードのベリファイ処理委譲を行うインジェクションコード７１４及びアドレス変換テーブルのベリファイ処理委譲を行うインジェクションコード７１５の場合、ベリファイする対象のデータ長が第二引数ａｒｇ２に設定される。次に、ステップ２００２（Ｓ２００２）で、対応するＢＩＯＳルーチンのコールを実施する。
【００５４】
ここで、データＲＯＭ４０８上のアドレス変換テーブルのロードのインジェクションコード７０３で呼び出されるＢＩＯＳルーチンは、データＲＯＭ４０８上のアドレス変換テーブルのロードを実施する。実行例は、例えば以下のようになる。アドレス変換テーブルがＣＡＮインターフェース４０９からの割込みによりＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みでデータＲＯＭ４０８上のアドレス変換テーブルのロードのインジェクションコード７０３がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。そして、当該ＢＩＯＳルーチンでは、ＳＲＡＭ４０６に配置されたアドレス変換テーブルをアドレス変換器４０２に設定する。
【００５５】
更新差分コードのベリファイ処理委譲のインジェクションコード７１４で呼び出されるＢＩＯＳルーチンは、更新差分プログラムのオブジェクトコードの署名検証処理を実施する。実行例は、例えば以下のようになる。署名付きの更新差分プログラムのオブジェクトコードがＣＡＮインターフェース４０９からの割込みによりＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みでこのコードのベリファイ処理委譲のインジェクションコード７１４がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。そして、当該ＢＩＯＳルーチンでは、ＳＲＡＭ４０６に配置された更新差分プログラムのオブジェクトコードの署名検証処理を実施する。
【００５６】
アドレス変換テーブルのベリファイ処理委譲のインジェクションコード７１５で呼び出されるＢＩＯＳルーチンは、アドレス変換テーブルの署名検証処理を実施する。実行例は、例えば以下のようになる。署名付きのアドレス変換テーブルがＣＡＮインターフェース４０９からの割込みによりＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みでアドレス変換テーブルのベリファイ処理委譲のインジェクションコード７１５がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、ＳＲＡＭ４０６に配置されたアドレス変換テーブルの署名検証を実施する。
【００５７】
図２１は、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲を行うインジェクションコード７０２での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。まず、ステップ２１００（Ｓ２１００）で、第一引数ａｒｇ１に読出しデータの先頭アドレスを配置し、ステップ２１０１（Ｓ２１０１）で、第二引数ａｒｇ２にデータ長を配置し、ステップ２１０２（Ｓ２１０２）で、第三引数ａｒｇ３にデータ書込み先の先頭アドレスを配置し、ステップ２１０３（Ｓ２１０３）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７０２で呼び出されるＢＩＯＳルーチンは、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理を実施する。実行例は、例えば以下のようになる。アドレス変換テーブルがＣＡＮインターフェース４０９からの割込みにてＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みでアドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７０２がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、ＳＲＡＭ４０６に配置されたアドレス変換テーブルのデータＲＯＭ４０８への書込み処理を実施する。
【００５８】
図２２に更新差分プログラムのオブジェクトコードのプログラムＲＯＭ４０７への書込み処理委譲を行うインジェクションコード７０１、又はデータＲＯＭ４０８上に配置されたＢＩＯＳルーチンコードのプログラムＲＯＭ４０７への書込み処理委譲を行うインジェクションコード７１６での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。まずステップ２２００（Ｓ２２００）で、第一引数ａｒｇ１にプログラムＲＯＭ４０７への書込み処理プログラム（ドライバ）が配置される、ＳＲＡＭ４０６上のアドレスを配置する。なお、書込み処理プログラムはプログラムＲＯＭ４０７の特定のアドレスに予め配置されている。次に、ステップ２２０１（Ｓ２２０１）で、第二引数ａｒｇ２に、この書込み処理プログラムへ渡す引数のフレームポインタを配置する。なお、ステップ２２００及びステップ２２０１で設定される引数は、ＲＯＭのドライバを動作させるのに必要な引数である。これは、プログラムＲＯＭ４０７の書き換えをＳＲＡＭ４０６上で実行する必要があることに起因している。続いて、ステップ２２０２（Ｓ２２０２）で、第三引数ａｒｇ３に読出しデータの先頭アドレスを配置し、ステップ２２０３（Ｓ２２０３）で、第四引数ａｒｇ４に読み出しデータのデータ長を配置し、ステップ２２０４（Ｓ２２０４）で、第五引数ａｒｇ５にデータ書込み先の先頭アドレスを配置する。そして、ステップ２２０５（Ｓ２２０５）で、対応するＢＩＯＳルーチンのコールを実施する。
【００５９】
ここで、更新差分プログラムのオブジェクトコードのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７０１で呼び出されるＢＩＯＳルーチンは、プログラムＲＯＭ４０７への書込み処理プログラムを第一引数に指定されたＳＲＡＭ４０６のアドレスに配置し、第二引数に指定されたフレームポインタをこの書込み処理プログラムへ引き渡し、この書込み処理プログラムを実行する事で、更新差分プログラムのオブジェクトコードのプログラムＲＯＭ４０７への書込み処理を実施する。実行例は、例えば以下のようになる。更新差分プログラムのオブジェクトコードがＣＡＮインターフェース４０９からの割込みにてＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みで更新差分プログラムのオブジェクトコードのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７０１がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、ＳＲＡＭ４０６に配置された更新差分プログラムのオブジェクトコードのプログラムＲＯＭ４０７への書込み処理を実施する。ここで、ＳＲＡＭ４０６に配置されたプログラムＲＯＭ４０７への書込み処理プログラムは、ＳＲＡＭ４０６をワークメモリとして用いる専用ハードウェアとして実現されていても良い。
【００６０】
データＲＯＭ４０８上に配置されたＢＩＯＳルーチンコードのプログラムＲＯＭ４０７への書込み処理委譲で呼び出されるＢＩＯＳルーチンは、プログラムＲＯＭ４０７への書込み処理プログラムを第一引数に指定されたＳＲＡＭ４０６のアドレスに配置し、第二引数に指定されたフレームポインタをこの書込み処理プログラムへ引き渡し、この書込み処理プログラムを実行する事で、データＲＯＭ４０８上に配置されたＢＩＯＳルーチンコードのプログラムＲＯＭ４０７への書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みでデータＲＯＭ４０８上に配置されたＢＩＯＳルーチンコードのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７１６がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、データＲＯＭ４０８上に配置されたＢＩＯＳルーチンコードのプログラムＲＯＭ４０７への書込み処理を実施する。
【００６１】
図２３は、デフォルトプログラム動作へのロールバック処理委譲を行うインジェクションコード７１０、又は更新キャンセル処理委譲を行うインジェクションコード７１１での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。ステップ２３００（Ｓ２３００）で、対応するＢＩＯＳルーチンのコールを実施する。デフォルトプログラム動作へのロールバック処理委譲のインジェクションコード７１０で呼び出されるＢＩＯＳルーチンは、デフォルトプログラム動作へのロールバック処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みでデフォルトプログラム動作へのロールバック処理委譲のインジェクションコード７１０がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、デフォルトプログラム動作へのロールバック処理を実施する。ここで、デフォルトプログラム動作へのロールバック処理では、例えば、次の再起動でのブート時にアドレス変換器４０２の無効化が実施されるよう設定を行う。更新キャンセル処理委譲のインジェクションコード７１１で呼び出されるＢＩＯＳルーチンは、更新キャンセル処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで更新キャンセル処理委譲のインジェクションコード７１１がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、更新キャンセル処理を実施する。ここで、更新キャンセル処理では、例えば、プログラムＲＯＭ４０７又はデータＲＯＭ４０８への書込みがどこまで成されたかの確認をし、書込まれた部分の消去を実施し、更新動作前にプログラム状態を退避していた場合は、プログラム状態の復旧を実施し、退避した状態からのプログラムの再開処理を実施する。
【００６２】
図２４は、指定復元ポイントへのロールバック処理委譲を行うインジェクションコード７０９での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。なお、ロールバックに際し、例えば以下のような前提がある。すなわち、既に複数回、更新差分コードがプログラムＲＯＭ４０７に配置されている事、更新差分コードのうち、初期値付き局所変数と大域変数を除くプログラムは上書きされる事なくプログラムＲＯＭ４０７に配置されたままである事、及びアドレス変換テーブルがデータＲＯＭ４０８に格納されているのと同様にデータＲＯＭ４０８にこれまでの更新差分コードに含まれた初期値付き局所変数や大域変数が格納されている事、が前提となっている。ここで、どの更新差分コード（初期値付き局所変数と大域変数を除くプログラム）にロールバックするかは、対応するアドレス変換テーブルを設定する事で可能となる。ただし、初期値付き局所変数と大域変数に関しては、何度かの更新で既に上書きされている可能性があり、ロールバックの際に書き戻す必要がある。
【００６３】
ステップ２４００（Ｓ２４００）で、第一引数ａｒｇ１に復元ポイントに対応するアドレス変換テーブルの先頭アドレスを配置する。ステップ２４０１（Ｓ２４０１）で、第二引数ａｒｇ２に復元ポイントに対応するアドレス変換テーブルのエントリ数を配置する。ステップ２４０２（Ｓ２４０２）で、復元ポイントに対応するアドレス変換テーブルの設定を実施するＢＩＯＳルーチンＡのコールを実施する。そして、以下のステップ２４０３〜２４０７を必要回数だけ実施する。ステップ２４０３（Ｓ２４０３）で、第一引数ａｒｇ１に消去ブロック番号を配置する。この消去ブロック番号は、変数更新を実現するためのプログラムＲＯＭ４０７又はデータＲＯＭ４０８の消去対象のブロック番号である。ステップ２４０４（Ｓ２４０４）で、第二引数ａｒｇ２にロールバック対象の差分プログラム内の変数更新部分に対応するコードが配置されているデータＲＯＭ４０８上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ２４０５（Ｓ２４０５）で、第三引数ａｒｇ３に読み出しデータのデータ長を配置する。ステップ２４０６（Ｓ２４０６）で、第四引数ａｒｇ４にデータ書込み先の先頭アドレスを配置する。ステップ２４０７（Ｓ２４０７）で、指定復元ポイントでの初期値付き局所変数や大域変数の配置状態の実現のためのプログラムＲＯＭ４０７及びデータＲＯＭ４０８の消去及び書込みを行うＢＩＯＳルーチンＢのコールを実施する。上述のような引数の設定により、データＲＯＭ４０８に格納された、これまでの更新差分コードに含まれた初期値付き局所変数や大域変数のうち書き込み対象となるものが、書き込まれる。具体的には、局所変数の場合にはプログラム実行のために指定されたプログラムＲＯＭ４０７上のアドレスを先頭アドレスとする領域へと書き込まれ、大域変数の場合にはプログラム実行のために指定されたデータＲＯＭ４０８上のアドレスを先頭アドレスとする領域へと書込まれる。ここで、指定復元ポイントへのロールバック処理委譲のインジェクションコード７０９で呼び出されるＢＩＯＳルーチンは、指定復元ポイントへのロールバック処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで指定復元ポイントへのロールバック処理委譲のインジェクションコード７０９がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、指定復元ポイントへのロールバック処理を実施する。ここで、指定復元ポイントへのロールバック処理では、先ず最初に指定された復元ポイントに対応するアドレス変換テーブルをアドレス変換器４０２に設定し、次いで、指定復元ポイントでの初期値付き局所変数や大域変数の配置状態の実現のためのプログラムＲＯＭ４０７及びデータＲＯＭ４０８の消去及び書込み処理を実施する。
【００６４】
図２５は、プログラムＲＯＭ４０７のデフォルトプログラム配置面の切り替え処理委譲を行うインジェクションコード７１２、又はデータＲＯＭ４０８のデフォルトプログラム配置面の切り替え処理委譲を行うインジェクションコード７１３での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。ステップ２５００（Ｓ２５００）で、第一引数ａｒｇ１にデフォルトとして使用するＲＯＭの先頭アドレスを配置し、ステップ２５０１（Ｓ２５０１）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、プログラムＲＯＭ４０７のデフォルトプログラム配置面の切り替え処理委譲のインジェクションコード７１２で呼び出されるＢＩＯＳルーチンは、プログラムＲＯＭ４０７のデフォルトプログラム配置面の切り替え処理を実施する。また、データＲＯＭ４０８のデフォルトプログラム配置面の切り替え処理委譲のインジェクションコード７１３で呼び出されるＢＩＯＳルーチンは、データＲＯＭ４０８のデフォルトプログラム配置面の切り替え処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みでプログラムＲＯＭ４０７及びデータＲＯＭ４０８のデフォルトプログラム配置面の切り替え処理委譲のインジェクションコード７１２、７１３がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、プログラムＲＯＭ４０７及びデータＲＯＭ４０８のデフォルトプログラム配置面の切り替え処理を実施する。
【００６５】
図２６は、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理委譲を行うインジェクションコード７０６での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。ステップ２６００（Ｓ２６００）で、第一引数ａｒｇ１に消去ブロック番号を配置する。この消去ブロック番号は、変数更新を実現するためのデータＲＯＭ４０８の消去対象のブロック番号である。ステップ２６０１（Ｓ２６０１）で、第二引数ａｒｇ２にロールバック対象の差分プログラム内の大域変数更新部分に対応するコードが配置されているデータＲＯＭ４０８またはＳＲＡＭ４０６上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ２６０２（Ｓ２６０２）で、第三引数ａｒｇ３に読み出しデータのデータ長を配置する。ステップ２６０３（Ｓ２６０３）で、第四引数ａｒｇ４にデータ書込み先の先頭アドレスを配置する。ステップ２６０４（Ｓ２６０４）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理委譲のインジェクションコード７０６で呼び出されるＢＩＯＳルーチンは、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理委譲のインジェクションコード７０６がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理を実施する。
【００６６】
図２７は、大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理委譲を行うインジェクションコード７０８での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。ステップ２７００（Ｓ２７００）で、第一引数ａｒｇ１にロールバック対象の差分プログラム内の大域変数更新部分に対応するコードが配置されている領域（データＲＯＭ４０８またはＳＲＡＭ４０６）上の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ２７０１（Ｓ２７０１）で、第二引数ａｒｇ２に読み出しデータのデータ長を配置する。ステップ２７０２（Ｓ２７０２）で、第三引数ａｒｇ３にデータ書込み先の先頭アドレスを配置する。ステップ２７０３（Ｓ２７０３）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理委譲のインジェクションコード７０８で呼び出されるＢＩＯＳルーチンは、大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理委譲のインジェクションコード７０８がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理を実施する。
【００６７】
図２８は、局所変数更新実現のためのプログラムＲＯＭ４０７の消去及び書込み処理委譲を行うインジェクションコード７０５での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。まず、ステップ２８００（Ｓ２８００）で、第一引数ａｒｇ１に、プログラムＲＯＭ４０７に対する消去及び書込み処理プログラム（ドライバ）が配置される、ＳＲＡＭ４０６上のアドレスを配置する。なお、消去及び書込み処理プログラムはプログラムＲＯＭ４０７の特定のアドレスに予め配置されている。次に、ステップ２８０１（Ｓ２８０１）で、第二引数ａｒｇ２に、この消去及び書込み処理プログラムへ渡す引数のフレームポインタを配置する。なお、ステップ２８００及びステップ２８０１で設定される引数は、ＲＯＭのドライバを動作させるのに必要な引数である。これは、プログラムＲＯＭ４０７の書き換えをＳＲＡＭ４０６上で実行する必要があることに起因している。続いて、ステップ２８０２（Ｓ２８０２）で、第三引数ａｒｇ３に消去ブロック番号を配置する。この消去ブロック番号は、変数更新を実現するためのプログラムＲＯＭ４０７の消去対象のブロック番号である。ステップ２８０３（Ｓ２８０３）で、第四引数ａｒｇ４に、ロールバック対象の差分プログラム内の局所変数更新部分に対応するコードが配置されているデータＲＯＭ４０８またはＳＲＡＭ４０６上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ２８０４（Ｓ２８０４）で、第五引数ａｒｇ５に読み出しデータのデータ長を配置する。ステップ２８０５（Ｓ２８０５）で、第六引数ａｒｇ６にデータ書込み先の先頭アドレスを配置する。ステップ２８０６（Ｓ２８０６）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理委譲のインジェクションコード７０５で呼び出されるＢＩＯＳルーチンは、プログラムＲＯＭ４０７に対する消去及び書込みプログラムを第一引数に指定されたＳＲＡＭ４０６のアドレスに配置し、第二引数に指定されたフレームポインタをこの消去及び書込みプログラムへ引き渡し、この消去及び書込みプログラムを実行する事で、局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理委譲のインジェクションコード７０５がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理を実施する。ここで、ＳＲＡＭ４０６に配置されたプログラムＲＯＭ４０７に対する消去及び書込みプログラムは、ＳＲＡＭ４０６をワークメモリとして用いる専用ハードウェアとして実現されていても良い。
【００６８】
図２９は、局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理委譲を行うインジェクションコード７０７での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。まず、ステップ２９００（Ｓ２９００）で、第一引数ａｒｇ１にプログラムＲＯＭ４０７への書込み処理プログラム（ドライバ）が配置される、ＳＲＡＭ４０６上のアドレスを配置する。なお、書込み処理プログラムはプログラムＲＯＭ４０７の特定のアドレスに予め配置されている。次に、ステップ２９０１（Ｓ２９０１）で、第二引数ａｒｇ２に、この書込み処理プログラムへ渡す引数のフレームポインタを配置する。なお、ステップ２９００及びステップ２９０１で設定される引数は、ＲＯＭのドライバを動作させるのに必要な引数である。これは、プログラムＲＯＭ４０７の書き換えをＳＲＡＭ４０６上で実行する必要があることに起因している。続いて、ステップ２９０２（Ｓ２９０２）で、第三引数ａｒｇ３にロールバック対象の差分プログラム内の局所変数更新部分に対応するコードが配置されているデータＲＯＭ４０８またはＳＲＡＭ４０６上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ２９０３（Ｓ２９０３）で、第四引数ａｒｇ４に読み出しデータのデータ長を配置する。ステップ２９０４（Ｓ２９０４）で、第五引数ａｒｇ５にデータ書込み先の先頭アドレスを配置する。ステップ２９０５（Ｓ２９０５）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理委譲のインジェクションコード７０７で呼び出されるＢＩＯＳルーチンは、書込み処理プログラムを第一引数に指定されたＳＲＡＭ４０６のアドレスに配置し、第二引数に指定されたフレームポインタをこの書込み処理プログラムへ引き渡し、この書込み処理プログラムを実行する事で、局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理委譲のインジェクションコード７０７がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理を実施する。ここで、ＳＲＡＭ４０６に配置された書込み処理プログラムは、ＳＲＡＭ４０６をワークメモリとして用いる専用ハードウェアとして実現されていても良い。
【００６９】
図３０は、アドレス変換有効化・無効化処理委譲を行うインジェクションコード７０４での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。ステップ３０００（Ｓ３０００）で、第一引数ａｒｇ１にアドレス変換器４０２の有効化又は無効化を指定する値を配置し、ステップ３００１（Ｓ３００１）で、対応するＢＩＯＳルーチンのコールを実施する。ここで、アドレス変換器の有効化・無効化処理委譲のインジェクションコード７０４で呼び出されるＢＩＯＳルーチンは、アドレス変換器の有効化又は無効化処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みでアドレス変換有効化・無効化処理委譲のインジェクションコード７０４がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、アドレス変換器の有効化又は無効化処理を実施する。
【００７０】
以上、各種インジェクションコードについて説明した。インジェクションコードの配置及び実行、並びにインジェクションコードからコールされるＢＩＯＳルーチンの実行は、図５の構成の場合、ＣＰＵ４０１によって行われる。一方、図６の構成の場合、メインＣＰＵ４０１又はサブＣＰＵ４１１の何れで実行しても良い。サブＣＰＵ４１１で実行する場合、ＢＩＯＳコードをプログラムＲＯＭ４１２に配置しても良い。プログラムＲＯＭ４１２にＢＩＯＳコードを配置し、サブＣＰＵ４１１でＢＩＯＳルーチンを実行する場合であって、プログラムＲＯＭ４０７やデータＲＯＭ４０８への転送路が図６での破線で示すように二重化されている場合、メインＣＰＵ４０１で現在実行中のプログラムへの機能及び実行動作サイクルに一切影響を与える事なく、現在実行中プログラムの動作中に、更新情報ファイル５０をプログラムＲＯＭ４０７やデータＲＯＭ４０８に動的に配置可能となる。また、破線で示すような伝送路の二重化がされていない場合は、各種ＢＩＯＳコード実行によるプログラムＲＯＭ４０７やデータＲＯＭ４０８へのサブＣＰＵ４１１からのアクセスを、プリエンプティブな最低優先度アクセスとする事で、メインＣＰＵ４０１での現在実行中のプログラムの実行動作への影響が大幅に低減可能となる。
【００７１】
次に、インジェクションコードの構成例について説明する。図３１Ａ、３１Ｂは、インジェクションコードの構成例を示し、図３１Ａは、ＢＩＯＳルーチンを関数呼び出しで実行する場合に対応する例を示し、図３１Ｂは、ＢＩＯＳルーチンへのＪｕｍｐ命令によりＢＩＯＳルーチンを実行する場合に対応する例を示す。なお、図３１Ａ及び図３１Ｂは、いずれも、更新バイナリのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７０１が、一例として示されている。ＢＩＯＳルーチンを関数呼び出しで実行する場合、ＢＩＯＳ引数へのフレームポインタの設定とＢＩＯＳルーチンを関数呼び出し命令とでなるＢＩＯＳルーチン関数呼び出し部分８１６と、ＢＩＯＳルーチンへの引数の配置部分８１７とからなる（図３１Ａ参照）。これに対し、ＢＩＯＳルーチンへのＪｕｍｐ命令によりＢＩＯＳルーチンを実行する場合、ＢＩＯＳ引数へのフレームポインタの設定とＪｕｍｐ命令とからなるＢＩＯＳルーチン関数呼び出し部分８１８と、ＢＩＯＳルーチンへの引数の配置部分８１９とからなる（図３１Ｂ参照）。
【００７２】
次に、ＢＩＯＳコードの配置例について説明する。図３２Ａ、３２Ｂは、ＢＩＯＳコードの３面のプログラムＲＯＭ４０７への配置例を示す模式図であり、図３２ＡはＢＩＯＳコードの更新を伴わないプログラムの更新の場合に対応した例を示し、図３２ＢはＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合に対応した例を示している。
【００７３】
まず、図３２Ａを参照してＢＩＯＳコードの更新を伴わないプログラムの更新の場合について説明する。図３２Ａでは、３面ともに同じＢＩＯＳコードが配置されており、Ａ面にはデフォルトプログラムが配置され、Ｂ面には現在実行中の差分コードが配置されている。そして、Ａ面及びＢ面において、デフォルトプログラムから更新されたプログラムが実行されている。ここで、Ｃ面に新たな更新差分プログラムが配置されることを考える。Ｃ面への更新差分プログラムの配置では、Ｃ面に配置されたＢＩＯＳコードが用いられる。Ｃ面への更新差分プログラムの配置では、ＳＲＡＭ４０６に展開されたプログラムＲＯＭ書込みドライバが書込み実行する事で、Ａ面及びＢ面へのＣＰＵ４０１からのアクセスを阻害する事なく、Ｃ面への更新差分プログラムの配置が可能となる。すなわち、Ａ面及びＢ面でのプログラム実行中の、Ｃ面への更新差分プログラムの配置が可能となる。尚、Ｂ面もＣ面も、配置される更新差分プログラムは、Ａ面に配置されたデフォルトプログラムに対する更新差分プログラムとなる。ここで、Ｂ面に配置する更新差分プログラムは、既にＢ面に配置されている更新差分プログラムを再利用して構成しても良い。また、Ｃ面に配置する更新差分プログラムは、既にＣ面に配置されている更新差分プログラムを再利用して構成しても良い。
【００７４】
次に、図３２Ｂを参照して、ＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合について説明する。図３２Ｂは、Ａ面及びＣ面を消去し、Ｂ面に新デフォルトプログラムと新ＢＩＯＳコードを配置後、Ｂ面に配置された新ＢＩＯＳコードをＡ面とＣ面にコピーして配置した状態を示している。これについて、次のような処理が行われる。まず、Ｂ面の消去を、プログラムＲＯＭ４０７の消去処理委譲のインジェクションコードからプログラムＲＯＭ４０７の消去処理ＢＩＯＳを呼び出して実行する事で実施する。次に、Ｂ面への新デフォルトプログラム及び新ＢＩＯＳコードの配置を、プログラムＲＯＭ書込み処理委譲のインジェクションコードからプログラムＲＯＭ書込み処理を呼び出して実行する事で実施する。そして、デフォルト面切り替え処理委譲のインジェクションコード７１２、７１３からデフォルト面切り替え処理ＢＩＯＳを呼び出して実行する事で、再起動時の開始アドレスをＢ面の先頭とする。プログラムＲＯＭ４０７のＡ面及びＣ面の再起動中の消去を実行するためのプログラムＲＯＭ消去委譲のインジェクションコードと、Ａ面及びＣ面への新ＢＩＯＳコードの再起動中のコピーを実行するためのプログラムＲＯＭ書込み処理委譲のインジェクションコードを、再起動前にＳＲＡＭ４０６からデータＲＯＭ４０８に配置し、再起動中にデータＲＯＭ４０８から上記２つのインジェクションコードをＳＲＡＭ４０６へ展開し、実行する。なお、インジェクションコードを一旦、データＲＯＭ４０８に配置するのは、再起動の際にＳＲＡＭ４０６の記憶内容が失われてしまうためである。再起動後には、図３２Ｂに示すプログラム配置構造が実現され、プログラム開始アドレスがＢ面の先頭に設定され、Ｂ面の新デフォルトプログラムの実行がなされる。なお、新ＢＩＯＳは、データＲＯＭ４０８に一旦配置した後、適当なタイミングでプログラムＲＯＭ４０７に展開されてもよい。
【００７５】
次に更新情報ファイル５０の作成手順について説明する。図３３Ａ、３３Ｂは、差分更新に対応する、更新バイナリコードと更新情報の生成の処理の一例を示すフローチャートである。本フローは、開発環境２０のデータ処理部２２にて実行される。下記のフローは、具体的には、例えば、データ処理部２２のメモリに格納されたプログラムをデータ処理部２２の処理装置が実行することにより実現される。
【００７６】
ステップ３３００（Ｓ３３００）で、データ処理部２２は、変数ｆｌａｇに初期値０を代入する。
ステップ３３０１（Ｓ３３０１）で、データ処理部２２は、ロールバックポイントの指定があるか否か判定する。指定がある場合は、処理がステップ３３０２へ移行する。指定がない場合、処理は、ステップ３３０４へ処理を移行する。
ステップ３３０２（Ｓ３３０２）で、データ処理部２２は、ユーザからのロールバックポイントの指定の入力を受付けて受付けた内容を格納する。
ステップ３３０３（Ｓ３３０３）で、データ処理部２２は、変数ｆｌａｇの値を１に更新する。
【００７７】
ステップ３３０４（Ｓ３３０４）で、データ処理部２２は、更新前後のプログラム（アドレス未解決）を比較して差分プログラムを抽出する。本抽出では、関数構造を考慮しても良い。特に、何れか一方にのみ含まれる関数をインライン（Ｉｎｌｉｎｅ）展開せずに、コールグラフ（Ｃａｌｌ  Ｇｒａｐｈ）における関数名の対応を関数の対応構造として、各対応する関数毎に差分を抽出しても良い。
ステップ３３０５（Ｓ３３０５）で、データ処理部２２は、差分コードを構成するコードブロック（置換ブロック）がＮ個以下になるよう、コードブロックを、２つのプログラム間で変化がない部分を含み得る方法でマージする。なお、Ｎは、例えば、アドレス変換テーブルの設定可能なエントリ数の最大値と、更新差分プログラムが配置されるメモリ領域におけるセグメント数の小さい方の値である。マージ処理の具体的な例については、図３５Ａ、３５Ｂを参照して説明する。
【００７８】
ステップ３３０６（Ｓ３３０６）で、データ処理部２２は、差分コードを構成するコードブロック数（置換ブロック数）を変数Ｍに代入する。
ステップ３３０７（Ｓ３３０７）で、データ処理部２２は、変数ｉを１からＭに１ずつ増加させながら、ステップ３３０８をＭ回繰り返す。
ステップ３３０８（Ｓ３３０８）で、データ処理部２２は、リンクによるアドレス解決済みのプログラムである更新前プログラム（デフォルトプログラム）における、差分コードの第ｉ番目のコードブロックの先頭アドレスを抽出する。この先頭アドレスは、更新の際の変換元のアドレスに相当する。データ処理部２２は、このコードブロックがデフォルトプログラム内の関数を参照する場合、当該関数の呼び出しアドレスを抽出する。
【００７９】
ステップ３３０９（Ｓ３３０９）で、データ処理部２２は、アドレス変換テーブルに設定するセグメントサイズを決定する。なお、セグメントサイズは、変換対象となる上位アドレスのビット数に相当する。セグメントサイズの決定では、差分コードを構成する各コードブロックのサイズを考慮しても良い。例えば、サイズの最大値、中央値、又は平均を用いても良い。なお、セグメントサイズを決定する上位アドレスのビット数が少ないと、大きな差分コードの配置が特段の工夫なく配置可能となる一方、配置可能な差分コードブロックの数は少なくなる。これに対し、セグメントサイズを決定する上位アドレスのビット数が大きいと、図１１Ａ、図１１Ｂ、又は図１４に示したような工夫が配置の際に必要となるが、アドレス変換テーブルのエントリ数を上限として、より多くの差分コードブロックを配置することが可能となる。
ステップ３３１０（Ｓ３３１０）で、データ処理部２２は、開発環境で保持している、更新対象の組込み機器４０のＲＯＭの使用状況を参照し、差分プログラムを構成する各コードブロックの配置位置（先頭アドレス）を決定する。配置位置（先頭アドレス）の決定では、ステップ３３０９で求めたセグメントサイズ毎に高々１つのコードブロックが配置されるように決定を行うものとする。ここで、差分コードを構成するコードブロックの配置において、プログラムＲＯＭ４０７の領域を再利用しても良い。プログラムＲＯＭ４０７の再利用対象領域の消去回数が、どの領域でも均一となるように工夫しても良い。また、消去回数が規定回数を超える場合に、警告を発しても良い。本警告に基づき、ユーザは、差分コードによる更新ではなく、図３４に示す全体プログラム更新へと、更新内容を変更しても良いし、次回の更新を全体プログラム更新としても良い。このように消去回数を参照するのは、以下の点で利点がある。すなわち、例えばＲＯＭとしてフラッシュメモリが用いられる場合、フラッシュメモリは消去書込みで劣化するため、特定領域に集中的に消去や書込みが発生しないよう工夫する事で、フラッシュメモリの寿命を延命することが可能となる。また、品質保証の観点から、書き換え回数の所定の上限を越えての書換えが起らないよう管理することが好ましい。
【００８０】
ステップ３３１１（Ｓ３３１１）で、データ処理部２２は、更新前プログラム（リンク済）のシンボル情報を参照し、差分プログラムを構成する各コードブロックから参照される、アドレス解決済みシンボルのアドレス値を求める。そして、データ処理部２２は、アドレス未解決シンボルやアドレス未解決コードのアドレス解決を、ステップ３３１０で決定した各コードブロックの先頭アドレスを用いて実施する。
ステップ３３１２（Ｓ３３１２）で、データ処理部２２は、アドレス解決済みの差分プログラムを生成する。
ステップ３３１３（Ｓ３３１３）で、データ処理部２２は、変数ｊを１からＭへ１ずつ増加させながら、ステップ３３１４を繰り返す。
ステップ３３１４（Ｓ３３１４）で、データ処理部２２は、差分プログラムを構成する各コードブロックｊについて、ステップ３３１０で求めた先頭アドレスを変換後のアドレスとして抽出する。
ステップ３３１５（Ｓ３３１５）で、データ処理部２２は、各コードブロックに対して、ステップ３３０８で求めた変換前アドレスとステップ３３１４で抽出した変換後のアドレスを対応表としてマージし、アドレス変換表を生成する。
ステップ３３１６（Ｓ３３１６）で、データ処理部２２は、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７０２を生成する。
ステップ３３１７（Ｓ３３１７）で、データ処理部２２は、更新バイナリのプログラムＲＯＭへの書込み処理委譲のインジェクションコード７０１を生成する。
ステップ３３１８（Ｓ３３１８）で、データ処理部２２は、変数ｆｌａｇの値が１に一致するか否か判定する。一致する場合、処理はステップ３３１９へ移行し、一致しない場合、処理は終了する。
ステップ３３１９（Ｓ３３１９）で、データ処理部２２は、指定復元ポイントへのロールバック処理委譲のインジェクションコード７０９を生成する。ここで、本インジェクションコードは、例えば差分プログラム更新にて途中停止やセキュリティ上の異常が発生した場合に実行される。また、本インジェクションコードから実行したロールバックＢＩＯＳコードの実行完了時に、更新キャンセルＢＩＯＳコード呼び出しが実行されるとしても良い。
【００８１】
図３４は、全体プログラム更新に対応する、更新バイナリコードと更新情報の生成の処理の一例を示すフローチャートである。本フローは、開発環境２０のデータ処理部２２にて実行される。下記のフローは、具体的には、例えば、データ処理部２２のメモリに格納されたプログラムをデータ処理部２２の処理装置が実行することにより実現される。
【００８２】
ステップ３４００（Ｓ３４００）で、データ処理部２２は、変数ｆｌａｇに初期値０を代入する。
ステップ３４０１（Ｓ３４０１）で、データ処理部２２は、ロールバックの指定があるか否か判定する。指定がある場合、処理はステップ３４０２へ移行し、指定がない場合、処理はステップ３４０４へ移行する。
ステップ３４０２（Ｓ３４０２）で、データ処理部２２は、ユーザからのロールバックポイントの指定の入力を受付けて受付けた内容を格納する。
ステップ３４０３（Ｓ３４０３）で、データ処理部２２は、変数ｆｌａｇの値を１に更新する。
【００８３】
ステップ３４０４（Ｓ３４０４）で、データ処理部２２は、更新後のプログラムのアドレス解決（リンク）を実施し、更新バイナリを生成する。
ステップ３４０５（Ｓ３４０５）で、データ処理部２２は、ＢＩＯＳコードのデータＲＯＭ４０８からプログラムＲＯＭ４０７への書込みがあるか否か判定する。書込みがある場合、処理はステップ３４０６へ移行し、無い場合、処理はステップ３４０７へ移行する。
ステップ３４０６（Ｓ３４０６）で、データ処理部２２は、データＲＯＭ４０８に格納されているＢＩＯＳコードのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７１６を生成する。ここで、ＢＩＯＳコードのプログラムＲＯＭ４０７への書込みは、一部または全てのプログラムＲＯＭ４０７に未だＢＩＯＳコードが配置されていない場合に実施される。３面のプログラムＲＯＭ４０７の場合、差分コードの書込み先のプログラムＲＯＭ４０７の面にＢＩＯＳコードが配置されていない場合、このプログラムＲＯＭ面へＢＩＯＳコードを書込むこととなる。これにより、例えば予めデータＲＯＭ４０８に格納されていたＢＩＯＳコードが、プログラムＲＯＭ４０７に書き込まれることとなる。
ステップ３４０７（Ｓ３４０７）で、データ処理部２２は、更新バイナリのプログラムＲＯＭ書込み処理委譲のインジェクションコード７０１を生成する。ここでは、全体プログラム更新のため、本インジェクションコードは、復元ポイント無効化のためのデータＲＯＭ４０８の消去を実行するＢＩＯＳコードの呼び出しも実施するものとする。
ステップ３４０８（Ｓ３４０８）で、データ処理部２２は、プログラムＲＯＭ４０７のデフォルト面切り替えのためのインジェクションコード７１２、及びデータＲＯＭ４０８のデフォルト面切り替えのためのインジェクションコード７１３を生成する。
ステップ３４０９（Ｓ３４０９）で、データ処理部２２は、アドレス変換テーブルの無効化を行うインジェクションコードを生成する。
【００８４】
ステップ３４１０（Ｓ３４１０）で、データ処理部２２は、変数ｆｌａｇの値が１か否か比較する。一致する場合、処理はステップ３４１１へ移行し、不一致の場合、処理は終了する。
ステップ３４１１（Ｓ３４１１）で、データ処理部２２は、デフォルト動作へのロールバック処理委譲のインジェクションコード７１０を生成する。ここで、本インジェクションコードは、差分プログラム更新にて途中停止やセキュリティ上の異常が発生した場合に実行される。また、本インジェクションコードから実行したロールバックＢＩＯＳコード実行完了時に、更新キャンセルＢＩＯＳコード呼び出しが実行されるとしても良い。
【００８５】
次に、図３３Ａの処理ステップ３３０５の詳細について説明する。図３５Ａ、３５Ｂは、図３３Ａのステップ３３０５における差分プログラムのマージの処理の一例を示すフローチャートである。なお、以下の説明において、Ｎは、プログラムＲＯＭ４０７用のアドレス変換テーブルのエントリ数、すなわちアドレス変換テーブルに設定可能なアドレス変換の個数の最大値である。また、Ｍは、データＲＯＭ４０８用のアドレス変換テーブルのエントリ数、すなわちアドレス変換テーブルに設定可能なアドレス変換の個数の最大値である。以下に示されるように、プログラムＲＯＭ４０７若しくはデータＲＯＭ４０８に配置されたデータテーブルの更新、又は新規データテーブルの追加により必要となる各種インジェクションコードの生成の実施後、差分コードを構成するコードブロックが規定個数以下のコードブロック数となるようマージ処理を実施する。なお、データテーブルとは、初期値付き局所変数又は大域変数を示すものである。ここで、同一セグメント領域内に、更新される複数のデータテーブルが配置されている場合、それらを纏めて、１つのデータテーブルとして扱うものとする。特に、図１１Ａ、１１Ｂに示したアドレス変換処理を援用する場合、同一セグメント領域内に先頭アドレスが配置されている複数の被更新データテーブルを１つのデータテーブルとして扱っても良い。以下、図３５Ａ、３５Ｂの説明において、データテーブルは、上述のようにセグメント毎に一つにまとめられたデータテーブルを示すものとする。また、新規データテーブルに関しては、セグメント数が最小となる配置が既に実施されているものとする。具体的には、ナップサック問題を解く事でこれが実現される。なお、セグメント数が最小となる配置の一例としては、例えば複数の新規初期値付き局所変数（配列）が同一関数内に記載されている場合に、これらを可能な限り同一セグメント内に配置することが挙げられる。また、セグメント内の一纏めとなったデータテーブルの構成要素（すなわち、結合前のデータテーブル）の夫々の先頭アドレスは、既に算出されているものとする。これら先頭アドレスは、図３３Ａのステップ３３１２でのリンク済み差分プログラムの生成の際に参照される。
【００８６】
ステップ３５００（Ｓ３５００）で、データ処理部２２は、プログラムＲＯＭ４０７への書込みデータテーブル数をｎ、データＲＯＭへの書込みデータテーブル数をｍとする。なお、書込みデータテーブル数とは、データテーブルの書き換え又は追加により、書き込まれるデータテーブルの数である。
ステップ３５０１（Ｓ３５０１）で、データ処理部２２は、Ｎ＞ｎかつＭ≧ｍを満たすか否か判定する。成立していれば、処理はステップ３５０３へ移行し、不成立であれば処理はステップ３５０２へ移行する。
ステップ３５０２（Ｓ３５０２）で、アドレス変換テーブルのエントリ数を超えているため、データ処理部２２は、ステップ３５０１における違反があった書込みに関し、書き込まれるデータテーブルが含まれる隣接するセグメントのマージ処理を実施する。データ処理部２２は、隣接したものがなければ、書き込まれるデータテーブルが含まれる一番近いセグメントのマージを実施する。ここで、データ処理部２２は、ユーザには差分更新が不可能である旨を通知し、セグメントサイズを超えたデータテーブルの更新を許可するか否か問合せる。許可された場合、処理はステップ３５００へ移行し、許可されない場合、処理は中断する。中断した場合は、ユーザが更新プログラムを修正し、再度、更新準備処理を実施するか、プログラム全体更新に方針転換を行う事となる。
【００８７】
ステップ３５０３（Ｓ３５０３）で、データ処理部２２は、差分プログラムにおいて、プログラムＲＯＭ４０７上の既存データテーブルに対する変更があるか否かを判定する。変更がある場合、処理はステップ３５０４へ移行し、変更がない場合、処理はステップ３５１０へ処理を移行する。
ステップ３５０４（Ｓ３５０４）で、データ処理部２２は、変更のあるデータテーブル数だけ、ステップ３５０５〜ステップ３５０９の処理を繰り返す。
ステップ３５０５（Ｓ３５０５）で、データ処理部２２は、変更後のデータテーブルを配置する、プログラムＲＯＭ４０７上の先頭アドレスを算出する。先頭アドレスの算出では、空き領域を優先的に利用する。十分な空きがない場合は、前回以前の更新で更新対象のデータテーブルが配置されているときは、その先頭アドレスを再利用するかをユーザに確認し、ユーザが許可した場合、再利用を考慮した先頭アドレスの算出が実施される。ユーザが許可しない場合や、再利用対象がない場合は、処理が中断される。中断した場合は、ユーザが更新プログラムを修正し、再度、更新準備処理を実施するか、プログラム全体更新に方針転換を行う事となる。
ステップ３５０６（Ｓ３５０６）で、データ処理部２２は、算出したアドレスに既にデータテーブルが含まれている場合、算出したアドレスを含む消去ブロック番号を算出する。
ステップ３５０７（Ｓ３５０７）で、データ処理部２２は、消去対象のブロックがある場合は、そのブロック内のデータテーブル変数を、更新内容も含めて書込みデータとする。データ処理部２２は、消去対象のブロックがない場合は、変更のあるデータテーブル全体を書込みデータとする。また、データ処理部２２は更新により書き込まれるデータテーブルのデータ長も算出する。
ステップ３５０８（Ｓ３５０８）で、データ処理部２２は、ＲＯＭ消去及び書込みのドライバを動作させるための以下の引数を用いて、プログラムＲＯＭ４０７の消去/書込み処理委譲のインジェクションコード７０５を生成する。すなわち、当該ドライバプログラムの配置アドレス、当該ドライバへ渡すフレームポインタ、ステップ３５０６で算出された消去対象のブロック番号、更新により書き込まれるデータの内蔵メモリでの配置位置の先頭アドレス、更新により書き込まれるデータのデータ長、及びステップ３５０５で算出されたプログラムＲＯＭ４０７上の先頭アドレスが引数として用いられる。なお、上記及び下記の説明で述べられる内蔵メモリは、一例としては、ＳＲＡＭ４０６であるが、書き込まれるデータが存在するメモリであればよく、例えばデータＲＯＭ４０８であってもよい。ここで、ステップ３５０６で消去対象のブロックがないと判断された場合、データ処理部２２は、消去対象のブロック番号を伴わない、プログラムＲＯＭ書込み処理委譲のインジェクションコード７０７を生成する。
ステップ３５０９（Ｓ３５０９）で、データ処理部２２は、変数Ｎに、現在のＮの値から１を減じた値を代入する。
【００８８】
ステップ３５１０（Ｓ３５１０）で、データ処理部２２は、差分プログラムにプログラムＲＯＭ４０７上の既存データテーブルに対する変数の追加があるか、または新規データテーブルの追加があるか、を判定する。追加がある場合、処理はステップ３５１１へ移行し、変更がない場合、処理はステップ３５１６へ移行する。ここで、既存データテーブルへの変数の追加が行われた場合、その変数へのアクセスは差分コードのみから行われるため、以降、これを新規データテーブルとして扱う。つまり、既存データテーブルに変数追加のみが行われている場合、既存データテーブルはそのまま変更する事なく、追加部分のみを新規データテーブルとして、更新差分バイナリを生成する。
ステップ３５１１（Ｓ３５１１）で、データ処理部２２は、追加のあるテーブル数だけ、ステップ３５１２〜ステップ３５１５の処理を繰り返す。
ステップ３５１２（Ｓ３５１２）で、データ処理部２２は、追加するテーブルを配置する、プログラムＲＯＭ４０７上の先頭アドレスを算出する。具体的には、追加する各データテーブルの配置状況は、セグメント数が最小となるよう、ナップサック問題を解くなどして決定されているため、データ処理部２２は、追加するデータテーブルが含まれるセグメントの先頭アドレスを決定する。また、データ処理部２２は、追加するデータテーブルのデータ長も算出する。ここで、先頭アドレスの算出では、空き領域を優先的に利用するが、十分な空きがない場合は、処理を中断する。中断した場合は、ユーザが更新プログラムを修正し、再度、更新準備処理を実施するか、プログラム全体更新に方針転換を行う事となる。
ステップ３５１３（Ｓ３５１３）で、データ処理部２２は、ステップ３５１２で決定した先頭アドレスを持つセグメントに含まれるデータテーブルを書込みデータとする。
ステップ３５１４（Ｓ３５１４）で、データ処理部２２は、ＲＯＭ消去・書込みドライバを動作させるための以下の引数を用いて、プログラムＲＯＭ書込み処理委譲のインジェクションコード７０７を生成する。すなわち、当該ドライバプログラムの配置アドレス、当該ドライバへ渡すフレームポインタ、書込みデータの内蔵メモリでの配置位置の先頭アドレス、書込みデータのデータ長、及びステップ３５１２で算出したプログラムＲＯＭ４０７上の先頭アドレスが引数として用いられる。
ステップ３５１５（Ｓ３５１５）で、データ処理部２２は、変数Ｎに、現在のＮの値から１を減じた値を代入する。
【００８９】
ステップ３５１６（Ｓ３５１６）で、データ処理部２２は、差分プログラムにデータＲＯＭ４０８上の既存データテーブルに対する変更があるか否かを判定する。変更がある場合、処理はステップ３５１７へ移行し、変更がない場合、処理はステップ３５２３へ移行する。
ステップ３５１７（Ｓ３５１７）で、データ処理部２２は、変更のあるテーブル数だけ、ステップ３５１８〜ステップ３５２２の処理を繰り返す。
ステップ３５１８（Ｓ３５１８）で、データ処理部２２は、変更後のテーブルを配置する、データＲＯＭ４０８上の先頭アドレスを算出する。先頭アドレスの算出では、空き領域を優先的に利用する。十分な空きがない場合は、前回以前の更新で更新対象のデータテーブルが配置されているときは、その先頭アドレスを利用し、そうでないときは、処理を中断する。中断した場合は、ユーザが更新プログラムを修正し、再度、更新準備処理を実施するか、プログラム全体更新に方針転換を行う事となる。
ステップ３５１９（Ｓ３５１９）で、データ処理部２２は、算出したアドレスに既にデータテーブルが含まれている場合、算出したアドレスを含む消去ブロック番号を算出する。
ステップ３５２０（Ｓ３５２０）で、データ処理部２２は、消去対象のブロックがある場合は、そのブロック内のデータテーブル変数を、更新内容も含めて書込みデータとする。そうでない場合は、変更のあるデータテーブル全体を書込みデータとする。また、データ処理部２２は更新により書き込まれるデータテーブルのデータ長も算出する。
ステップ３５２１（Ｓ３５２１）で、データ処理部２２は、ステップ３５１９で算出した消去対象のブロック番号、書込みデータの内蔵メモリでの配置位置の先頭アドレス、書込みデータのデータ長、及びステップ３５１８で算出した先頭アドレスを引数として、データＲＯＭ消去/書込み処理委譲のインジェクションコード７０６を生成する。ここで、ステップ３５１９で消去対象のブロックがないと判断された場合、データ処理部２２は、消去対象のブロック番号を伴わないデータＲＯＭ書込み処理委譲のインジェクションコード７０８を生成する
ステップ３５２２（Ｓ３５２２）で、データ処理部２２は、変数Ｍに、現在のＭの値から１を減じた値を代入する
【００９０】
ステップ３５２３（Ｓ３５２３）で、データ処理部２２は、差分プログラムにデータＲＯＭ４０８上の既存データテーブルに対する変数の追加があるか、または新規データテーブルの追加があるか、を判定する。変更がある場合、処理はステップ３５２４へ移行し、変更がない場合、処理はステップ３５２９へ移行する。ここで、既存データテーブルへの変数追加が行われた場合、その変数へのアクセスは差分コードのみから行われるため、以降これを新規データテーブルとして扱う。
ステップ３５２４（Ｓ３５２４）で、データ処理部２２は、追加のあるテーブル数だけ、ステップ３５２５〜ステップ３５２８の処理を繰り返す。
ステップ３５２５（Ｓ３５２５）で、データ処理部２２は、追加するテーブルを配置する、データＲＯＭ４０８上の先頭アドレスを算出する。具体的には、追加する各データテーブルの配置状況は、セグメント数が最小となるよう、ナップサック問題を解くなどして決定されているため、データ処理部２２は、追加するデータテーブルが含まれるセグメントの先頭アドレスを決定する。また、データ処理部２２は、追加するデータテーブルのデータ長も算出する。ここで、先頭アドレス算出では、空き領域を優先的に利用するが、十分な空きがない場合は、処理を中断する。中断した場合は、ユーザが更新プログラムを修正し、再度、更新準備処理を実施するか、プログラム全体更新に方針転換を行う事となる。
ステップ３５２６（Ｓ３５２６）で、データ処理部２２は、ステップ３５２５で決定した先頭アドレスを持つセグメントに含まれることとなるデータテーブルを書込みデータとする。
ステップ３５２７（Ｓ３５２７）で、データ処理部２２は、書込みデータの内蔵メモリでの配置位置の先頭アドレス、書込みデータのデータ長、及びステップ３５２５で算出した先頭アドレスを引数として、データＲＯＭ書込み処理委譲のインジェクションコード７０８を生成する。
ステップ３５２８（Ｓ３５２８）で、データ処理部２２は、変数Ｍに、現在の変数Ｍの値から１を減じた値を代入する。
【００９１】
ステップ３５２９（Ｓ３５２９）で、データ処理部２２は、以下の目的関数が最適となるように差分コードをＮ個以下とするためのマージ処理を実施する。マージ処理では、更新プログラム内で分散配置されている２個以上の差分コードを、更新前後において共通するコードである共通コードを含ませて連接する処理を実施する。これにより、初期値付き局所変数及び大域変数を除く更新差分コードブロックの数をＮ個以下とすることができる。最適化での目的関数は、以下の通り示される。ここで、目的関数１〜３のうち、目的関数１が最も優先順位が高く、次に、目的関数２の優先順位が高い。
【００９２】
目的関数１：ｍｉｎｉｍｉｚｅ { ｍａｘ ｏｆ 連続コード}
この目的関数は、更新差分コードのブロックを繋げて得られるコード（連続コード）の最大サイズが最小となるよう最適化する。この最適化の目的は、セグメントサイズが大きくなり過ぎないよう、即ち、Ｎを出来るだけ大きくすることである。
目的関数２： ｍｉｎｉｍｉｚｅ { ｔｏｔａｌ ｏｆ 関数呼出 ｉｎ 共通コード }
この目的関数は、共通コードにおける関数の呼出し数を最小化するよう最適化する。差分コードのブロックを繋げる際、異なる差分コードブロック間の変更対象でないコード（共通コード）を含めて繋げることとなる。この共通コードからの関数呼び出しが多いと、プログラムＲＯＭ面をまたいだプログラム実行が多く行われることとなる。プログラムＲＯＭ面はそれぞれ異なる電源を持つだめ、消費電力の増大、及びプログラムＲＯＭの読出しサイクルの増大が懸念される。このため、目的関数２では、呼出し数を最小化する。
目的関数３：既存の配置済みの差分コードの再利用の最大化
この目的関数の目的は、以下の通りである。過去の更新により、更新差分コードの配置が複数回成されている場合、何回か前に配置した更新差分コードブロックが今回の更新でもそのまま再利用できる可能性があり、その場合、それを再利用する事で、配置処理が軽減可能となる。
【００９３】
目的関数の最適化は、線形計画問題として定式化して解いても良い。また、ラグランジェ緩和などの技法を用いて高速化して解いても良い。また、差分コードのサイズを重みとした頂点とし、サイズと関数呼び出しの和を重みとした辺で、差分コード間を結んだグラフとして表現し、再利用可能頂点を考慮した、グラフ被覆問題として定式して解いても良い。また、グラフ被覆問題をヒューリスティックスに解いても良い。目的関数の最適化は、何れにせよ最適化問題についての一般的な知識により解ける問題である。
【００９４】
次に、組込み機器４０における更新動作について説明する。図３６は、組込み機器４０でのプログラム更新動作を説明するための、組込み機器４０が配置されたシステムの構成例を示す。なお、図３６に示されるように、ここでは、一例として、管理サーバ３０は、ユーザインターフェース３７と接続されており、さらに無線ネットワークとの送受信を行うためのアンテナ３９を備えているものとする。また、組込み機器４０は、組込みコントローラを含むものとして説明する。ユーザインターフェース３７は、プログラム更新動作の対象となる組込みコントローラへの更新差分プログラムの有無を表示し、実際に更新を実施するか否かのユーザからの指示を受ける。管理サーバ３０は、アンテナ３９から、更新差分プログラムなどを含む更新情報ファイルを構成する情報である更新情報を受け取る。また、管理サーバ３０は、更新情報を受け取った際に、更新がある旨をユーザインターフェース３７へ通知する。ユーザインターフェース３７に表示された情報に基づき、ユーザが更新許可を指示すると、更新差分プログラムが組込み機器４０内の組込みコントローラに配置される。
【００９５】
プログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が３である場合の更新手順は、例えば以下のようになる。図３７は、プログラム更新手順の一例を示すフローチャートである。
ステップ３７００（Ｓ３７００）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ３７０１へ移行し、許可されない場合、処理はステップ３７０５へ移行する。
ステップ３７０１（Ｓ３７０１）で、管理サーバ３０は、更新プログラムの動的ロード、即ちプログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。なお、動的な配置とは、プログラムの動作を停止させることなく、当該プログラムに対する差分をＲＯＭに配置することをいう。
ステップ３７０２（Ｓ３７０２）で、管理サーバ３０は、更新プログラムの動的な配置の完了を確認する。
ステップ３７０３（Ｓ３７０３）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ３７０４へ移行し、許可されない場合、処理はステップ３７０６へ移行する。
ステップ３７０４（Ｓ３７０４）で、アドレス変換テーブルの許可設定など、更新に必要な設定が完了後、組込み機器４０がリセットされ、組込み機器４０が再起動される。そして、再起動時に更新が完了する。
ステップ３７０５（Ｓ３７０５）では、所定の待機時間が経過した後、ステップ３７００へ処理が移行する。同様に、ステップ３７０６（Ｓ３７０６）でも、所定の待機時間が経過した後、ステップ３７０３へ処理が移行する。
【００９６】
次に、組込み機器４０におけるプログラムの動的な配置動作について説明する。図３８は、組込み機器４０におけるプログラムの動的な配置動作の一例を説明する模式図である。なお、ここでは、組込み機器４０のＳＲＡＭ４０６は、起動時に固定割り付けされるプログラム更新作業領域４４２を有する。また、ＣＰＵ４０１は、汎用割込みベクタテーブル４４０と専用割込みベクタテーブル４４１を具備するものとする。また、専用割込みベクタテーブル４４１は、動的なプログラム配置で用いられる割込みベクタテーブルであり、物理的には、汎用割込みベクタテーブル４４０の一部として実装されていても良い。プログラムの動的な配置動作例は下記の通りである。
【００９７】
（１）ＣＡＮインターフェース４０９から更新情報の転送を要求する割込みを割込みコントローラ４０３が受け、割込みコントローラ４０３がＣＰＵ４０１に割込みをかける。
（２）ＣＰＵ４０１は専用割込みベクタ４４１を参照し、対応する割込みハンドラが実行される。これにより、ＣＰＵ４０１またはＤＭＡコントローラ４０５の制御の下、ＣＡＮインターフェース４０９からＳＲＡＭ４０６に更新情報がデータ転送される。ここで、更新情報に含まれるインジェクションコードはプログラム更新作業領域４４２に配置される。また、受信した各データには予め署名が付加されており、プログラム更新作業領域４４２の予め定められたアドレスを先頭アドレスとして格納されるものとする。
（３）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受けてＣＰＵ４０１が割込みを受け付けるまで、上記（１）と（２）が繰り返される。
（４）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受け、ＣＰＵ４０１が割込みを受ける。
（５）ＣＰＵ４０１は専用割込みベクタ４４１を参照し、対応する割込みハンドラが実行される。これにより、プログラム更新作業領域４４２に配置されたインジェクションコードが実行される。インジェクションコードは、その種類に応じて、ＣＰＵ４０１がアクセスしていないプログラムＲＯＭ４０７／データＲＯＭ４０８に対する更新データテーブル（すなわち更新差分コードに含まれる初期値付き局所変数と大域変数）の配置、ＣＰＵ４０１がアクセスしていないプログラムＲＯＭ４０７に対する更新差分バイナリの配置、並びに現在実行中にないデータＲＯＭ４０８に対するアドレス変換テーブルの配置を実施する。
（６）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受けてＣＰＵ４０１が割込みを受け付けるまで、上記（１）〜（５）が繰り返される。
（７）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受け、ＣＰＵ４０１が割込みを受け付ける。
（８）ＣＰＵ４０１は専用割込みベクタ４４１を参照し、対応する割込みハンドラが実行される。これにより、プログラムＲＯＭ４０７／データＲＯＭ４０８に配置したデータテーブルや差分コードの署名検証、アドレス変換器４０２やデータＲＯＭ４０８に配置したアドレス変換テーブルの署名検証が実施される。ここで、組込み機器４０は、署名検証をパスした場合、差分コードの署名（ハッシュ値）をデータＲＯＭ４０８に格納するとともに、ＣＡＮインターフェース４０９から完了通知を外部へ出力する。また、組込み機器４０は、再起動後に差分コード配置面の切り替えを実施する旨、フラグ設定を実施する。組込み機器４０は、署名検証で不一致となった場合は、プログラムＲＯＭ４０７／データＲＯＭ４０８に配置したデータテーブルや差分コードの消去、アドレス変換器やデータＲＯＭに配置したアドレス変換テーブルの消去を実施するとともに、ＣＡＮインターフェース４０９から署名検証不一致の通知を外部へ出力する。
【００９８】
図３９は、組込み機器４０におけるプログラムの動的な配置動作の別の一例を説明する模式図である。図３９に示した例は、上述したサブＣＰＵ４１１を有する組込み機器４０における動的な配置動作の一例である。なお、ここでも、上記と同様、ＳＲＡＭ４０６は、起動時に固定割り付けされたプログラム更新作業領域４４２を有する。また、サブＣＰＵ４１１は汎用割込みベクタテーブル４４３と専用割込みベクタテーブル４４４を具備するものとする。また、プログラムＲＯＭ４１２は、図３２Ａ、３２ＢのＢＩＯＳコードを格納するプログラムＲＯＭ領域であり、物理的には、プログラムＲＯＭ４０７の何れかまたは全ての一部として実装されていても良い。このような構成における組込み機器４０における、プログラムの動的な配置動作例は下記の通りである。
【００９９】
（１）ＣＡＮインターフェース４０９から更新情報の転送を要求する割込みを割込みコントローラ４０３が受け、割込みコントローラ４０３がサブＣＰＵ４１１に割込みをかける。ここで、割込みコントローラ４０３からの割込みを一旦メインＣＰＵ４０１が受付、メインＣＰＵ４０１からサブＣＰＵ４１１に割込みを掛けるとしても良い。
（２）サブＣＰＵ４１１は専用割込みベクタ４４１を参照し、対応する割込みハンドラが実行される。これにより、サブＣＰＵ４１１またはＤＭＡコントローラ４０５の制御の下、ＣＡＮインターフェース４０９からＳＲＡＭ４０６に更新情報がデータ転送される。ここで、更新情報に含まれるインジェクションコードはプログラム更新作業領域４４２に配置される。また、各データには予め署名が付加されており、プログラム更新作業領域４４２の予め定められたアドレスを先頭アドレスとして格納されるものとする。
（３）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受けてサブＣＰＵ４１１が割込みを受け付けるまで、上記（１）と上記（２）が繰り返される。
（４）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受け、サブＣＰＵ４１１が割込みを受ける。
（５）サブＣＰＵ４１１は専用割込みベクタ４４４を参照し、対応する割込みハンドラが実行される。これにより、プログラム更新作業領域４４２に配置されたインジェクションコードが実行される。インジェクションコードはその種類に応じて、サブＣＰＵ４１１がアクセスしていないプログラムＲＯＭ４０７／データＲＯＭ４０８面への更新データテーブルの配置、サブＣＰＵ４１１がアクセスしていないプログラムＲＯＭ４０７への更新差分バイナリ配置、並びに現在実行中にないデータＲＯＭ４０８に対するアドレス変換テーブルの配置を実施する。
（６）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受けサブＣＰＵ４１１が割込みを受け付けるまで、上記（１）〜（５）が繰り返される。
（７）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受け、サブＣＰＵ４１１が割込みを受け付ける。
（８）サブＣＰＵ４１１は専用割込みベクタ４４４を参照し、対応する割込みハンドラが実行される。これにより、プログラムＲＯＭ４０７／データＲＯＭ４０８に配置したデータテーブルや差分コードの署名検証、アドレス変換器４０２やデータＲＯＭ４０８に配置したアドレス変換テーブルの署名検証が実施される。なお、署名検証をパスした場合、署名検証で不一致となった場合の動作は、図３８に対する上述の（８）の説明と同様である。
【０１００】
次に、組込み機器４０における起動動作について説明する。図４０は、組込み機器４０の起動動作の一例を示すフローチャートである。本起動フローは、更新情報の設定完了後の再起動時の動作フロー例である。なお、本起動フローは、例えば、組込み機器４０のＣＰＵ４０１がＢＩＯＳを含むファームウェアを実行することにより実現される。
【０１０１】
ステップ４０００（Ｓ４０００）で、電源がオフからオンとなり、組込み機器４０が特権モードにて処理を開始する
ステップ４００１（Ｓ４００１）で、ＳＲＡＭ４０６上にプログラム更新作業領域４４２が割り当てられる。ここで、作業領域の先頭アドレスをｗｏｒｋ＿ａｄｄｒとする。
ステップ４００２（Ｓ４００２）で、ｗｏｒｋ＿ａｄｄｒが専用割込みベクタ４４１または専用割込みベクタ４４４に設定される。
ステップ４００３（Ｓ４００３）で、組込み機器４０は、特権レベルを変更し、通常モードへ移行する。
ステップ４００４（Ｓ４００４）で、組込み機器４０が、ＣＰＵ４０１及び周辺モジュールの初期化処理を実行する。
ステップ４００５（Ｓ４００５）で、組込み機器４０は、差分コード配置面切り替えフラグが設定されているか否かを判断する。設定されている場合は処理がステップ４００６へ移行し、設定されていない場合は処理がステップ４００７へ移行する。
ステップ４００６（Ｓ４００６）で、「更新差分コード配置後初期化処理」を実施する。なお、「更新差分コード配置後初期化処理」の具体例については、後述する。
ステップ４００７（Ｓ４００７）で、組込み機器４０は、メインプログラムを実行する。
ステップ４００８（Ｓ４００８）で、メインシステムが起動する。
【０１０２】
図４１は、図４０のステップ４００６の「更新差分コード配置後初期化処理」の一例を示すフローチャートである。「更新差分コード配置後初期化処理」では、例えば以下の動作が行われる。
【０１０３】
ステップ４１００（Ｓ４１００）で、組込み機器４０は、プログラムコンテキストをＣ＿ｔｍｐへ退避する。なお、プログラムコンテキストとは、プログラムの状態を言い、具体的には、ＣＰＵレジスタ及びメモリの状態を指す。また、Ｃ＿ｔｍｐは、メモリ上の退避領域である。署名検証などは、元々のプログラムには含まれない処理であり、本来あるべきプログラムコンテキストを崩す処理である。このため、署名検証などの処理を実施する前のプログラムコンテキストをこのように一旦格納し、処理終了後に戻すことで、本来あるべきプログラム実行状態を実現する。
ステップ４１０１（Ｓ４１０１）で、組込み機器４０は、データテーブルや差分コードをプログラムＲＯＭ４０７／データＲＯＭ４０８から読出し、ハッシュ値を算出する。
ステップ４１０２（Ｓ４１０２）で、組込み機器４０は、データテーブルや差分コードの配置時に署名検証で用いたハッシュ値とステップ４１０１で算出したハッシュ値を比較する。これらが一致した場合、処理はステップ４１０３へ移行し、不一致の場合、処理はステップ４１０８へ移行する。
ステップ４１０３（Ｓ４１０３）で、組込み機器４０は、データＲＯＭ４０８に配置したアドレス変換テーブルのハッシュ値を算出する。
ステップ４１０４（Ｓ４１０４）で、組込み機器４０は、アドレス変換テーブルの配置時に署名検証で用いたハッシュ値とステップ４１０３で算出したハッシュ値を比較する。これらが一致した場合、処理はステップ４１０５へ移行し、不一致の場合、処理はステップ４１０８へ移行する。
ステップ４１０５（Ｓ４１０５）で、組込み機器４０は、差分コード配置面の切り替えを実施する。
ステップ４１０６（Ｓ４１０６）で、組込み機器４０は、アドレス変換テーブルをデータＲＯＭ４０８からロードし、アドレス変換器４０２に設定する。
ステップ４１０７（Ｓ４１０７）で、組込み機器４０は、アドレス変換を有効化する。
ステップ４１０８（Ｓ４１０８）で、組込み機器４０は、Ｃ＿ｔｍｐへ退避（格納）したプログラムコンテキストを、新たなプログラムコンテキストとして設定する。すなわち、組込み機器４０は、Ｃ＿ｔｍｐへ退避したプログラムコンテキストを復帰させる。
このように、更新情報は、組込み機器４０のＲＯＭに格納される際に署名検証が行われるととともに、組込み機器４０に適用される際にも署名検証（ステップ４１０１〜ステップ４１０４）が行われる。このため、更新情報の受信の際の改竄の検知、及び受信後の改竄の検知が可能となる。つまり、ＣＰＵ４０１は更新情報が正当であることが確認された場合に差分プログラムを実行するため、改竄等の危険があるプログラム等に基づく実行を避けることができ、セキュリティが向上する。
【０１０４】
次に、ＢＩＯＳの呼び出しを行うコードのＳＲＡＭ４０６への配置及びＢＩＯＳの実行の手順について説明する。図４２は、ＢＩＯＳの呼び出しを行うコードのＳＲＡＭ４０６への配置及びＢＩＯＳの実行の手順の一例を示すフローチャートである。ここでは、ＣＡＮ経由で配置される手順を例として示す。
ステップ４２００（Ｓ４２００）で、ＣＡＮインターフェース４０９から更新情報の転送を要求する割込みをＣＰＵ４０１が受付ける。
ステップ４２０１（Ｓ４２０１）で、割り込みが、インジェクションコードの実行を指示する割込みか否かが判定され、そうである場合、処理はステップ４２０４へ移行し、そうでない場合、処理はステップ４２０２へ移行する。
ステップ４２０２（Ｓ４２０２）で、ＣＰＵ４０１は、受信したデータを、上述のｗｏｒｋ＿ａｄｄｒを先頭アドレスとするプログラム作業領域へ転送する。
ステップ４２０３（Ｓ４２０３）で、割込み処理が終了し、処理はステップ４２００へ移行する。
ステップ４２０４（Ｓ４２０４）で、ＣＰＵ４０１は割込みハンドラによりプログラム更新作業領域に配置されたインジェクションコードを実行する。ＣＰＵ４０１は、インジェクションコードからＢＩＯＳを読出し、ＢＩＯＳに引数を渡し、ＢＩＯＳを実行する。
ステップ４２０５（Ｓ４２０５）で、ＣＰＵ４０１は、ＢＩＯＳ関数実行後、ＢＩＯＳ関数内で割込み終了処理を実施する。
【０１０５】
次に、更新情報ファイル５０の転送について説明する。図４３は、更新情報ファイル５０に含まれる更新差分バイナリを管理サーバ３０から組込み機器４０に転送する手順の一例を示すフローチャートである。なお、本フローは、管理サーバ３０のデータ処理部３３にて実行される。具体的には、例えば、データ処理部３３のメモリに格納されたプログラムをデータ処理部３３の処理装置が実行することにより実現される。
【０１０６】
上述の通り、更新情報ファイル５０は開発環境２０で生成され、管理サーバ３０に転送された後、管理サーバ３０から組込み機器４０に転送される。更新情報ファイル５０には、上述の通り、更新差分バイナリの他にもアドレス変換テーブル５２等の種々の情報を含むが、これら情報の管理サーバ３０から組込み機器４０への転送の一例として、更新差分バイナリの転送例を図４３に示す。更新情報ファイル５０に含まれる更新差分バイナリ以外の他の情報の転送も同様である。なお、説明に当たり、次のようにＳ、Ｍ、Ｎ１を定義する。なお、下記の定義において、Ｎ２は、自然数であり、フラッシュメモリの書込み単位に合わせて設定される。また、「ｃｅｉｌ（）」は、括弧内の数値の切り上げ整数値を返す関数である。また、ここでは、ＣＡＮのデータペイロードサイズは、８であるものとする。
Ｓ＝２５６×Ｎ２バイト
Ｍ＝ｃｅｉｌ（更新差分バイナリのバイトサイズ／Ｓ）
Ｎ１＝２５６／８、ここで、８はＣＡＮのデータペイロードサイズ
尚、これら定数値はシステム要件に応じて適宜変更可能である。
【０１０７】
なお、本例では、管理サーバ３０から組込み機器４０に８バイト単位でデータ転送が行われ、Ｓバイト単位でフラッシュメモリに書き込む処理を示している。以下、具体的に説明する。
ステップ４３００（Ｓ４３００）で、データ処理部３３は、ステップ４３０１〜ステップ４３０７までの処理をＭ回繰り返す。また、データ処理部３３は、繰り返し中、変数ｉ（初期値は１）をインクリメントする。
ステップ４３０１（Ｓ４３０１）で、データ処理部３３は、更新差分バイナリをＳバイト毎に区切ったときのｉ番目のデータを変数Ｃに代入する。
ステップ４３０２（Ｓ４３０２）で、データ処理部３３は、ステップ４３０３〜ステップ４３０６までの処理をＮ２回繰り返す。また、データ処理部３３は、繰り返し中、変数ｊ（初期値は１）をインクリメントする。
ステップ４３０３（Ｓ４３０３）で、データ処理部３３は、Ｃに代入されたデータを２５６バイト単位に区切ったときのｊ番目のデータを変数Ｄに代入する。
ステップ４３０４（Ｓ４３０４）で、データ処理部３３は、ステップ４３０５及びステップ４３０６の処理をＮ１回繰り返す。また、データ処理部３３は、繰返し中、変数ｋ（初期値は１）をインクリメントする。
ステップ４３０５（Ｓ４３０５）で、データ処理部３３は、組込み機器４０内のＣＡＮインターフェース４０９にて受信される更新バイナリ断片をＳＲＡＭ４０６へ転送する要求を、組込み機器４０に対してＣＡＮバスを介して発行する。
ステップ４３０６（Ｓ４３０６）で、データ処理部３３は、Ｄに代入されたデータを８バイト毎に区切ったときのｋ番目のデータを組込み機器４０に転送するため、これをＣＡＮバスへ送信する。
ステップ４３０７（Ｓ４３０７）で、データ処理部３３は、更新バイナリのプログラムＲＯＭ４０７への書込み処理委譲のインジェクションコード７０１の実行指示をＣＡＮバスへ送信するとともに、このインジェクションコードをＣＡＮバスへ送信する。
【０１０８】
以上、実施の形態１について説明した。実施の形態１によれば、組込み機器４０は、アドレス変換器４０２により変換されたアドレスに従って更新プログラムを実行する。このため、組込み機器４０が動的なアドレス解決機能を有さない場合であっても、差分コードを用いたプログラム更新が可能となる。また、モジュール単位の更新ではなく、差分コードのみによる更新であるため、更新に際して組込み機器のメモリに格納されるデータ量を抑制できる。このため、メモリの削減に寄与する。また、モジュール単位以下の更新が可能であるため、フラッシュメモリの書込み及び消去をより細かい単位で実施可能となる。このため、モジュール単位での更新手法に比べ、フラッシュメモリの長寿命化が達成できる。また、更新情報ファイル５０にはプログラム復元ポイントを構成する情報が含まれているため、更新での異常検知時や外部からの指示に基づく、更新前プログラムへのロールバックが可能となる。またさらに、更新プログラムの正当性の検査、すなわち署名検証の際、例えば、組込み機器と他の装置とが通信することにより正当性を確認する方法も考えられるが、本実施の形態では、そのような方法ではなく、組込み機器４０でダイジェスト値（ハッシュ値）の算出及び確認を実施するため、検証の際の通信遅延等の影響を回避できる。したがって、組込み機器と他の装置とが通信することにより正当性を確認する場合に比べて、電源オンからの実際の起動までにかかる時間を抑制することができる。また、更新差分プログラムのダイジェスト値（ハッシュ値）を用いたチェックで異常が検出された場合、予めスタックに退避したプログラムコンテキストを復帰させることで、電源のオフ及びオンを行う事なく更新前のプログラムの実行に戻す事が可能である。このため、異常検知時の復旧時間の短縮化が可能となる。また、本実施の形態では、ＲＯＭが３面あるため、更新後のプログラムが実行中であっても、１面は余ることとなる。このため、更に更新が行われる場合、上述のように、この余った１面を利用することで、プログラムの実行を阻害しない。なお、ＲＯＭの面数が３である場合に限らず、４以上であっても、同様に、余った面の利用が可能であることは言うまでもない。
【０１０９】
＜実施の形態２＞
次に、実施の形態２について説明する。実施の形態２は、組込み機器４０が変更されている点で、具体的には、本実施の形態に組込み機器４０は、プログラムＲＯＭ４０７の構成及びデータＲＯＭ４０８の構成が変更された点で、実施の形態１にかかる組込み機器４０と異なる。なお、以下の説明において、実施の形態１と同様である点については、理解の容易化のため、適宜割愛される。図４４は、実施の形態２にかかる組込み機器４０の構成例を示すブロック図である。
【０１１０】
本実施の形態にかかるプログラムＲＯＭ４０７は、夫々独立に読み書き及び消去が可能な２面構成のＲＯＭである。すなわち、実施の形態１にかかるプログラムＲＯＭ４０７が３面構成であったのに対し、本実施の形態にかかるプログラムＲＯＭ４０７は２面構成となっている。また、本実施の形態にかかるデータＲＯＭ４０８は、夫々独立に読み書き及び消去が可能な２面構成のＲＯＭである。すなわち、実施の形態１にかかるデータＲＯＭ４０８が３面構成であったのに対し、本実施の形態にかかるデータＲＯＭ４０８は２面構成となっている。以下、本実施の形態の説明において、特に記載がない場合には、プログラムＲＯＭ４０７は、実施の形態２にかかる２面構成のＲＯＭであるものとする。また、同様に、データＲＯＭ４０８は、実施の形態２にかかる２面構成のＲＯＭであるものとする。ＲＯＭが３面以上である場合、上述通り、余った１面を利用することで、プログラムの実行を阻害しない。しかしながら、２面の場合、更新後のプログラムが実行されている場合には、ＲＯＭに余った面がないため、実施の形態１に示した方法をそのまま適用することができない。実施の形態２では、ＲＯＭが２面である場合においても更新を実現する方法を示す。
【０１１１】
図４５は、実施の形態２にかかる組込み機器４０のまた別の構成例を示す。図に示されるように、実施の形態１と同様、本実施の形態にかかる組込み機器４０は、サブＣＰＵ４１１を有する構成であってもよい。
【０１１２】
図４６は、実施の形態２にかかるアドレス変換器４０２の概要を示す模式図である。実施の形態１では、プログラムＲＯＭ４０７の３つの面のうち、１つの面にデフォルトプログラムが配置され、残りの２面に更新差分プログラムが配置されるため、アドレス変換器４０２は、２つのアドレス変換テーブル４２０Ａ、４２０Ｂのういち、いずれかのアドレス変換テーブルを用いた。これに対し、本実施の形態では面数が２であるため、図４６に示すように、実施の形態２にかかるアドレス変換器４０２は、１つのアドレス変換テーブル４２０Ａを用いてアドレス変換を行う。尚、アドレス変換テーブルのプログラム実行中の設定を可能とする目的で、アドレス変換器を２つ備えても良い。
【０１１３】
実施の形態２にかかるアドレス変換器４０２の接続関係は、実施の形態１と同様、図８に示されるように表される。組込み機器４０は、アドレス変換器４０２として、具体的には、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａと、データＲＯＭ４０８用のアドレス変換器４０２Ｂとを有する。ただし、本実施の形態では、プログラムＲＯＭが２面であることに対応して、組込み機器４０は、プログラムＲＯＭ４０７用のアドレス変換器４０２Ａを１個搭載している。また、同様に、組込み機器４０は、データＲＯＭ４０８用のアドレス変換器４０２Ｂを１個搭載している。
【０１１４】
更新情報ファイルについては、実施の形態１と同様であってもよいが、次のように構成されてもよい。図４７は、新たな差分コードの構築時に、以前配置した差分コードを再利用する方法について説明する模式図である。プログラムＲＯＭ４０７の面数が２である場合、面数が３である場合に比べて、更新差分コードを配置可能な領域が少ない。このため、差分コード自体の再利用を行う事で、プログラムＲＯＭ４０７に配置されるデータ量を削減することが可能となる。すなわち、プログラムＲＯＭ４０７に要求されるメモリ容量を抑制することができる。なお、この再利用は、ＲＯＭが２面である場合に限らず、３面以上である場合にも容易に適用可能である。以下、図に沿って、説明する。
【０１１５】
図４７に示した例では、複数の差分コードの配置例に加え、各差分コードに対応したアドレス変換テーブルの配置例も示している。１回目の更新で、メモリ空間Ｂに差分コードａ、ｂ、ｃ、ｄを配置し、データＲＯＭ４０８にアドレス変換テーブル４２０Ａ_１を配置する。２回目の更新で、メモリ空間Ｂに差分コードｅ、ｆ、ｇ、ｈを配置し、データＲＯＭ４０８にアドレス変換テーブル４２０Ａ_２を配置する。ここで、ｋ回目の更新で、メモリ空間Ｂに差分コードｄ、ｅ、ｉ、ｊを、データＲＯＭ４０８にアドレス変換テーブル４２０Ａ_ｋを配置する場合を考える。
【０１１６】
差分コードｄ、ｅは既にアドレス空間Ｂに配置されているため、アドレス変換テーブル４２０Ａ_ｋで既に配置されている差分コードｄ、ｅの先頭アドレスを変換後のアドレスとする事で、新たにアドレス空間Ｂに差分コードｄ、ｅを配置する必要がない。すなわち、このようにして、既に配置されている差分コードを再利用している。なお、アドレス変換テーブル４２０Ａ_ｋの差分コードｄ、ｅに対応するエントリに関しては、既に配置されているエントリを再利用してもよいし、新たにデータＲＯＭ４０８に配置しても良い。なお、図４７では、再利用せずに、データＲＯＭ４０８に新たにアドレス変換テーブル４２０Ａ_ｋの全エントリを配置する構成例を示している。
【０１１７】
これにより、組込み機器４０では、既にプログラムＲＯＭ４０７又はデータＲＯＭ４０８に配置された更新情報と重複する部分を除く更新情報が、ＣＡＮインターフェース４０９により受信され、プログラムＲＯＭ４０７又はデータＲＯＭ４０８には、既に配置されているこの重複する部分に加え、重複する部分が除かれた更新情報が新たに配置される。これにより、プログラムＲＯＭ４０７又はデータＲＯＭ４０８に要求されるメモリ容量を抑制することができる。
【０１１８】
次に、本実施の形態における、ＢＩＯＳコードの配置例について説明する。図４８Ａ、図４８Ｂは、ＢＩＯＳコードの２面のプログラムＲＯＭ４０７への配置例を示す模式図であり、図４８ＡはＢＩＯＳコードの更新を伴わないプログラムの更新の場合に対応した例を示し、図４８ＢはＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合に対応した例を示している。
【０１１９】
まず、図４８Ａを参照してＢＩＯＳコードの更新を伴わないプログラムの更新の場合について説明する。図４８Ａでは、２面ともに同じＢＩＯＳコードが配置されており、Ａ面にデフォルトプログラムが配置され、Ｂ面に前回の更新に対応する差分プログラムと現在書込み中の更新差分プログラムが配置されている。ここで、Ｂ面への更新差分プログラムの配置では、Ａ面及びＢ面での、デフォルトプログラム及び前回差分プログラムから成る前回更新プログラムの実行状態から、再起動によるＡ面でのデフォルトプログラムの実行状態へと変更する。その上で、Ｂ面への更新差分プログラムの配置では、Ｂ面に配置されたＢＩＯＳコードが用いられ、ＳＲＡＭ４０６に展開されたプログラムＲＯＭ書込みドライバ、またはプログラムＲＯＭ書込み専用ハードウェアが書込み実行する事で、Ａ面へのＣＰＵ４０１からのアクセスを阻害する事なく、Ｂ面への更新差分プログラムの配置が可能となる。即ち、Ａ面でのプログラム実行中の、Ｂ面への更新差分プログラムの配置が可能となる。尚、Ｂ面に配置する更新差分プログラムは、Ａ面に配置されたデフォルトプログラムに対する更新差分プログラムとなる。ここで、Ｂ面に配置する更新差分プログラムは、既にＢ面に配置されている更新差分プログラムを再利用して構成しても良い。
【０１２０】
次に、図４８Ｂを参照してＢＩＯＳコードの更新を含むデフォルトプログラム全体の更新の場合について説明する。図４８Ｂは、Ａ面を消去し、Ｂ面に新デフォルトプログラムと新ＢＩＯＳコードを配置後、Ｂ面に配置された新ＢＩＯＳコードをＡ面にコピーして配置した状態を示している。これについて、次のような処理が行われる。まず、Ｂ面の消去を、プログラムＲＯＭ４０７の消去処理委譲のインジェクションコードからプログラムＲＯＭ４０７の消去処理ＢＩＯＳを呼び出して実行する事で実施する。次に、Ｂ面への新デフォルトプログラム及び新ＢＩＯＳコードの配置を、プログラムＲＯＭ書込み処理委譲のインジェクションコードからプログラムＲＯＭ書込み処理を呼び出して実行する事で実施する。そして、デフォルト面切り替え処理委譲のインジェクションコード７１２、７１３からデフォルト面切り替え処理ＢＩＯＳを呼び出して実行する事で、再起動時の開始アドレスをＢ面の先頭とする。プログラムＲＯＭ４０７のＡ面の再起動中の消去を実行するためのプログラムＲＯＭ消去委譲のインジェクションコードと、Ａ面への新ＢＩＯＳコードの再起動中のコピーを実行するためのプログラムＲＯＭ書込み処理委譲のインジェクションコードを、再起動前にＳＲＡＭ４０６からデータＲＯＭ４０８に配置し、再起動中にデータＲＯＭ４０８から上記２つのインジェクションコードをＳＲＡＭ４０６へ展開し、実行する。再起動後には、図４８Ｂに示すプログラム配置構造が実現され、プログラム開始アドレスがＢ面の先頭に設定され、Ｂ面の新デフォルトプログラムの実行がなされる。なお、新ＢＩＯＳは、データＲＯＭ４０８に一旦配置した後、適当なタイミングでプログラムＲＯＭ４０７に展開されてもよい。
【０１２１】
プログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が２である場合の更新手順は、例えば以下のようになる。図４９は、プログラム更新手順の一例を示すフローチャートである。
ステップ４９００（Ｓ４９００）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ４９０１へ移行し、許可されない場合、処理はステップ４９０６へ移行する。
ステップ４９０１（Ｓ４９０１）で、アドレス変換テーブルの不許可設定など、デフォルトプログラムの実行状態とするために必要な設定が完了した後、組込み機器４０がリセットされ、組込み機器４０が再起動される。そして、再起動後に組込み機器４０は、デフォルトプログラムの実行状態へと遷移する。
ステップ４９０２（Ｓ４９０２）で、管理サーバ３０は、更新プログラムの動的ロード、即ちプログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。
ステップ４９０３（Ｓ４９０３）で、管理サーバ３０は、更新プログラムの動的な配置の完了を確認する。
ステップ４９０４（Ｓ４９０４）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ４９０５へ移行し、許可されない場合、処理はステップ４９０７へ移行する。
ステップ４９０５（Ｓ４９０５）で、アドレス変換テーブルの許可設定など、更新に必要な設定が完了後、組込み機器４０がリセットされ、組込み機器４０が再起動される。そして、再起動時に更新が完了する。
ステップ４９０６（Ｓ４９０６）では、所定の待機時間が経過した後、ステップ４９００へ処理が移行する。同様に、ステップ４９０７（Ｓ４９０７）で、所定の待機時間が経過した後、ステップ４９０４へ処理が移行する。
【０１２２】
次に、本実施の形態にかかる組込み機器４０における起動動作について説明する。図５０は、実施の形態２にかかる組込み機器４０の起動動作の一例を示すフローチャートである。以下、図４０に示した組込み機器４０における起動動作と異なる点について説明する。図５０に示した組込み機器４０における起動動作では、図４０に示した組込み機器４０における起動動作のステップ４００５がステップ５００５に置き換わった点を除いて、同じである。ここで、ステップ５００５では、組込み機器４０は、差分コード配置面有効フラグが設定されているか否かを判断する。設定されている場合は処理がステップ５００６へ移行し、設定されていない場合は処理がステップ５００７へ移行する。
【０１２３】
次に、図５０のステップ５００６の「更新差分コード配置後初期化処理」について説明する。図５１は、図５０のステップ５００６の「更新差分コード配置後初期化処理」の一例を示すフローチャートである。「更新差分コード配置後初期化処理」では、例えば以下の動作が行われる。以下、図４１に示した処理と異なる点について説明し、図４１に示した処理と同様の点については適宜説明を割愛する。
【０１２４】
ステップ５１００（Ｓ５１００）からステップ５１０４（Ｓ５１０４）は、図４１に示したステップ４１００からステップ４１０４と同様である。ただし、ステップ５１０２において、ハッシュ値が一致した場合、処理はステップ５１０３へ移行し、不一致の場合、処理はステップ５１０７へ移行する。また、ステップ５１０４において、ハッシュ値が一致した場合、処理はステップ５１０５へ移行し、不一致の場合、処理はステップ５１０７へ移行する。
ステップ５１０５（Ｓ５１０５）で、組込み機器４０は、アドレス変換テーブルをデータＲＯＭ４０８からロードし、アドレス変換器４０２に設定する。
ステップ５１０６（Ｓ５１０６）で、組込み機器４０は、アドレス変換を有効化する。
ステップ５１０７（Ｓ５１０７）で、組込み機器４０は、Ｃ＿ｔｍｐへ退避（格納）したプログラムコンテキストを、新たなプログラムコンテキストとして設定する。すなわち、組込み機器４０は、Ｃ＿ｔｍｐへ退避したプログラムコンテキストを復帰させる。
【０１２５】
以上、実施の形態２について説明した。実施の形態２によれば、ＲＯＭが２面である場合であっても、実施の形態１と同様の効果を奏することができる。なお、データＲＯＭ４０８には大域変数が格納されるため、大域変数を利用しない場合にはデータＲＯＭ４０８の面数を１とすることも可能である。
【０１２６】
＜実施の形態３＞
次に、実施の形態３について説明する。本実施の形態では、組込み機器での、更新差分プログラムのセキュアな動的配置、及びセキュアな更新動作を実現するために成された改善例を示す。具体的には、本実施の形態では、プログラム又はデータの破壊に対する対応策と、ＲＯＭに対する悪意ある書込み消去に対する対応策を実現している。なお、本実施の形態は、実施の形態１にも２にも組み合わせ可能である。また、プログラム又はデータの破壊に対する対応策と、ＲＯＭに対する悪意ある書込み消去に対する対応策のうち、一方のみが適用されてもよい。
【０１２７】
まず、プログラム又はデータの破壊に対する対応策について説明する。実施の形態１及び２で示した例では、更新情報ファイルを構成するインジェクションコードのうち、プログラムＲＯＭ４０７又はデータＲＯＭ４０８の消去処理を含むものとして、指定復元ポイントへのロールバック処理委譲のインジェクションコード７０９、局所変数の初期値の更新のためのプログラムＲＯＭ消去／書込み処理委譲のインジェクションコード７０５、大域変数の初期値の更新のためのデータＲＯＭ消去/書込み処理委譲のインジェクションコード７０６がある。また、データＲＯＭ４０８へのアドレス変換テーブルの書込み処理委譲のインジェクションコード７０２は、セキュリティを考慮しない場合には、アドレス変換テーブルを、データＲＯＭ４０８があふれるまで格納し続けることとなるが、セキュリティを考慮する場合、過去のアドレス変換テーブルを一定数しか保持しないよう消去処理することが好ましい。これらのインジェクションコードによる消去処理の際、消去ブロック番号を何らかの方法で改竄されてしまいさらに改竄検知もすり抜けた場合、格納されたプログラムやデータが破壊される事となり問題となる。そこで、以下では、インジェクションコードにおいて、消去ブロック番号についてＢＩＯＳルーチンに引数渡しせずに消去を実現する方法を示す。また便宜上、以下では、実施の形態１及び２と同様にインジェクションコードを用いて実施の形態の説明を行うが、インジェクションコードの代わりに、呼び出し関数名と当該関数の引数列からなるデータ列を用い、組込み機器内部でこのデータ列からインジェクションコード相当の関数を構成する形式として実現されていると解釈されるのが妥当であろう。このような実現方式を取る事で、インジェクションコード相当の関数を構成時に、データ列の署名検証などといったインジェクションコードの正当性検証がより堅牢に実現可能となるためである。
【０１２８】
図５２は、本実施の形態にかかるインジェクションコードの構成例を示す模式図である。本実施の形態では、インジェクションコード７０２が、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７２０に置き換えられ、インジェクションコード７０５が、局所変数の初期値の更新のためのプログラムＲＯＭ４０７の消去/書込み処理委譲のインジェクションコード７２１に置き換えられ、インジェクションコード７０６が、大域変数の初期値の更新のためのデータＲＯＭ４０８の消去/書込み処理委譲のインジェクションコード７２２に置き換えられ、インジェクションコード７０９が、指定復元ポイントへのロールバック処理のインジェクションコード７２３に置き換えられている。その他のインジェクションコードについては、実施の形態１及び２と同様である。
【０１２９】
以下、実施の形態１及び２とは異なるインジェクションコードについて説明する。
図５３は、実施の形態３にかかる、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲を行うインジェクションコード７２０での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
ステップ５３００（Ｓ５３００）で、第一引数ａｒｇ１に読出しデータの先頭アドレスを配置し、ステップ５３０１（Ｓ５３０１）で、第二引数ａｒｇ２にデータ長を配置し、ステップ５３０２（Ｓ５３０２）で、第三引数ａｒｇ３にデータ書込み先の先頭アドレスを配置し、ステップ５３０３（Ｓ５３０３）でＲＯＭ消去ＢＩＯＳルーチンのコールを実施し、ステップ５３０４（Ｓ５３０４）で、対応するＢＩＯＳルーチンのコールを実施する。
【０１３０】
なお、ステップ５３０３で呼び出されるＲＯＭ消去ＢＩＯＳルーチンの詳細は、図５８を参照して後述する。ここで、ステップ５３０４で呼び出されるＢＩＯＳルーチンは、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理を実施する。実行例は、例えば以下のようになる。アドレス変換テーブルがＣＡＮインターフェース４０９からの割込みにてＤＭＡ転送でＳＲＡＭ４０６に配置された状態で、更にＣＡＮインターフェース４０９からの割込みで、アドレス変換テーブルのデータＲＯＭ４０８への書込み処理委譲のインジェクションコード７２０がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。ステップ５３０３で呼び出されるＢＩＯＳルーチンは、書き換えが行われる領域のブロックを消去する処理を実施する。これにより、過去のアドレス変換テーブルが消去される。また、ステップ５３０４で呼び出されるＢＩＯＳルーチンは、ＳＲＡＭ４０６に配置されたアドレス変換テーブルのデータＲＯＭ４０８への書込み処理を実施する。
【０１３１】
図５４は、セキュリティ対応を考慮した、指定復元ポイントへのロールバック処理委譲を行うインジェクションコード７２３での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
ステップ５４００（Ｓ５４００）で、第一引数ａｒｇ１に復元ポイントに対応するアドレス変換テーブルの先頭アドレスを配置する。ステップ５４０１（Ｓ５４０１）で、第二引数ａｒｇ２に復元ポイントに対応するアドレス変換テーブルのエントリ数を配置する。ステップ５４０２（Ｓ５４０２）で、復元ポイントに対応するアドレス変換テーブルの設定を実施するＢＩＯＳルーチンＡのコールを実施する。そして、以下のステップ５４０３〜ステップ５４０７を必要回数だけ実施する。ステップ５４０３（Ｓ５４０３）で、第一引数ａｒｇ１にロールバック対象の差分プログラム内の指定復元ポイントでの初期値付き局所変数や大域変数が配置されているデータＲＯＭ４０８上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ５４０４（Ｓ５４０４）で、第二引数ａｒｇ２に読み出しデータのデータ長を配置する。ステップ５４０５（Ｓ５４０５）で、第三引数ａｒｇ３にデータ書込み先の先頭アドレスを配置する。ステップ５４０６（Ｓ５４０６）でＲＯＭ消去ＢＩＯＳルーチンのコールを実施する。ステップ５４０７（Ｓ５４０７）で、指定復元ポイントでの初期値付き局所変数や大域変数の配置状態への復帰実現のためのプログラムＲＯＭ４０７及びデータＲＯＭ４０８の書込みを行うＢＩＯＳルーチンＢのコールを実施する。
【０１３２】
なお、ステップ５４０６で呼び出されるＲＯＭ消去ＢＩＯＳルーチンの詳細は、図５８を参照して後述する。ステップ５４０２とステップ５４０７とで呼び出される２つのＢＩＯＳルーチンは、指定復元ポイントへのロールバック処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで指定復元ポイントへのロールバック処理委譲のインジェクションコード７２３がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、２つのＢＩＯＳルーチンコールが成され、夫々のＢＩＯＳルーチンでは、指定復元ポイントへのロールバック処理を実施する。ここで、指定復元ポイントへのロールバック処理では、先ず最初に復元指定ポイントに対応するアドレス変換テーブルをアドレス変換器４０２に設定（ＢＩＯＳルーチンＡ）し、次いで、指定復元ポイントでの初期値付き局所変数や大域変数の配置状態への復帰の実現のためのプログラムＲＯＭ４０７やデータＲＯＭ４０８の書込み処理（ＢＩＯＳルーチンＢ）を実施する。また、インジェクションコード７２３が実行されると、ＲＯＭ消去ＢＩＯＳルーチンもコールされる。ＲＯＭ消去ＢＩＯＳルーチンは、書き換えが行われる領域のブロックを消去する処理を実施する。
【０１３３】
図５５は、実施の形態３にかかる、局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理委譲を行うインジェクションコード７２１での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
まず、ステップ５５００（Ｓ５５００）で、第一引数ａｒｇ１に、プログラムＲＯＭ４０７に対する消去及び書込み処理プログラムが配置される、ＳＲＡＭ４０６上のアドレスを配置する。なお、消去及び書込み処理プログラムはプログラムＲＯＭ４０７の特定のアドレスに予め配置されている。次に、ステップ５５０１（Ｓ５５０１）で、第二引数ａｒｇ２に、この消去及び書込み処理プログラムへ渡す引数のフレームポインタを配置する。次に、ステップ５５０２（Ｓ５５０２）で、第三引数ａｒｇ３に、ロールバック対象の差分プログラム内の局所変数更新部分に対応するコードが配置されているデータＲＯＭ４０８またはＳＲＡＭ４０６上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ５５０３（Ｓ５５０３）で、第四引数ａｒｇ４に読み出しデータのデータ長を配置する。ステップ５５０４（Ｓ５５０４）で、第五引数ａｒｇ５にデータ書込み先の先頭アドレスを配置する。ステップ５５０５（Ｓ５５０５）でＲＯＭ消去ＢＩＯＳルーチンのコールを実施する。ステップ５５０６（Ｓ５５０６）で、対応するＢＩＯＳルーチンのコールを実施する。
【０１３４】
なお、ステップ５５０５で呼び出されるＲＯＭ消去ＢＩＯＳルーチンの詳細は、図５８を参照して後述する。ＲＯＭ消去ＢＩＯＳルーチンは、書き換えが行われる領域のブロックを消去する処理を実施する。ステップ５５０６で呼び出されるＢＩＯＳルーチンは、プログラムＲＯＭ４０７に対する消去及び書込みプログラムを第一引数に指定されたＳＲＡＭ４０６のアドレスに配置し、第二引数に指定されたフレームポインタをこの消去及び書込みプログラムへ引き渡し、この消去及び書込みプログラムを実行する事で、局所変数更新の実現のためのプログラムＲＯＭ４０７の書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理委譲のインジェクションコード７２１がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、局所変数更新の実現のためのプログラムＲＯＭ４０７の消去及び書込み処理を実施する。なお、ＳＲＡＭ４０６に配置されたプログラムＲＯＭ４０７に対する消去及び書込みプログラムは、ＳＲＡＭ４０６をワークメモリとして用いる専用ハードウェアとして実現されていても良い。
【０１３５】
図５６は、実施の形態３にかかる、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理委譲を行うインジェクションコード７２２での処理に対応するＢＩＯＳルーチンコードの呼び出し処理の手続き例を示すフローチャートである。
まず、ステップ５６００（Ｓ５６００）で、第一引数ａｒｇ１にロールバック対象の差分プログラム内の大域変数更新部分に対応するコードが配置されているデータＲＯＭ４０８またはＳＲＡＭ４０６上の領域の先頭アドレスを配置する。すなわち、この先頭アドレスは、読み出しデータの先頭アドレスである。ステップ５６０１（Ｓ５６０１）で、第二引数ａｒｇ２に読み出しデータのデータ長を配置する。ステップ５６０２（Ｓ５６０２）で、第三引数ａｒｇ３にデータ書込み先の先頭アドレスを配置する。ステップ５６０３（Ｓ５６０３）で、ＲＯＭ消去ＢＩＯＳルーチンのコールを実施する。ステップ５６０４（Ｓ５６０４）で、対応するＢＩＯＳルーチンのコールを実施する。
【０１３６】
なお、ステップ５６０３で呼び出されるＲＯＭ消去ＢＩＯＳルーチンの詳細は、図５８を参照して後述する。ＲＯＭ消去ＢＩＯＳルーチンは、書き換えが行われる領域のブロックを消去する処理を実施する。ステップ５６０４で呼び出されるＢＩＯＳルーチンは、大域変数更新の実現のためのデータＲＯＭ４０８の書込み処理を実施する。実行例は、例えば以下のようになる。ＣＡＮインターフェース４０９からの割込みで大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理委譲のインジェクションコード７２２がＳＲＡＭ４０６に配置され、割込みでこのインジェクションコードが実行され、ＢＩＯＳルーチンコールが成される。当該ＢＩＯＳルーチンでは、大域変数更新の実現のためのデータＲＯＭ４０８の消去及び書込み処理を実施する。
【０１３７】
次に、ＲＯＭ消去ＢＩＯＳルーチンについて説明する。本実施の形態では、更新差分バイナリプログラムの動的な配置のために必要とプログラムＲＯＭ４０７／データＲＯＭ４０８の消去処理を、実施の形態１及び２に示したような、ブロック消去番号を外部から渡す方法で実現する訳ではない。本実施の形態では、各更新情報が配置されている、プログラムＲＯＭ４０７／データＲＯＭ４０８のアドレス情報を組込み機器４０の内部で管理しておくことで、意図しないＲＯＭの消去を抑止する。具体的には、データＲＯＭ４０８に格納された対応表を用いて消去処理が行われる。図５７は、データＲＯＭ４０８に格納される対応表の一例を示す図である。この対応表は、更新情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に書き込まれた際の書き込み先の先頭アドレスと、この先頭アドレスの属する消去ブロック番号とを管理する管理情報である。この対応表は、各更新情報が、プログラムＲＯＭ４０７又はデータＲＯＭ４０８に格納される際に、組込み機器４０により構築及び更新される。
【０１３８】
図５８は、対応表を用いたＲＯＭ消去ＢＩＯＳルーチンの一例を示すフローチャートである。
ステップ５８００（Ｓ５８００）で、変数ａｄｄｒに書換え先頭アドレスを代入する。ここで、書き換え先頭アドレスは、上記図５３から図５６において示されたデータ書込み先の先頭アドレスに対応する。次に、ステップ５８０１（Ｓ５８０１）で、上記の対応表からａｄｄｒに対応する消去ブロック番号を探し出す。ステップ５８０２（Ｓ５８０２）で、対応する消去ブロック番号が探し出されたか否かを判定し、探し出された場合、処理はステップ５８０３へ移行し、探し出されなかった場合、処理は終了する。ステップ５８０３（Ｓ５８０３）で、消去ブロック番号を変数ｂｌｋｎｏに代入する。ステップ５８０４（Ｓ５８０４）で、プログラムＲＯＭ４０７又はデータＲＯＭ４０８のｂｌｋｎｏ番のブロックを消去する。
【０１３９】
次に更新情報ファイル５０の作成手順について説明する。本実施の形態にかかる更新情報ファイル５０の作成手順では、上述の図３３Ａの処理ステップ３３０５の詳細が、図３５Ａ、３５Ｂから図５９Ａ、５９Ｂに置き換えられる。図５９Ａ、５９Ｂは、図３３Ａのステップ３３０５の詳細を示すフローチャートである。以下、図３５Ａ、３５Ｂに示した処理とは異なる点について説明し、同様の処理については適宜説明を割愛する。
【０１４０】
ステップ５９００（Ｓ５９００）からステップ５９０３（Ｓ５９０３）までの処理は、図３５Ａに示したステップ３５００からステップ３５０３までの処理と同様である。
ステップ５９０４（Ｓ５９０４）において、データ処理部２２は、変更のあるデータテーブル数だけ、ステップ５９０５〜ステップ５９０８の処理を繰り返す。
ステップ５９０５（Ｓ５９０５）の処理は、図３５Ａに示したステップ３５０５の処理と同様である。
ステップ５９０６（Ｓ５９０６）で、データ処理部２２は、ステップ５９０５で算出したアドレスに既にデータテーブルが含まれている場合、消去対象のブロックがあると判断し、そのブロック内のデータテーブル変数を、更新内容も含めて書込みデータとする。上述の通り、本実施の形態では、消去対象のブロック番号は、対応表を参照することにより決定されるので、図３５Ａに示したステップ３５０６のような消去対象のブロック番号の決定はなされない。ただし、ステップ５９０５で算出したアドレスに既にデータテーブルが含まれている場合、算出したアドレスを含むブロック番号を算出し、開発環境での消去書換え回数管理に利用する。データ処理部２２は、ステップ５９０５で算出したアドレスにデータテーブルが含まれていない場合、変更のあるデータテーブル全体を書込みデータとする。また、データ処理部２２は更新により書き込まれるデータテーブルのデータ長も算出する。
ステップ５９０７（Ｓ５９０７）で、データ処理部２２は、ＲＯＭ消去及び書込みのドライバを動作させるための以下の引数を用いて、プログラムＲＯＭ４０７の消去/書込み処理委譲のインジェクションコード７２１を生成する。すなわち、当該ドライバプログラムの配置アドレス、当該ドライバへ渡すフレームポインタ、更新により書き込まれるデータの内蔵メモリでの配置位置の先頭アドレス、更新により書き込まれるデータのデータ長、及びステップ５９０５で算出されたプログラムＲＯＭ４０７上の先頭アドレスが引数として用いられる。なお、ここでは、ステップ５９０６で算出されたブロック番号を引数として渡さずインジェクションコードを生成するが、上述の通り、このインジェクションコードが実行されると、対応表により決定される番号のブロックが消去されることとなる。ステップ５９０５で算出したアドレスにデータテーブルが含まれていない場合、データ処理部２２は、プログラムＲＯＭ書込み処理委譲のインジェクションコード７０７を生成する。
【０１４１】
ステップ５９０８（Ｓ５９０８）からステップ５９１５（Ｓ５９１５）までの処理は、図３５Ａ、３５Ｂに示したステップ３５０９からステップ３５１６までの処理と同様である。
ステップ５９１６（Ｓ５９１６）において、データ処理部２２は、変更のあるデータテーブル数だけ、ステップ５９１７〜ステップ５９２０の処理を繰り返す。
ステップ５９１７（Ｓ５９１７）の処理は、図３５Ｂに示したステップ３５１８の処理と同様である。
ステップ５９１８（Ｓ５９１８）で、データ処理部２２は、ステップ５９１７で算出したアドレスに既にデータテーブルが含まれている場合、消去対象のブロックがあると判断し、そのブロック内のデータテーブル変数を、更新内容も含めて書込みデータとする。上述の通り、本実施の形態では、消去対象のブロック番号は、対応表を参照することにより決定されるので、図３５Ｂに示したステップ３５１９のような消去対象のブロック番号の決定はなされない。ただし、ステップ５９１７で算出したアドレスに既にデータテーブルが含まれている場合、算出したアドレスを含むブロック番号を算出し、開発環境での消去書換え回数管理に利用する。データ処理部２２は、ステップ５９１７で算出したアドレスにデータテーブルが含まれていない場合、変更のあるデータテーブル全体を書込みデータとする。また、データ処理部２２は更新により書き込まれるデータテーブルのデータ長も算出する。
ステップ５９１９（Ｓ５９１９）で、データ処理部２２は、書込みデータの内蔵メモリでの配置位置の先頭アドレス、書込みデータのデータ長、及びステップ５９１７で算出した先頭アドレスを引数として、データＲＯＭ消去/書込み処理委譲のインジェクションコード７２２を生成する。なお、ここでは、ステップ５９１８で算出されたブロック番号を引数として渡さずインジェクションコードを生成しているが、上述の通り、このインジェクションコードが実行されると、対応表により決定される番号のブロックが消去されることとなる。ステップ５９１８で算出したアドレスにデータテーブルが含まれていない場合、データ処理部２２は、データＲＯＭ書込み処理委譲のインジェクションコード７０８を生成する。
以降、ステップ５９２０（Ｓ５９２０）からステップ５９２７（Ｓ５９２７）までの処理は、図３５Ｂに示したステップ３５２２からステップ３５２９までの処理と同様である。
【０１４２】
このように、本実施の形態では、更新情報に含まれる情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に書き込まれた際の書き込み先アドレスと、この書き込み先アドレスに対応する消去ブロック番号とを管理する管理情報をデータＲＯＭ４０８が記憶し、組込み機器４０は、プログラムＲＯＭ４０７又はデータＲＯＭ４０８に記憶された情報の削除の際、この管理情報に示される消去ブロック番号により指定された領域を削除する。したがって、外部から指定された領域を削除する場合に比べセキュリティが向上する。
【０１４３】
次に、ＲＯＭに対する悪意ある書込み消去に対する対応策について説明する。実施の形態１及び２では、プログラムＲＯＭ４０７又はデータＲＯＭ４０８への書込みが完了してから署名検証を実施していた。こうした場合、プログラムＲＯＭ４０７又はデータＲＯＭ４０８への書込み時間が短縮化される。しかし、例えば無意味なデータが流し込まれることにより、フラッシュメモリへの書込みと署名検証の失敗による消去が意図的に繰り返されうる。フラッシュメモリの性質上、頻繁に書込み消去が行われると製品寿命が縮む恐れがある。そこで、本実施の形態では、こうした悪意ある書込み消去を抑止する目的で、署名検証後に書込みを行うプログラムの更新動作例を示す。
【０１４４】
本実施の形態では、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に署名検証が行われる。そして、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に署名検証が行われたか否かをハードウェアにて管理する事で、より堅牢な更新情報の動的な配置を可能とする。図６０は、ＲＯＭへの書込みの許否を制御する制御回路４５０の一例を示す模式図である。
【０１４５】
本実施の形態において、組込み機器４０は、制御回路４５０を有する。制御回路４５０は、更新制御レジスタ４５１、反転回路４５２、ＡＮＤ回路４５３、及びＯＲ回路４５４を有する。更新制御レジスタ４５１は、「許可」ビット、「ｆ１」ビット、「ｆ２」ビット、「ｒ」ビットを含む。反転回路４５２には、更新制御レジスタ４５１の「許可」ビットが入力される。ＡＮＤ回路４５３には、更新制御レジスタ４５１の「ｆ１」ビット及び「ｆ２」ビットが入力される。ＯＲ回路４５４には、ＡＮＤ回路４５３の出力及び反転回路４５２の出力が入力される。ＯＲ回路４５４の出力は、プログラムＲＯＭ４０７／データＲＯＭ４０８が有する制御回路である書込みコントローラに入力される。ここで、「許可」ビットは、ＣＰＵ４０１が特権モードの時のみ、読み書き可能であり、このビットに‘１’が設定された場合のみ制御回路４５０による制御が有効となる。「ｆ１」ビットは、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に実施されるＳＲＡＭ４０６へのデータ転送が完了した事を示すビットである。「ｆ１」ビットは、ＳＲＡＭ４０６へのデータ転送完了時に‘１’が設定される。「ｆ２」ビットは、署名検証が成功したか否かを示すビットであり、署名検証完了時に‘１’が設定される。「ｆ１」ビットと「ｆ２」ビットは読出しがなされることで‘０’にクリアされる。制御回路４５０によれば、「許可」ビットを‘１’に設定する事で、制御回路４５０による制御が有効となり、その後に「ｆ１」ビットと「ｆ２」ビットがともに‘１’に設定されたときのみ、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラが有効化される。制御回路４５０による制御が有効化されている状態で署名検証がスキップされた場合、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラは無効化されているため、書込みＢＩＯＳを何らかの手段で実行したとしても、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みは実施されない。「ｒ」ビットには、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラへのイネーブル信号値が書き込まれる。「ｒ」ビットは読出しのみ可能であり、読み出すと‘０’にクリアされる。ここで、制御回路４５０は、プログラムＲＯＭ４０７とデータＲＯＭ４０８のそれぞれに対して個別に設けても良い。
【０１４６】
次に、制御回路４５０を用いた動作例について説明する。図６１は、制御回路４５０を用いた書き込みの制御動作の一例を示すフローチャートである。本フローチャートは、ステップ６１００が実行された事を契機として処理を開始するものとする。
ステップ６１００（Ｓ６１００）で、実施の形態１又は実施の形態２で説明した更新動作に従い、更新差分プログラムがＳＲＡＭ４０６へ転送される。
ステップ６１０１（Ｓ６１０１）で、転送完了後、ＣＰＵ４０１は、「ｆ１」ビットを設定する。ここで、ＣＰＵ４０１は、転送が正常終了した場合‘１’を設定し、そうでない場合、‘０’を設定する。
ステップ６１０２（Ｓ６１０２）で、暗号処理ユニット４０４（署名検証部）が、更新差分プログラムの署名検証を実施する。
ステップ６１０３（Ｓ６１０３）で、署名検証完了後、ＣＰＵ４０１は、「ｆ２」ビットを設定する。ＣＰＵ４０１は、署名検証結果が正常な場合、‘１’を設定し、そうでない場合、‘０’を設定する。
ステップ６１０４（Ｓ６１０４）で、「許可」ビットが‘１’か否かが確認され、‘１’の場合、処理はステップ６１０５へ移行し、そうでない場合、処理はステップ６１０６へ移行する。
ステップ６１０５（Ｓ６１０５）で、「ｆ１」ビットが‘１’でかつ「ｆ２」ビットが‘１’であるか否かが確認され、双方ともに‘１’の場合、処理はステップ６１０６へ移行し、そうでない場合、処理はステップ６１０８へ移行する。
ステップ６１０６（Ｓ６１０６）で、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラに対し書込み許可を設定し、「ｒ」ビットに‘１’が設定される。
ステップ６１０７（Ｓ６１０７）で、ＣＰＵ４０１は、更新制御レジスタ４５１を必ず読み出す。読み出す事で、「ｆ１」ビット、「ｆ２」ビット、及び「ｒ」ビットの内容を確認する。また、これら３つのビットが‘０’にクリアされ、そして、処理が終了する。なお、ステップ６１０７において、書込み処理が完了した場合に、ＣＰＵ４０１は、「ｒ」ビットの確認を行うことで、書き込み処理が行われた際に書込みコントローラへのイネーブル信号値が実際に１であったか否かを確認することができる。また、許可ビット以外の全ビットが‘０’にクリアされるため、次の更新差分プログラムのプログラム/データＲＯＭへの書込みで、署名検証や転送完了が正常に行われているかのチェックが必須となり、これらチェックをスキップする事での攻撃を排除可能となる。
ステップ６１０８（Ｓ６１０８）で、「ｒ」ビットに‘０’が設定され、処理はステップ６１０７へ移行する。
【０１４７】
このように、本実施の形態では、組込み機器４０は、署名検証結果が正当であることが確認された場合に、プログラムＲＯＭ４０７又はデータＲＯＭ４０８への更新情報の書き込みを許可する制御回路４５０を有する。これにより、署名検証結果が不当である更新情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に書き込まれることを抑制し、不当である更新情報に起因するプログラムＲＯＭ４０７又はデータＲＯＭ４０８の消去処理を抑制することが可能となる。
【０１４８】
最後に、本実施の形態における、組込み機器での更新動作について説明する。本実施の形態をプログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が３である組込み機器４０に適用した場合の更新動作は、図３７と同様であるが、以下の点で異なる。また、本実施の形態をプログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が２である組込み機器４０に適用した場合の更新動作は、図４９と同様であるが、以下の点で異なる。すなわち、本実施の形態が適用された場合、図３７に示したステップ３７０１及び図４９に示したステップ４９０２では、管理サーバ３０は、更新プログラムのセキュアな動的ロード、即ち本実施の形態で述べたセキュア対応を考慮した、プログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。
【０１４９】
以上、実施の形態３について説明した。本実施の形態によれば、インジェクションコードを悪用したプログラムやデータ消去を抑止可能となり、また、ＲＯＭへの悪意ある書込み消去を抑止可能となる。
【０１５０】
＜実施の形態４＞
次に、実施の形態４について説明する。本実施の形態では、組込み機器４０での更新情報の動的な配置の途中又は組込み機器４０での更新動作の途中で、組込み機器４０において電源停止が発生した場合の復旧時の対応方法について説明する。なお、本実施の形態にかかる組込み機器４０は、更新情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に格納される際に、更新情報の書き込み先の先頭アドレスと、この先頭アドレスの属する消去ブロック番号とを管理する上述の管理情報をデータＲＯＭ４０８に記憶する。図６２は、組込み機器４０で更新情報の動的な配置又は更新動作の途中で電源停止が発生した場合の復旧処理の一例を示すフローチャートである。以下、フローチャートに沿って説明する。なお、下記のフローにおける組込み機器４０の動作は、例えば、ＣＰＵ４０１がプログラムＲＯＭ４０７等に格納されたファームウェア等のプログラムを実行することにより、実現される。
【０１５１】
ステップ６２００（Ｓ６２００）で、組込み機器４０は、更新情報の動的な配置、又は配置された更新情報に対する更新動作を開始する。
ステップ６２０１（Ｓ６２０１）で、更新情報の動的な配置又は更新動作の途中で、組込み機器４０において電源遮断が発生する。なお、電源遮断が発生しない場合には、ステップ６２００の処理が完了するまで継続されることとなる。
ステップ６２０２（Ｓ６２０２）で、組込み機器４０の電源が復帰し、組込み機器４０が再起動する。
ステップ６２０３（Ｓ６２０３）で、組込み機器４０は、対応表を確認し、プログラムＲＯＭ４０７又はデータＲＯＭ４０８の消去ブロック番号が識別可能であるかを確認する。具体的には、組込み機器４０は、更新情報の配置毎に作成される上記対応表のうち、電源遮断の直前の更新情報の配置において作成された対応表を参照することにより確認する。
ステップ６２０４（Ｓ６２０４）で、上記識別が成功した場合には、処理はステップ６２０７へ移行し、そうでない場合、処理はステップ６２０５へ移行する。ここで、ステップ６２０３における識別が成功することは、電源遮断の直前の更新情報の配置において電源遮断の発生までの間に書き込まれた情報について、書き込み先のブロックの確認ができたことを意味する。ところで、上述のように、更新情報の書込みの際、書込み先に既にデータが格納されている場合には、書き込み先のブロックを消去した上で、書き込みが実施されるよう更新情報ファイル５０は構成されている。このため、電源遮断の発生までの間に更新情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に書き込まれた場合、そのままの更新情報ファイル５０でこの更新を再度やり直すことができなくなる。これは、データが格納されていないはずの書込み先にデータ書き込まれてしまっている可能性があるためである。しかし、電源遮断の発生までの間に書き込まれた位置が特定できる場合には、書き込み先のブロックを消去することで、このような問題が解消される。すなわち、更新情報ファイル５０の修正を行うことなく、更新情報の配置をやり直すことが可能となる。
ステップ６２０５（Ｓ６２０５）で、組込み機器４０は、デフォルトプログラムによる動作へのロールバック処理を実施する。
ステップ６２０６（Ｓ６２０６）で、開発環境２０において、電源遮断前に生成した更新情報の再構成が行われる。ここでは、更新情報が全て書込まれているものと仮定して、再構成が行われる。つまり、プログラムＲＯＭ４０７又はデータＲＯＭ４０８における書込み先にデータが既に格納されていると仮定した上で、再構成が行われる。この再構成では、具体的には、書き込み先のブロックに対する消去処理を追加した更新情報ファイル５０が生成される。その後、処理は、ステップ６２００へ移行し、再構成された更新情報に基づく、更新情報の動的な配置、及び更新動作が行われる。なお、ステップ６２０６では、ネットワークを介した管理サーバ３０への通知及び管理サーバ３０から開発環境２０への通知がなされ、更新情報が再構成されるとしても良いし、開発環境２０へは通知せずに、管理サーバ３０上で上述の再構成が行われてもよい。
ステップ６２０７（Ｓ６２０７）では、組込み機器４０は、ステップ６２０３で識別したブロック消去番号を用いてプログラムＲＯＭ４０７又はデータＲＯＭ４０８のブロックの消去を実施する。その後、処理は、ステップ６２００へ移行し、電源遮断前に生成した更新情報に基づく、更新情報の動的な配置、及び更新動作が行われる。
【０１５２】
このように、本実施の形態にかかる組込み機器４０においては上述の管理情報を記憶しており、プログラムＲＯＭ４０７若しくはデータＲＯＭ４０８に対する更新情報の書き込みの際、又は更新情報の適用動作の際に電源が停止した場合、電源回復後、管理情報が参照可能であるときこの管理情報に従って電源停止前に書き込まれた更新情報を削除する。本実施の形態によれば、電源遮断が発生しても、再起動後の適切な更新を実現することができる。特に、対応表を用いた書き込み先の特定が行われることで消去すべきブロックが特定されるため、更新情報の再構成を行うことなく、再起動後の適切な更新を実現することができる。なお、本実施の形態は、実施の形態１、２、及び３のいずれとも組み合わせることができる。
【０１５３】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。例えば、実施の形態１では、ＲＯＭの面数が３である場合について説明したが、４以上であってもよい。
【符号の説明】
【０１５４】
１、４０          組込み機器
２            ネットワーク入出力部
３            不揮発性メモリ
４            ＣＰＵ
５            アドレス変換器
１０            情報システム
１５            ネットワーク
２０            開発環境
２２、３３        データ処理部
３０            管理サーバ
３５            ネットワーク接続部
５０            更新情報ファイル
７０、７０１、７０２、７０３、７０４、７０５、７０６、７０７、７０８、７０９、７１０、７１１、７１２、７１３、７１４、７１５、７１６、７２０、７２１、７２２、７２３            インジェクションコード
４００            制御対象装置
４０１            ＣＰＵ
４０２、４０２Ａ、４０２Ｂアドレス変換器
４０３            割込みコントローラ
４０４            暗号処理ユニット
４０５            ＤＭＡコントローラ
４０６            ＳＲＡＭ
４０７、４１２        プログラムＲＯＭ
４０８            データＲＯＭ
４０９            ＣＡＮインターフェース
４１０            入出力インターフェース
４１１            サブＣＰＵ
４４０、４４３        汎用割込みベクタテーブル
４４１、４４４        専用割込みベクタテーブル
４４２            プログラム更新作業領域
４５０            制御回路
４５１            更新制御レジスタ
【図１】
0006609199.tif 000002
【図２】
0006609199.tif 000003
【図３】
0006609199.tif 000004
【図４】
0006609199.tif 000005
【図５】
0006609199.tif 000006
【図６】
0006609199.tif 000007
【図７】
0006609199.tif 000008
【図８】
0006609199.tif 000009
【図９】
0006609199.tif 000010
【図１０】
0006609199.tif 000011
【図１１Ａ】
0006609199.tif 000012
【図１１Ｂ】
0006609199.tif 000013
【図１２】
0006609199.tif 000014
【図１３】
0006609199.tif 000015
【図１４】
0006609199.tif 000016
【図１５】
0006609199.tif 000017
【図１６】
0006609199.tif 000018
【図１７】
0006609199.tif 000019
【図１８】
0006609199.tif 000020
【図１９】
0006609199.tif 000021
【図２０】
0006609199.tif 000022
【図２１】
0006609199.tif 000023
【図２２】
0006609199.tif 000024
【図２３】
0006609199.tif 000025
【図２４】
0006609199.tif 000026
【図２５】
0006609199.tif 000027
【図２６】
0006609199.tif 000028
【図２７】
0006609199.tif 000029
【図２８】
0006609199.tif 000030
【図２９】
0006609199.tif 000031
【図３０】
0006609199.tif 000032
【図３１Ａ】
0006609199.tif 000033
【図３１Ｂ】
0006609199.tif 000034
【図３２Ａ】
0006609199.tif 000035
【図３２Ｂ】
0006609199.tif 000036
【図３３Ａ】
0006609199.tif 000037
【図３３Ｂ】
0006609199.tif 000038
【図３４】
0006609199.tif 000039
【図３５Ａ】
0006609199.tif 000040
【図３５Ｂ】
0006609199.tif 000041
【図３６】
0006609199.tif 000042
【図３７】
0006609199.tif 000043
【図３８】
0006609199.tif 000044
【図３９】
0006609199.tif 000045
【図４０】
0006609199.tif 000046
【図４１】
0006609199.tif 000047
【図４２】
0006609199.tif 000048
【図４３】
0006609199.tif 000049
【図４４】
0006609199.tif 000050
【図４５】
0006609199.tif 000051
【図４６】
0006609199.tif 000052
【図４７】
0006609199.tif 000053
【図４８Ａ】
0006609199.tif 000054
【図４８Ｂ】
0006609199.tif 000055
【図４９】
0006609199.tif 000056
【図５０】
0006609199.tif 000057
【図５１】
0006609199.tif 000058
【図５２】
0006609199.tif 000059
【図５３】
0006609199.tif 000060
【図５４】
0006609199.tif 000061
【図５５】
0006609199.tif 000062
【図５６】
0006609199.tif 000063
【図５７】
0006609199.tif 000064
【図５８】
0006609199.tif 000065
【図５９Ａ】
0006609199.tif 000066
【図５９Ｂ】
0006609199.tif 000067
【図６０】
0006609199.tif 000068
【図６１】
0006609199.tif 000069
【図６２】
0006609199.tif 000070