(57)【要約】【課題】実行オーバーヘッドを抑制し、車載制御や産業制御などハードリアルタイムシステムでの適用を可能とすること。【解決手段】判定装置は、第１のプログラムのうち第２のプログラムと異なるコード片の集合を示す第１の差分コードと、第２のプログラムのうち第１のプログラムと異なるコード片の集合を示す第２の差分コードとを生成する差分コード生成部と、第１の差分コードから所定の変換により第１の論理式を導出し、第２の差分コードから所定の変換により第２の論理式を導出する論理式導出部と、第２の論理式が第１の論理式を含むか否かにより、所定の組込み機器における第１のプログラムから第２のプログラムへの動的更新の可否を判定する判定部と、を備える。【選択図】図２
2018049506.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラムのうち第２のプログラムと異なるコード片の集合を示す第１の差分コードと、前記第２のプログラムのうち前記第１のプログラムと異なるコード片の集合を示す第２の差分コードとを生成する差分コード生成部と、
前記第１の差分コードから所定の変換により第１の論理式を導出し、前記第２の差分コードから前記所定の変換により第２の論理式を導出する論理式導出部と、
前記第２の論理式が前記第１の論理式を含むか否かにより、所定の組込み機器における前記第１のプログラムから前記第２のプログラムへの動的更新の可否を判定する判定部と、
を備える判定装置。
【請求項２】
前記論理式導出部は、
前記所定の変換として、前記第１の差分コードから第１のＳＭＴ（Satisfiability Modulo Theories）式を前記第１の論理式として導出し、前記第２の差分コードから第２のＳＭＴ式を前記第２の論理式として導出する
請求項１に記載の判定装置。
【請求項３】
前記論理式導出部は、
前記第１の差分コード及び前記第２の差分コードがループ記述を含む場合に、前記所定の変換として、前記第１の差分コードから第１のＥＦＳＭ（Extended Finite State Machine）を構築し、前記第２の差分コードから第２のＥＦＳＭを構築し、当該第１のＥＦＳＭから前記第１のＳＭＴ式を前記第１の論理式として導出し、当該第２のＥＦＳＭから前記第２のＳＭＴ式を前記第２の論理式として導出する
請求項２に記載の判定装置。
【請求項４】
前記論理式導出部は、
深さ優先探索を実施しつつ、当該深さ優先探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成することにより、前記第１のＥＦＳＭから前記第１のＳＭＴ式及び前記第２のＥＦＳＭから前記第２のＳＭＴ式を導出する
請求項３に記載の判定装置。
【請求項５】
前記判定部は、
前記第１の論理式及び前記第２の論理式を用いて模倣(Simulation)関係判定により前記第２の論理式が前記第１の論理式を含むか否か、及び双模倣(Bisimulation)等価性判定により、前記第１の論理式と前記第２の論理式が等価であるか否かを判定する
請求項１に記載の判定装置。
【請求項６】
前記論理式導出部は、
前記第１の差分コード及び前記第２の差分コードを簡略化して前記所定の変換を行う
請求項１に記載の判定装置。
【請求項７】
前記論理式導出部は、
前記簡略化として、前記第１の差分コード及び前記第２の差分コードを積極的コード移動、不到達式削除及び冗長式削除の順に実施して前記所定の変換を行う
請求項６に記載の判定装置。
【請求項８】
前記差分コード生成部は、
前記第１のプログラムと前記第２のプログラムとの差分のコードからアドレス解決を行ったオブジェクトコードを前記第１の差分コード及び前記第２の差分コードとして生成する
請求項１に記載の判定装置。
【請求項９】
前記差分コード生成部は、
関数呼び出し構造を維持するように前記第１のプログラムと前記第２のプログラムとの差分を取ることにより、前記第１の差分コード及び前記第２の差分コードを生成する
請求項１に記載の判定装置。
【請求項１０】
前記差分コード生成部は、
各タスクが構成されているプログラム関数群を定義したタスク分割情報を入力し、
前記タスク分割情報を用いて、前記第１のプログラムの各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、前記第２のプログラムの各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別し、当該識別した情報を出力する
請求項１に記載の判定装置。
【請求項１１】
第１のプログラムのうち第２のプログラムと異なるコード片の集合を示す第１の差分コードと、前記第２のプログラムのうち前記第１のプログラムと異なるコード片の集合を示す第２の差分コードとを生成し、
前記第１の差分コードから所定の変換により第１の論理式を導出し、前記第２の差分コードから前記所定の変換により第２の論理式を導出し、
前記第２の論理式が前記第１の論理式を含むか否かにより、所定の組込み機器における前記第１のプログラムから前記第２のプログラムへの動的更新の可否を判定する、
判定方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は判定装置及び判定方法に関し、例えば、組込み機器に対するプログラムの動的更新の判定装置及び判定方法に関する。
【背景技術】
【０００２】
近年、車載機器及び産業機器などに組み込まれる組込み機器が増加している。そして、このような組込み機器におけるプログラムをいわゆるＯＴＡ（Ｏｖｅｒ  Ｔｈｅ  Ａｉｒ）により更新する方法が求められている。プログラムの更新に関しては、種々の技術が提案されている。
【０００３】
例えば、特許文献１には、モジュール単位の更新プログラムに対して基準アドレスと相対アドレスを予め割当てておく事で、組込み機器上で動作するプログラムの動作を停止させることなく、プログラムをモジュール単位で動的に更新する技術が開示されている。
【０００４】
また、特許文献２には、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）の置換手法であって、現在実行中のＯＳにて、新規ＯＳを読み込むための準備と新規ＯＳ起動時に引き渡すべき情報の格納を実施し、現在実行中のＯＳを再起動する事で、新規ＯＳの読み込みと新規ＯＳ再起動時に新規ＯＳへの情報引渡しの準備を実施し、新規ＯＳを再起動する事でＯＳ置換を実現する手法が開示されている。
【０００５】
また、非特許文献１には、更新前後でどのようなコード削除・挿入がなされ、コード削除・挿入によるプログラムの制御フローとデータフローへの影響を解析し、変更による影響が出る前の部分を識別し、識別したプログラム部を切り替え可能プログラム・ポイントとし、動作実行中にプログラム更新を実現する手法が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−２１８３３４号公報
【特許文献２】特開２０１５−３２３１４号公報
【非特許文献】
【０００７】
【非特許文献１】Masatomo Hashimoto, "A Method of Safety Analysis for Runtime Code Update," In Proc. of ASIAN, LNCS 4435, pp.60-74, 2007.
【非特許文献２】Deepak Gupta, Pankaj Jalote, and Gautam Barua, "A Formal Framework for On-line Software Version Change," IEEE Tran on Software Engineering, Vol.22 Issue.2, pp.120-131, Feb 1996.
【非特許文献３】Joel Koshy and Raju Pandey, "Remote Incremental Linking for Energy-Efficient Reprogramming of Sensor Networks," In Proc. ofthe 2nd European Workshop on Wireless Sensor Networks, pp.354-365, 2005.
【非特許文献４】Meik Felser, Rudiger Kapitza, Jurgen Kleinoder, and Wolfgang Schroder-Preikschat, "Dynamic Software Update of Resource-Constrained Distributed Embedded Systems," Embedded System Design: Topics, Techniques and Trends, Volume 231 of the series IFIP - The International Federation for Information Processing pp.387-400, 2007.
【非特許文献５】Alfred V. Aho,Ravi Sethi,Jeffrey D. Ullman Monica S. Lam "Compilers: Principles, Techniques, and Tools," Prentice Hall
【非特許文献６】Scott A. Mahlke, David C. Lin, William Y. Chen, Richard E. Hank, and Roger A. Bringmann, "Effective compiler support for predicated execution using the hyperblock," ACM SIGMICRO Newsletter, Vol.23, Issue.1-2, pp.45-54, Dec. 1992.
【非特許文献７】Robin Milner, "Communication and Concurrency (Prentice Hall International Series in Computer Science)," Prentice Hall
【非特許文献８】Thomas A. Henzinger, Ranjit Jhala, Rupak Majumdar, and Gregoire Sutre. Lazy abstraction. Proceedings of the 29th Annual Symposium on Principles of Programming Languages (POPL), ACM Press, 2002, pp. 58-70.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、非特許文献１を用いて、組み込み機器においてプログラムを動的に更新するには、プログラム実行中にプログラムコンテキスト情報をトレースする必要があり、実行オーバーヘッドが大きく、そのままでは、車載制御や産業制御などハードリアルタイムシステムでの適用が困難である、という問題があった。ここで、プログラムコンテキスト情報とは、プログラムの実行に必要な各種情報として動的にヒープなどメモリに格納される情報であり、プログラムの制御依存関係やデータ依存関係、データへのアクセスなどの情報を含む情報である。
【０００９】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１０】
一実施の形態によれば、判定装置は、プログラムの動的更新可能問題を差分コードに着目して充足可能性問題に帰着させて解くものである。
【発明の効果】
【００１１】
前記一実施の形態によれば、実行オーバーヘッドを抑制し、車載制御や産業制御などハードリアルタイムシステムでの適用を可能とすることができる。
【図面の簡単な説明】
【００１２】
【図１】プログラムの動的更新可能条件を説明するための図である。
【図２】本実施の形態１にかかるシステム構成を示すブロック図である。
【図３】本実施の形態１にかかる重要な性質を説明するための図である。
【図４】本実施の形態１にかかる包含判定手順を説明するための図である。
【図５】動的更新可能かの十分条件判定 全体フローの流れを示すフローチャートである。
【図６】vimdiff形式の概念を説明するための図である。
【図７】差分コード生成フローの流れを説明するためのフローチャートである。
【図８】Call Graph Diffの例を示す図である。
【図９】Call Graph Diff構築処理概要の例を示す図である。
【図１０】Call Graph Diff処理フローの流れを説明するためのフローチャートである。
【図１１】固定定数変数の差分生成処理（１）の流れを説明するためのフローチャートである。
【図１２】固定定数変数の差分生成処理（２）の流れを説明するためのフローチャートである。
【図１３】固定定数変数の差分生成処理（３）の流れを説明するためのフローチャートである。
【図１４】各関数でのＳＳＡを考慮したdiff形式等の差分コードの構築処理（１）の流れを説明するためのフローチャートである。
【図１５】各関数でのＳＳＡを考慮したdiff形式等の差分コードの構築処理（２）の流れを説明するためのフローチャートである。
【図１６】関数内での差分コード片のマージ処理の流れを説明するためのフローチャートである。
【図１７】関数内での差分コード片のマージ処理の概念を説明するための図である。
【図１８】オブジェクトコード生成処理の流れを説明するためのフローチャートである。
【図１９】差分コードのアドレス解決処理の流れを説明するためのフローチャートである。
【図２０】差分バイナリ生成処理の流れを説明するためのフローチャートである。
【図２１】差分コードのsimplificationの例を示す図である。
【図２２】差分コードサイズ低減ための各差分関数のinline展開方針決定の流れを説明するためのフローチャートである。
【図２３】EFSMの構成の例を示す図である。
【図２４】ループなしの場合のＳＭＴ式導出の例を示す図である。
【図２５】ループありの場合のＳＭＴ変換処理フローの流れを説明するためのフローチャートである。
【図２６】ループありの場合のＳＭＴ変換の例を示す図である。
【図２７】模倣関係判定と双模倣等価性判定の例を示す図である。
【図２８】本実施の形態２にかかるシステム構成を示すブロック図である。
【図２９】更新後のプログラム実行手順例を説明する模式図である。
【図３０】アドレス変換器によるアドレス変換の詳細を説明する模式図である。
【図３１】更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。
【図３２】変換されたアドレスと差分コードの対応例を示す模式図である。
【図３３】変換されたアドレスと差分コードの別の対応例を示す模式図である。
【図３４】変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。
【図３５】変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。
【図３６】組込み機器におけるプログラムの動的な配置動作の一例を説明する模式図である。
【図３７】ＲＯＭへの書込みの許否を制御する制御回路の一例を示す模式図である。
【図３８】制御回路を用いた書き込みの制御動作の一例を示すフローチャートである。
【図３９】プログラム更新手順の一例を示すフローチャートである。
【図４０】プログラム更新手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００１４】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００１５】
まず、本実施の形態が解決しようとする課題について以下に詳述する。図１は、プログラムの動的更新可能条件を説明するための図である。ここで、プログラムの動的更新可能条件は、「プログラム実行途中でプログラムの更新を実施した後、有限回のステップ実行で、更新プログラムを初期状態から実行して到達可能な状態へ、必ず到達する事」となる。図１では、以下の定義とする。
P：更新前プログラム、
P'：更新後プログラム、
P(s0)：Pの初期状態
P(sk)：Pの初期状態から有限回のステップ実行で到達可能な状態
P'(t0)：P'の初期状態
P'(tl)：P'の初期状態から有限回のステップ実行で到達可能な状態
T：更新前プログラムから更新後プログラムへの動的変更
そして、上記条件満たす場合、即ち、P(sk)にて動的プログラム更新が実施され、その後の有限回のステップ実行でP'(tl)に到達する実行例を示している。
【００１６】
また、本条件を満たすか否かの判定問題が決定不能である事が、非特許文献２に示されている。従って、十分条件を与えて判定可能とせざるを得ず、非特許文献１で指摘されているように、非常に厳しい制約が課されるという問題がある。また、非特許文献１を含め、既存手法そのままでは、車載制御や産業制御などハードリアルタイムシステムでの適用が困難である、という問題がある。その理由は、既存手法では、プログラムコンテキスト情報を、プログラム実行中にトレースする必要があり、実行オーバーヘッドが大きいためである。プログラムコンテキスト情報とは、上述した通り、プログラムの実行に必要な各種情報として動的にヒープなどメモリに格納される情報であり、プログラムの制御依存関係やデータ依存関係、データへのアクセスなどの情報を含む情報である。
【００１７】
ここで、上述した特許文献１及び２並びに非特許文献１の課題について説明する。
まず、特許文献１では、組込み機器で基準アドレスと相対アドレスから実アドレスを算出する事で、更新プログラムの動的なアドレス解決が可能である事を前提としている。そのため、組込み機器が前記動的アドレス解決機能を有さない場合、直接適用する事ができない。また、特許文献１の実施例ではＬｉｎｕｘ（登録商標）など動的アドレス変換機構を伴う高機能ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）搭載が前提となっている。よって、特許文献１にかかる技術は、そのような機構がない組込みＯＳのみが搭載されている場合や、ＯＳ自体が搭載されていない場合に適用する事が出来ない。また、モジュール単位での端末機器での動的更新を対象としているため、差分コードのみを用いた更なるメモリ削減が達成できない。
【００１８】
また、特許文献２では、動的プログラム更新手段を提供していない。そして、特許文献２では、更新プログラムの読み込みでは、必ず現在実行中のＯＳの再起動を行わなければならない。また、更新のための新規ＯＳでの再起動を連続実行してしまう。さらに、特許文献２では、ＯＳ全体での更新を対象としているため、差分コードのみでの更新によるメモリ削減が達成できない。
【００１９】
また、非特許文献１は、修正前後の２つのプログラムで動的切り替えが可能なプログラム・ポイント導出に関する技術である。そのため、非特許文献１は、差分更新コードを用いた動的プログラム更新技術を直接示すものではない。また、非特許文献１は、前記プログラム・ポイント導出が記述の意味ではなく文法に基づく方法であるため、更新後プログラムで更新前プログラムの意味を変更する事なくコード移動を行うなどのコード最適化を行った場合は、適切なプログラム・ポイントの導出が出来ないという問題がある。また、非特許文献１は、プログラム実行時に構築されるヒープをトレースする事で、動的切り替え可能なプログラム・ポイントであるか否かを判断する事が前提であり、実行時オーバーヘッドが大きいという問題がある。
【００２０】
また、特許文献１及び２並びに非特許文献１のいずれも、更新での異常検知時や外部からの指示に基づく更新前プログラムへのロールバックを可能とする手段が提供されていない。
【００２１】
（解決手段）
本実施の形態による解決手段は、差分バイナリを用いて、システム再起動を伴わないプログラム更新が可能かの十分条件と、前記十分条件を差分バイナリが満たすか否かを、開発環境で更新前プログラムと更新後プログラムから差分プログラムを生成する際に検証する方法及び装置といえる。また、前記差分プログラムを用いた組込み機器での動的プログラム更新手法も含む。
【００２２】
ここで、組込み機器は、プログラムカウンタを動的に更新可能なプロセッサ、及び独立な読出し及び書込みアクセスが可能な１面以上のプログラムメモリとデータメモリを少なくとも有するハードウェア機構を具備しているものとする。そして、既に更新前プログラムが配置されているとする。その上で、前記十分条件を満たさない場合は、システム再起動を伴うプログラム更新を実施するものとする。
【００２３】
尚、本実施の形態による解決手段は次のように言い換えることもできる。すなわち、本実施の形態にかかる判定装置は、
第１のプログラムのうち第２のプログラムと異なるコード片の集合を示す第１の差分コードと、前記第２のプログラムのうち前記第１のプログラムと異なるコード片の集合を示す第２の差分コードとを生成する差分コード生成部と、
前記第１の差分コードから所定の変換により第１の論理式を導出し、前記第２の差分コードから前記所定の変換により第２の論理式を導出する論理式導出部と、
前記第２の論理式が前記第１の論理式を含むか否かにより、所定の組込み機器における前記第１のプログラムから前記第２のプログラムへの動的更新の可否を判定する判定部と、
を備える。
【００２４】
また、前記論理式導出部は、
前記所定の変換として、前記第１の差分コードから第１のＳＭＴ（Satisfiability Modulo Theories）式を前記第１の論理式として導出し、前記第２の差分コードから第２のＳＭＴ式を前記第２の論理式として導出する。
【００２５】
さらに、前記論理式導出部は、
前記第１の差分コード及び前記第２の差分コードがループ記述を含む場合に、前記所定の変換として、前記第１の差分コードから第１のＥＦＳＭ（Extended Finite State Machine）を構築し、前記第２の差分コードから第２のＥＦＳＭを構築し、当該第１のＥＦＳＭから前記第１のＳＭＴ式を前記第１の論理式として導出し、当該第２のＥＦＳＭから前記第２のＳＭＴ式を前記第２の論理式として導出する。
【００２６】
さらに、前記論理式導出部は、
深さ優先探索を実施しつつ、当該深さ優先探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成することにより、前記第１のＥＦＳＭから前記第１のＳＭＴ式及び前記第２のＥＦＳＭから前記第２のＳＭＴ式を導出する。
【００２７】
また、前記判定部は、
前記第１の論理式及び前記第２の論理式を用いて模倣(Simulation)関係判定により前記第２の論理式が前記第１の論理式を含むか否か、及び双模倣(Bisimulation)等価性判定により、前記第１の論理式と前記第２の論理式が等価であるか否かを判定する。
【００２８】
また、前記論理式導出部は、
前記第１の差分コード及び前記第２の差分コードを簡略化して前記所定の変換を行う。
【００２９】
さらに、前記論理式導出部は、
前記簡略化として、前記第１の差分コード及び前記第２の差分コードを積極的コード移動、不到達式削除及び冗長式削除の順に実施して前記所定の変換を行う。
【００３０】
また、前記差分コード生成部は、
前記第１のプログラムと前記第２のプログラムとの差分のコードからアドレス解決を行ったオブジェクトコードを前記第１の差分コード及び前記第２の差分コードとして生成する。
【００３１】
また、前記差分コード生成部は、
関数呼び出し構造を維持するように前記第１のプログラムと前記第２のプログラムとの差分を取ることにより、前記第１の差分コード及び前記第２の差分コードを生成する。
【００３２】
また、前記差分コード生成部は、
各タスクが構成されているプログラム関数群を定義したタスク分割情報を入力し、
前記タスク分割情報を用いて、前記第１のプログラムの各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、前記第２のプログラムの各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別し、当該識別した情報を出力する。
【００３３】
また、本実施の形態にかかる判定方法は、
第１のプログラムのうち第２のプログラムと異なるコード片の集合を示す第１の差分コードと、前記第２のプログラムのうち前記第１のプログラムと異なるコード片の集合を示す第２の差分コードとを生成し、
前記第１の差分コードから所定の変換により第１の論理式を導出し、前記第２の差分コードから前記所定の変換により第２の論理式を導出し、
前記第２の論理式が前記第１の論理式を含むか否かにより、所定の組込み機器における前記第１のプログラムから前記第２のプログラムへの動的更新の可否を判定する。
【００３４】
（効果）
（１）組込み機器が動的アドレス解決機能を有さない場合であっても、差分コードを用いた動的プログラム更新が可能か判定可能であり可能な場合、実施可能である。
（２）プログラムの実行に必要な各種情報として動的に格納されるプログラムコンテキスト情報に関して、タスク間でのデータ引渡しとして利用される出力結果の有無を表す情報を除いて、プログラム実行中にトレースする機能を伴う事なくプログラム更新が可能であり、実行時オーバーヘッドが従来手法に比べて大幅に軽減可能である。
（３）モジュール単位での更新に比べ、差分コードのみを用いた更なるメモリ削減が達成可能である。
（４）フラッシュメモリの書込み及び消去をより細かい単位で実施可能となるため、モジュール単位での更新手法に比べ、フラッシュメモリの長寿命化が達成可能となる。
（５）更新での異常検知時や外部からの指示に基づく更新前プログラムへの動的ロールバックが可能か判定可能で、可能な場合、動的ロールバックが実施可能となる。
【００３５】
＜実施の形態１＞
まず、本実施の形態における前提を説明する。本実施の形態では、ある一定以上の品質が要求されるプログラムを対象として成されたものであり、ISO26262 ASIL-AまたはIEC61508 SIL1相当のMISRA-C規約相当を満たすプログラム記述などを対象とする。具体的には本実施の形態が対象とするプログラム記述は、言語の指定は特にないが、到達不能変数や未使用変数が記述に含まれず、静的コード解析で下記が可能であると仮定する。下記が満たされる場合、プログラムから到達不能変数や未使用変数を自動で削除可能となるため、本実施の形態が対象とするプログラムは下記条件のみを満たせば良い事となる。
（１）関数間の依存関係を表すCall Graphが構築可能
（２）データフローグラフが構築可能
（３）制御フローグラフが構築可能
（４）再帰記述は繰返し記述に変換可能
（５）構造化されており、ソースコードレベルでのジャンプ記述は非存在
以下、再帰記述は全て繰返し処理記述に変換されているものとする。また、大域変数は用いられていないものとする。
【００３６】
また、動的プログラム更新での差分プログラムや更新プログラムのプログラムメモリへの動的配置を、プログラム実行を行うプロセッサが実施する場合は、下記を必ず実施するものとする。
（１）動的配置前のプロセッサレジスタの値を退避し、切り替え直前にプロセッサレジスタ値を復旧すること
（２）差分プログラムや更新プログラムをプログラムメモリへ格納する際に使用するメモリ領域は、（１）同様、退避及び復旧を行うか、プログラム実行領域と異なる領域を利用し、動的配置がプログラム実行に影響しないよう管理すること
【００３７】
また、本システムの適用対象分野は、リアルタイムシステム、特にハードリアルタイムシステムである。特に、プロセッサ上のサービスとして、タスクディスパッチャを最低限具備しているものとする。また、動的プログラム更新適用対象組込み機器は、非特許文献３又は４のような、プログラム配置機構とプログラム更新機構を具備しているものとする。動的プログラム変更手続きの一例としては、タスクディスパッチャがタスクの実行状況を確認する事で後述する切り替えタイミング条件を満たすか判定し、更新があるか否かを表すレジスタ値などフラグ値をポーリングし、更新がある場合に動的プログラム更新を実施する、といった手続きが挙げられる。ここで、判定やポーリング、切り替え処理はタスクディスパッチャからの割込みにより起動された割込みハンドラで実施しても良い。
【００３８】
続いて本実施の形態の構成について説明する。
本実施の形態は、更新前プログラムと更新後プログラム、及びユーザ指定更新可能変数情報を受け付け、動的更新可能かの十分条件判定を実施し、判定結果を返す手段及びシステムである。当該手段又はシステムは差分プログラムを生成しても良い。本実施の形態１にかかるシステム構成を図２に示す。また、組込み機器での動的プログラム更新を、プロセッサ上の全タスクが実行を完了し、全てアイドル状態となったときのみに実施する手段を含む。
【００３９】
動的更新可能かの十分条件は下記の通りである。
条件１. Pにおける有効なプログラム実行トレースを、有効なプログラム実行トレースとしてP'が全て含む。
条件２. プロセッサレジスタ以外のI/Oを含むレジスタなど変数が{V2−dep(V2, V1)}∪Λに含まれる場合、それら変数のプログラム更新での値設定を許可する。
【００４０】
ここで、各記号の意味は下記の通りである。
P ：更新前プログラム
P'：更新後プログラム
Var(P) ：Pで使用される全変数の集合
Var(P')：P'で使用される全変数の集合
V1＝Var(P)∩Var(P')
：PとP'の全共通変数の集合
V2＝Var(P')−V1
：P'で使用される全変数の集合からPとP'の全共通変数を除
いた変数の集合
dep(V2, V1)
：P'においてV1に含まれる変数を用いて定義されており、V1に含まれる変数の定義で参照されている、V2に含まれる変数の集合
Λ＝{ユーザ指定更新可能変数}∪{固定定数変数}
：ユーザが指定した更新可能変数、及び固定定数変数を加えた変数の集合
【００４１】
ユーザ指定更新可能変数は、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。
固定定数変数は、大域変数が存在しないとの前提から関数内で宣言されており、プログラム実行での変更がない定数変数の事である。例えば、フィルタ処理での固定フィルタ定数係数などが該当する。
【００４２】
条件１からP'の動きをPで一部模倣可能であり、条件２から更新可能変数がP'のみで新たに導入された変数とユーザが更新を許可した変数に制限されており、組込み機器での動的プログラム更新をプロセッサ上の全タスクがアイドル状態となったとき、即ち変数更新がプログラム更新に影響を与えないタイミングで行う。これらの事から、非特許文献１の議論により、動的更新可能条件である「プログラム実行途中でプログラムの更新を実施した後、有限回のステップ実行で、更新プログラムを初期状態から実行して到達可能な状態へ必ず到達する事」が満たされる事が解る。
【００４３】
また、更新条件から、プログラムコンテキストのトレースが不要である事が解り、実行時オーバーヘッドが、トレース実施が前提の従来手法より大きく低減されている事が解る。
【００４４】
更新前プログラムと更新後プログラムを対象とした条件２の確認実施は、それぞれのプログラムに未使用変数や到達不能コードが事前に削除されており、存在しない前提から、一般的なデータフロー解析で実現可能である。
【００４５】
更新前プログラムと更新後プログラムを対象とした条件１の確認実施は、非特許文献１では直接述べられていない。特に修正前後の２つのプログラムで動的切り替えが可能なプログラム・ポイント導出手法に基づく手法を提案出来たとしても、前記プログラム・ポイント導出が記述の意味ではなく文法に基づく方法である。そのため、更新後プログラムで更新前プログラムの意味を変更する事なくコード移動を行うなどのコード最適化を行った場合は、適切なプログラム・ポイントの導出が出来ないという問題がある。即ち、条件１の確認実施は自明でない。本確認手段は、本実施の形態において明らかとされる。
【００４６】
（１．システム構成）
図２に本実施の形態１にかかるシステム構成を示す。判定装置１０４は、更新前プログラム１０１、更新後プログラム１０２、及びユーザ指定更新可能変数１０３を入力し、動的更新可能かの十分判定処理を行い、判定結果１０６及び差分プログラム１０５を出力する。ここで、ユーザ指定更新可能変数１０３は、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。ユーザ指定更新可能変数１０３は、例えば、設定済みのペリフェラルＩ／Ｏレジスタである。ユーザは、当該レジスタ値の動的更新がプログラム全体の動作に対して影響しない場合に、当該レジスタに対応する変数をユーザ指定更新可能変数１０３に指定する。尚、更新前プログラム１０１は、第１のプログラムの一例であり、更新後プログラム１０２は、第２のプログラムの一例である。
【００４７】
判定装置１０４は、差分コード生成部１０４１と、論理式導出部１０４２と、判定部１０４３とを備える。差分コード生成部１０４１は、更新前プログラム１０１のうち更新後プログラム１０２と異なるコード片の集合を示す第１の差分コードを生成する。また、差分コード生成部１０４１は、更新後プログラム１０２のうち更新前プログラム１０１と異なるコード片の集合を示す第２の差分コードを生成する。論理式導出部１０４２は、第１の差分コードから所定の変換により第１の論理式を導出する。また、論理式導出部１０４２は、第２の差分コードから所定の変換により第２の論理式を導出する。判定部１０４３は、第２の論理式が第１の論理式を含むか否かにより、上述した組込み機器における更新前プログラム１０１から更新後プログラム１０２への動的更新の可否を判定し、判定結果１０６及び差分プログラム１０５を出力する。尚、差分プログラム１０５は、少なくとも第２の差分コードを含み、第１の差分コードを含めても良い。
【００４８】
本実施の形態にかかる組込み機器での動的プログラム更新は、プロセッサ上の全タスクが、アイドル状態となったときに、組込み機器が具備するプログラム切り替え機構を用いて実施する。例えば、動的プログラム配置をプログラム実行中に実施し、プロセッサ上で動作するタスクディスパッチャが、全タスクがアイドル状態となった事を確認し、更新要求を格納するレジスタ値をポーリング読出し、更新要求有無を確認、要求があると確認出来た場合に、更新前プログラムに対して、更新部分に対応する差分コードのみを実行するよう制御するためのアドレス変換器をイネーブルする事で実現される。
【００４９】
（２．条件1の判定手続き概要）
更新前プログラムと更新後プログラム全体で条件１を満たすか否かの判定は、プログラム記述へ課した仮定から計算可能であるが、現実的な時間で処理を終える事は一般に困難であると考えられる。そこで、下記２つの重要な性質に着目する。
性質１. ２つのプログラムで異なっているのは差分コード部のみ
性質２. プログラムは実行順に関して自然な半順序を持つ
性質２から、更新前後で差異がある部分が条件１を満たすか否かの判定処理実行順を、図３の更新前の差異部間のグラフ構造３０１と更新後の差異部のグラフ構造３０２に示すように、トポロジカルソートを行う事で定義可能である。従って、以下のような記号定義が矛盾なく実施可能となる。
orig i：更新前後で差異が生じる更新前プログラムのi番目の差異部
update i：更新前後で差異が生じる更新後プログラムのi番目の差異部
【数１】
2018049506.tif 000003
・・・（１）
：orig iとupdate iで条件１が満たされる
【００５０】
これと性質２より、例えば式（１）が満たされている場合、更新前プログラムの先頭からorig 2直前に至るまでの全プログラムパスと、更新後プログラムの先頭からupdate 2直前に至るまでの全プログラムパスとで条件１が満たされることが解る。任意に一つ選んだkに対して、k番目まで以下の式（２）が成り立っているとする。
【数２】
2018049506.tif 000004
・・・（２）
この場合、再び性質１と２とから、更新前プログラムの先頭からorig k+1直前に至るまでの全プログラムパスと、更新後プログラムの先頭からupdate k+1直前に至るまでの全プログラムパスとで条件１が満たされる。ここで、kは任意であったため、全ての差異部で条件１が満たされれば、更新前後でプログラムが条件１を満たす事となる。従って、各kに対して、式（２）が成立している事を示せば良い。残る問題は、orig k、update kの構築手法と、式（２）の判定手法である。
【００５１】
図４にorig k、update kの構築手法を示す。先ずPとP'で固定定数変数値が異なっていた場合、P'の値をPでの値に修正する。
Var(orig k)  ：orig kに含まれる変数全体の集合
Var(update k)：update kに含まれる変数全体の集合
を求め、各変数のDef-use解析を更新前プログラム、更新後プログラム夫々で実施し、
InVar(orig k)
：P−orig kでdefされた後、orig kでuseされている変数
OutVar(orig k)
：orig kでdefされた後、P−orig kでuseされている変数
InVar(update k)
：P’−update kでdefされた後、update kでuseされている変数
OutVar(update k)
：update kでdefされた後、P’−update kでuseされている変数
を求める。ここで、
P−orig k   ：更新前プログラムPからorig kを除いたプログラム
P'−update k：更新後プログラムP'からupdate kを除いたプログラム
である。尚、def-use解析に関しては非特許文献５に開示されている。
【００５２】
続いて、以下の定義で参照されるＶ３に含まれる変数の集合として、名前の異なる変数を求める。
Δorig k＝Var(orig k)−Var(update k)−(Var(P)−(Λ∪V1)−dep(V3, V1))
Δupdate k＝Var(update k)−Var(orig k)−(Var(P')−(Λ∪V1)−dep(V2, V1))
V3＝Var(P)−V1
：Pで使用される全変数の集合からPとP'の全共通変数を除いた変数の集合
dep(V3, V1)
：PにおいてV1に含まれる変数を用いて定義されており、V1に含まれる変数の定義で参照されている、V3に含まれる変数の集合
【００５３】
そして、下記の集合を求める。
LastDefStmt(Δorig k)
：各Δorig kの変数に対する、P−orig kでdefされた後、orig kでuseされている変数への代入文であって、P−org kでorig kに至る前に最も最後に代入実行されている代入文の集合
FirstUseStmt(Δorig k)
：各Δorig kの変数に対する、orig kでdefされた後、P−orig kでuseされている変数を参照する文であって、orig k以降のP−orig k内最初の文の集合
LastDefStmt(Δupdate k)
：各Δorig kの変数に対する、P−update kでdefされた後、update kでuseされている変数への代入文であって、P−org kでupdate kに至る前に最も最後に代入実行されている代入文の集合
FirstUseStmt(Δupdate k)
：各Δorig kの変数に対する、update kでdefされた後、P−update kでuseされている変数を参照する文であって、update k以降のP−update k内最初の文の集合
【００５４】
そして、下記の処理を実施する。
１）LastDefStmt(Δorig k)≠φなら、LastDefStmt(Δorig k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びHyperBlock集合からorig kに至るプログラムパスをorig kに加えたものを、新たにorig kとする。ここで、これらorig kに加えたコードの中で元々のorig kに到達しないコードを削除しても良い。
２）FirstUseStmt(Δorig k)≠φなら、FirstUseStmt(Δorig k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びorig kからHyperBlock集合に至るプログラムパスをorig kに加えたものを、新たにorig kとする。ここで、これらorig kに加えたコードの中で求めたHyperBlock集合に到達しないコードとorig k内の変数からのデータ依存関係のないHyperBlock集合内のコードを削除しても良い。
３）LastDefStmt(Δupdate k)≠φなら、LastDefStmt(Δupdate k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びHyperBlock集合からupdate kに至るプログラムパスをupdate kに加えたものを、新たにupdate kとする。ここで、これらupdate kに加えたコードの中で元々のupdate kに到達しないコードを削除しても良い。
４）FirstUseStmt(Δupdate k)≠φなら、FirstUseStmt(Δupdate k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びupdate kからHyperBlock集合に至るプログラムパスをupdate kに加えたものを、新たにupdate kとする。update kとする。ここで、これらupdate kに加えたコードの中で求めたHyperBlock集合に到達しないコードorig k内の変数からのデータ依存関係のないHyperBlock集合内のコードを削除しても良い。
ここで、orig k＝φの場合は、P'で構築したLastDefStmt(Δupdate k)とFirstUseStmt(Δupdate k)に対応するP内の文を識別し、P上で上記３）と４）を実施し得られたHyperBlockをorig kとする。
【００５５】
尚、Basic BlockやHyperBlockに関しては、非特許文献６に開示されている。
【００５６】
そして、得られたorig kとupdate k夫々からユーザ指定更新可能変数の定義文や参照文を全て削除する。
【００５７】
最後に、update kに、{V2−dep(V2, V1)}∪Λの元に該当する変数が含まれている場合は、当該変数集合をUV(update k)として識別する。UV(update k)に含まれる変数は、式（２）の判定にて、任意の値をとる変数として解釈する。
【００５８】
一方で、orig kに、V2−dep(V3, V1)の元に該当する変数が含まれる場合、当該変数はupdate kに存在せずorig kにのみ存在する変数となる。P、P'ともに未使用変数や到達不能変数が存在しないという仮定から、update kではorig kから当該変数への代入や参照などの文が削除されている事となる。それ故、式（２）は不成立となり、条件１は満たされない、と判断される。
【００５９】
各kでの式（２）の判定は、両方ともに非決定分岐を含まず、非決定分岐が含まれない場合トレース関係・等価性と模倣関係・双模倣等価性が一致するため、模倣(Simulation))の判定問題に帰着する事で実施する。特に双模倣(Bisimulation)判定を実施して一致が確認できた場合、orig k ＝ update k、即ちorig kとupdate kは文法的に異なるが意味が同一な差分コードである事が示される。動作実行サイクル数のみが修正されていると解釈できる。
【００６０】
尚、模倣や双模倣に関しては、非特許文献７に開示されている。
【００６１】
（３．動的更新可能十分条件判定全体フロー）
図５に、動的更新可能かの十分条件判定処理の全体フローの一例を示す。
（１）Ｓ１で、差分コード生成部１０４１は、V2−dep(V3,V1)＝φか否か判定し、不成立の場合、条件１を満たさないとして判定処理を終了する。成立した場合、差分コード生成部１０４１は、更新前プログラムと更新後プログラムの差分部の対応を取り、{(orig k, update k)|0<=k<=N}を作成する。ここで、Nは差分があった箇所の総数である。差分部の対応は、ＵＮＩＸ（登録商標）コマンドvimdiffでの出力と同様に図６に示す形で得られるものとする。図６では、更新前プログラム６０１と更新後プログラム６０２が与えられており、一致箇所と変更箇所の対応が示されている。例えば、左辺変数が一致しているが、右辺が異なる場合や、分岐文で条件判定式が一部変更されている場合などで、変更前１と変更後１のような対応関係が得られ、加えて文の追加が行われている場合などで、変更前２と変更後２のような対応関係が得られる。図示していないが、文の削除を伴う場合でも、変更前後の関係が得られる。
【００６２】
（２）Ｓ２で、論理式導出部１０４２は、各kに対して、orig k、update k夫々のコードの簡約化を実施する。コードのループ記述が含まれないものに関しては、Ｓ３をスキップして、Ｓ４へ処理を移行する。
（３）Ｓ３で、論理式導出部１０４２は、各kに対して、簡約化後のorig k、update k夫々のコードから拡張有限状態機(ＥＦＳＭ：Extended Finite State Machine)を構築する。
（４）Ｓ４で、コードがループ記述を含む場合、論理式導出部１０４２は、各kに対して、orig k、update k夫々から構築したＥＦＳＭからＳＭＴ(Satisfiability Modulo Theories)式への変換を実施する。尚、ループ記述を含まない場合、論理式導出部１０４２は、Ｓ２で簡約化されたコードから直接、ＳＭＴ式への変換を実施する。尚、Ｓ２、Ｓ３及びＳ４は、所定の変換の一例である。
（５）Ｓ５で、判定部１０４３は、各kに対して、orig k、update k夫々から構成したＳＭＴ式を用いて模倣判定を実施する。
【００６３】
（４．関数階層を考慮した差分コード生成処理）
図７に関数階層を考慮した差分コード生成処理フローの一例を示す。
（１）Ｓ１−１で、差分コード生成部１０４１は、関数の呼び出し関係をグラフ表現したコールグラフを対象として、更新前後での差分情報を取得する。
（２）Ｓ１−２で、差分コード生成部１０４１は、固定定数変数データの差分を生成する。
（３）更新前後での差異が現れる関数は一般に複数存在し得るため、その数に対して上限Nがある場合、Ｓ１−３で、差分コード生成部１０４１は、差異のある関数の数がNを越えるか否か判定する。差異のある関数の数がNを超える場合は、Ｓ１−４で、差分コード生成部１０４１は、対象となる関数の配置アドレスを考慮しつつ関数の数がN以下となるよう関数のマージを実施する。例えば、アドレスが連続になるように関数を連結する。差異のある関数の数がNを越えない場合、処理をＳ１−５へ移行する。上限Nがない場合は、処理せずＳ１−５へ処理を移行する。
【００６４】
（４）Ｓ１−５で、差分コード生成部１０４１は、更新前後の対応付けが成された各関数でのＳＳＡ(静的単一代入形式、Single Static Assignment  Form)での差分コードの対応関係{orig k, update k}の抽出を実施する。
（５）更新前後での差異が現れるコード塊(以下、差分コード片)は一般に複数存在し得るため、その数に対して上限Nがある場合、Ｓ１−６で、差分コード生成部１０４１は、関数内での差分コード片のマージ処理を実施する。尚、図７の右下にＳ１−６により解かれる最適化問題を示す。但し、Ｓ１−６の詳細は後述する。上限Nがない場合は、処理せずＳ１−７へ処理を移行する。
（６）Ｓ１−７で、差分コード生成部１０４１は、差分ＳＳＡを用いた差分オブジェクトコードを生成する。
【００６５】
（７）Ｓ１−８で、差分コード生成部１０４１は、上記組込み機器での差分オブジェクトコードに修正するためのリロケータブルなオブジェクトコードを生成する。上記組込み機器が具備するプログラム更新機構を用いない場合は、本ステップをスキップする。
【００６６】
ここで、上記組込み機器が具備するプログラム更新機構における更新後のプログラムの実行手順について説明する。図２９は、更新後のプログラム実行手順例を説明する模式図である。ここでは、プログラムＲＯＭ４０７の第１の面に、更新前プログラムオブジェクトコードが配置され、プログラムＲＯＭ４０７の第２の面に、更新差分プログラムオブジェクトコードの一部が配置されている場合を考える。ここで、第２の面に配置されているコードブロック８００は、更新前プログラムオブジェクトコードの一部であるコードブロック８０１に対応しているものとする。ＣＰＵ４０１によるプログラム実行の際、アドレス変換器４０２によるアドレス変換を実施する事で、コードブロック８０１がコードブロック８００に置き換えられて実行される。このような方法により、更新後のプログラム実行を可能としている。以下、図２９での更新後プログラム実行例を示す。
【００６７】
まず、ＣＰＵ４０１のプログラムカウンタの値はＷである（図中（１）参照）。このとき、アドレス変換テーブルの変換元アドレスにＷが存在しないので、アドレス変換器４０２はＷを出力する（図中（２）参照）。続いて、ＣＰＵ４０１が、アドレスＷにある命令Ｊｕｍｐ Ｘを実行し、プログラムカウンタをＸに書き換える（図中（３）参照）。次に、ＣＰＵはアドレスＸにある命令を読み出そうとするが（図中（４）参照）、Ｘが変換元アドレスに一致したため（図中（５）参照）、アドレス変換器４０２はアドレスＹを出力する（図中（６）参照）。このため、ＣＰＵ４０１はアドレスＹから命令を読み出し、実行する（図中（７）参照）。その後、プログラムカウンタの値は、Ｘ＋１に変更され、アドレス変換器４０２によって、Ｘ＋１がＹ＋１に読み替えられ、アドレスＹ＋１にある命令が実行される。更新後コードブロック８００の末尾には命令Ｊｕｍｐ Ｚが配置されており、これをＣＰＵ４０１が実行する（図中（８）参照）。その後、ＣＰＵ４０１は、更新前プログラムのアドレスＺから実行を継続する（図中（９）参照）。
【００６８】
ここで、アドレス変換器４０２によるアドレス変換の詳細を説明する。アドレス変換器４０２は、具体的には、ＣＰＵ４０１により命令がデコードされることによって取得されたアドレスにおける予め定められたビット数の上位ビット列（以下、上位アドレスと称されうる）を変更し、かつ、変更された上位ビット列とアドレスの下位ビット列（以下、下位アドレスと称されうる）とを連結することにより、アドレスの変換を実現する。すなわち、アドレス変換器４０２は、入力された上位アドレスが、アドレス変換テーブルに登録された変換元アドレスに一致するか否か判定し、一致した場合、当該上位アドレスを変換先アドレスに置換し、変換した上位アドレスに下位アドレスを連接して出力する。このように、アドレス変換器４０２は、上位アドレスのビット数を一つのセグメントとして、アドレス変換を行う。これにより、アドレスの全ビットを変換対象とする場合に比べ、アドレス変換テーブルの大きさを小さくすることができる。図３０は、アドレス変換器４０２によるアドレス変換の詳細を説明する模式図である。ここでは、アドレスのビット数が３２ビットであるとし、アドレス変換器４０２に設定されるセグメントサイズが２Ｓバイトであるとする。この場合、例えば最大ｋ個の変換が記されるアドレス変換テーブルには、変換元のアドレスとしての（３２−ｓ）ビットの上位アドレスと、変換先のアドレスとしての（３２−ｓ）ビットの上位アドレスとの対が格納されている。アドレス変換器４０２は、比較器４３０により、変換前アドレスの上位アドレスが、アドレス変換テーブルに示される変換元のアドレスと一致するか否かを判定する。セレクタ４３１は、一致する場合、アドレス変換テーブルに示される変換先のアドレスを出力し、一致しない場合、変換前アドレスの上位アドレスを出力する。その後、連結器４３２が、セレクタ４３１が出力した（３２−ｓ）ビットの上位アドレスと、ｓビットの変換前アドレスの下位アドレスを連結し、変換後アドレスを生成する。
【００６９】
尚、プログラム実行中の動的差分コード配置では、２面以上の物理的メモリ面配置が必要となるが、アドレス変換器の切り替えによるプログラム更新のみを動的に実行する対象とする場合は、その必要はなく、更新前プログラム、差分コード、アドレス変換器設定が成されていれば、(十分条件を満たす限りにおいて)動的なプログラム更新のデバイスでの実行が可能となる。それ故、本明細書では、より条件の緩い、メモリは１面以上配置されている、としている。
【００７０】
図７に戻り説明を続ける。
（８）Ｓ１−９で、差分コード生成部１０４１は、アドレス解決を行うためのリンカスクリプトを生成する。
（９）Ｓ１−１０で、差分コード生成部１０４１は、差分コード、それ以外のアドレス解決済みオブジェクトコード、及びリンカスクリプトを用いて、差分コードのオブジェクトコード（差分バイナリ）を生成する。
【００７１】
ここで、Ｓ１−１の具体的処理の説明に先立って、図８にコールグラフの例を示す。制御フローとデータフローの解析が可能であるとの仮定から、関数の呼び出し関係を表すコールグラフが構築可能であり、再帰呼び出しが存在しないとの仮定からコールグラフが必ずＤＡＧ(有効グラフ、Directed Acyclic Graph)になる事に注意する。更新前のコールグラフ例を５０１に、更新後のコールグラフ例を５０２に示す。ここで、f,g,h,i,jは関数名であり、f,g,h,iは関数名と型、及び引数の個数と夫々の型と並びが更新前後で完全に一致するものとする。ここで、それぞれから関数の集合を構成すると、
Org＝{f,g,h,i}
Upd＝{f,g,h,i,j}
となり、差分は
(Org−Upd)∪(Upd−Org)＝{j}
として得られる。一般に関数は、複数箇所から呼び出される傾向にあるため、５０１に含まれず５０２に含まれる関数ｊをInlineして扱うのは非効率であると考えられる。そのため、Inlineせずにコールグラフでの差分を識別する必要がある。この実現では、ＤＡＧ構造のコールグラフの葉ノードからＤＡＧの始点ノードに向かって、更新前コールグラフと更新後コールグラフの違いを識別する事が一つの方法となる。
【００７２】
図９にコールグラフの差分構築処理の概要を示す。更新前のコールグラフ例を５０４に、更新後のコールグラフ例を５０５に示す。ここで、f,g,h,i,j,kは関数名であり、f,h,i,jは関数名と型、及び引数の個数と夫々の型と並びが更新前後で完全に一致するものとする。それぞれから関数の集合を構成すると、
Org'＝{f,g,h,i,j}
Upd'＝{f,h,i,j,k}
となり、差分は
(Org'−Upd')∪(Upd'−Org')＝{g,k}
として得られる。関数を展開する事なく差分を識別する場合、差分として識別された関数を呼び出す関数も、前記呼び出しが少なくとも差分となるため、同時に識別する必要がある。更新前後それぞれのコールグラフのノードに対してトポロジカルソートを実施し、逆順に比較を実施しつつ差分関数ノードを識別し、コールグラフで差分関数への出力エッジを持つ関数ノードを更新で呼び出し関数が増加した関数としてマークしている例を５０６に示す。
【００７３】
図１０に、コールグラフでの差分関数と差分関数呼び出し関数の識別処理フローの一例を示す。ここで、
get_prev_node(Call Graph cg, node n)
を、コールグラフcgにおいて、cgのノードnへの出力エッジを持つcg上のノード全てを返す関数とする。
【００７４】
（１）Ｓ−１−１で、差分コード生成部１０４１は、Oldを更新前プログラムのコールグラフ、Newを更新後プログラムのコールグラフとして初期化する。
（２）Ｓ１−１−２で、差分コード生成部１０４１は、Oldをトポロジカルソートして逆順の順番ラベルをOldの各ノードに与えたものをtp_sort_old_func、Newをトポロジカルソートして逆順の順番ラベルをNewの各ノードに与えたものをtp_sort_new_func、とする。
（３）Ｓ１−１−３で、差分コード生成部１０４１は、順番を付けたコールグラフ間のノードの差集合を下記で算出する。
diff_func1
＝tp_sort_old_funcの全ノード − tp_sort_new_funcの全ノード
diff_func2
＝tp_sort_new_funcの全ノード − tp_sort_old_funcの全ノード
【００７５】
（４）Ｓ１−１−４で、差分コード生成部１０４１は、集合C1をφ(空集合)として初期化する。
（５）Ｓ１−１−５で、差分コード生成部１０４１は、diff_func1に含まれるノードを取り出し、全ノードが取り出されるまで順次Ｓ１−１−６を実施する。ここで、取り出したノードをoとして表す。
（６）Ｓ１−１−６で、差分コード生成部１０４１は、下記演算を行う事で差分関数呼び出し関数を識別する。
C1 := C1 ∪ {get_prev_node(Old,o)}
【００７６】
（７）Ｓ１−１−７で、差分コード生成部１０４１は、集合C2をφ(空集合)として初期化する。
（８）Ｓ１−１−８で、差分コード生成部１０４１は、diff_func2に含まれるノードを取り出し、全ノードが取り出されるまで順次Ｓ１−１−９を実施。ここで、取り出したノードをnとして表す。
（９）Ｓ１−１−９で、差分コード生成部１０４１は、下記演算を行う事で差分関数呼び出し関数を識別する。
C2 := C2 ∪ {get_prev_node(New,o)}
（１０）Ｓ１−１−１０で、差分コード生成部１０４１は、C1、C2、diff_func2を処理結果として返し、処理を終了する。
【００７７】
ここで、組み込み機器における「アドレス変換による差分コードの実行方式」について以下に説明する。
まず、更新前プログラムと差分プログラムの間のプログラム実行遷移について説明する。図３１は、更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。ここではメモリ空間Ａに更新前プログラムのオブジェクトコードが配置されている。メモリ空間Ａにおいて、Ｃｏｎｓｔ変数及び列挙型値などのテキストセグメントに配置される定数変数とその値がメモリ領域８０２に、関数ｆがメモリ領域８０３に、関数ｇがメモリ領域８０４に、関数ｈがメモリ領域８０５に、初期値付き変数がメモリ領域８０６に、初期値なし変数がメモリ領域８０７に、スタックなどをメモリ領域８０８に配置した例を示している。またメモリ空間Ｂに、更新差分プログラムのオブジェクトコードが配置されている。パッチ８０９は、関数ｆの一部に対応する更新差分プログラムオブジェクトコード、パッチ８１０は、関数ｇの一部に対応する更新差分プログラムオブジェクトコード、パッチ８１１は、関数ｈの一部に対応する更新差分プログラムオブジェクトコード、に夫々対応しているものとする。図３１に記載のコード間のプログラム実行遷移例を以下に示す。
【００７８】
まず、ＣＰＵ４０１による関数ｆの実行中に、アドレス変換により、パッチ８０９の先頭アドレスにプログラムの実行が遷移する。パッチ８０９における関数ｇの実行では、メモリ空間Ａに配置された関数ｇの先頭アドレスが呼び出される。関数ｇの呼び出し完了後は、パッチ８０９の関数ｇの呼び出し位置の次のアドレスにプログラムの実行が遷移し、パッチ８０９の残りのプログラムの実行がなされる。そして、パッチ８０９の実行完了後に戻るべき関数ｆのアドレスへと、プログラムの実行が遷移する。次に、ＣＰＵ４０１による関数ｇ実行中に、アドレス変換により、パッチ８１０の先頭アドレスにプログラムの実行が遷移する。パッチ８１０における関数ｈの実行では、メモリ空間Ａに配置された関数ｈの先頭アドレスが呼び出される。関数ｈの呼び出し完了後は、パッチ８１０の関数ｈの呼び出し位置の次のアドレスに、プログラムの実行が遷移し、パッチ８１０の残りのプログラムの実行がなされる。そして、パッチ８１０の実行完了後に戻るべき関数ｇのアドレスへと、プログラムの実行が遷移する。次に、ＣＰＵ４０１での関数ｈの実行中に、アドレス変換により、パッチ８１１の先頭アドレスにプログラムの実行が遷移する。そして、パッチ８１１の実行完了後に戻るべき関数ｈのアドレスへと、プログラムの実行が遷移する。その後、ＣＰＵ４０１は、関数ｈの実行を継続し、プログラムの実行を完了する。
【００７９】
次に、変換されたアドレスと差分コードの対応例について図３２〜図３５を参照しながら説明する。図３２は、変換されたアドレスと差分コードの対応例を示す模式図である。ここでは、置換対象コード８１２を差分コード８１３で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図３２に示す例は、差分コードサイズｔが置換対象コードのサイズｓと同じ、又は置換対象コードのサイズｓより小さい場合であって、ｓとｔがプログラム用アドレス変換器４０２Ａに設定されるセグメントサイズ以下の場合の例である。置換対象コード８１２の先頭アドレスにＣＰＵ４０１によるプログラム実行が到達すると、プログラム用アドレス変換器４０２Ａにより、プログラムカウンタに設定されたアドレスが、差分コード８１３の先頭アドレスに変換され、プログラム遷移が実施される。プログラム用アドレス変換器４０２Ａが順次、変換前アドレスを差分コード８１３のアドレスに変換しつつ、差分コード８１３の終了アドレスまでプログラム実行が継続される。差分コード８１３の終了アドレスには、置換対象コード８１２の終了アドレスの次のアドレスへのＪＵＭＰ(ジャンプ)命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
【００８０】
図３３は、変換されたアドレスと差分コードの別の対応例を示す模式図である。ここでは、置換対象コード８１４を差分コード８１５で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図３３に示す例は、差分コードサイズｔが置換対象コードのサイズｓより大きい場合か、またはｓとｔの何れかがプログラム用アドレス変換器４０２Ａに設定されるセグメントサイズより大きい場合に対応している。置換対象コード８１４の先頭アドレスにＣＰＵ４０１によるプログラム実行が到達すると、プログラム用アドレス変換器４０２Ａにより、プログラムカウンタに設定されたアドレスが、差分コード８１５の先頭アドレスに変換され、プログラム遷移が実施される。差分コード８１５の先頭には、更新差分プログラムの開始アドレスへのジャンプ命令に関わる命令が配置されている。ここで、ジャンプ命令に関わる命令には、ジャンプを実施するオブジェクトコードが含まれるが、必要に応じて、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコード、及びジャンプ先のアドレス計算を実施するオブジェクトコードが含まれてもよい。なお、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコードは、次のような理由により必要となる場合がある。ジャンプ命令のジャンプ先アドレスの計算を行う命令の挿入が一般には必要となるが、ジャンプ命令のためのアドレス計算に必要となる命令列とジャンプ命令は、更新差分バイナリ生成時に挿入されるものであり、更新差分バイナリを生成するための更新プログラムには元々存在しない命令列である。つまり、この命令列は、更新プログラムを実行した場合には本来現れない命令列である。従って、これら命令列の実行は、本来あるべきＣＰＵレジスタ状態と異なるＣＰＵレジスタ状態を構成し得る。それ故、これら命令列の実行前のＣＰＵのレジスタ状態をレジスタ退避により保持し、実行後にレジスタ復旧する事で、これら命令列のＣＰＵレジスタ状態への影響が排除される。ここで、ジャンプ先のアドレスは、例えば、ジャンプ命令に関わる命令列のオブジェクトコードが完了するアドレスの次のアドレスである。これにより、ジャンプ命令によるプログラム遷移後、ＣＰＵ４０１は、差分コード８１５の終了アドレスまでプログラム実行を継続する。差分コード８１５の終了アドレスには、置換対象コード８１４の終了アドレスの次のアドレスへのジャンプ命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
【００８１】
このように、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合、アドレス変換器４０２は、次のようなアドレス変換を行う。すなわち、アドレス変換器４０２は、置換対象部分のコードの開始アドレスを、置換対象部分のコードに代わる命令列の開始アドレスへのジャンプ命令に関わる命令が記憶されたアドレスへと変換する。このようにすれば、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合であっても、適切に更新後のプログラムの実行を実現することが可能となる。
【００８２】
次に、変数についての更新がある場合の例について図３４及び図３５を参照して説明する。図３４は、変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、更新に伴い、Ｃｏｎｓｔ変数や列挙型値などテキストセグメントに配置される定数変数の追加、定数変数の変更、又は初期値付き変数の追加があり、これら変数に差分コードのみからアクセスされる例に対応している。変数の追加又は変更があった部分は元々メモリ空間Ａに配置されている変数ではなく、メモリ空間Ｂに配置した変数を参照しつつ、図３２又は図３３の実行方法に従ってプログラム実行が行われる。これら変数は差分コードが配置されるメモリ空間Ｂに新たに差分コードの一部として配置され、差分コード実行時には、追加又は変更があった部分に関しては、元々メモリ空間Ａに配置されている変数ではなく、メモリ空間Ｂの変数が参照されてプログラムが実行される事で、変数の値更新が実現される。
【００８３】
図３５は、変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、大域変数である初期値付き変数又は局所変数である初期値付き変数の初期値の変更があるとき、又は更新前コードから参照される初期値付き変数の追加があるときの例に対応している。これら変更又は追加があった部分はメモリ空間Ｂに新たに配置した変数群をアドレス変換機構を援用して参照しつつ、図３２又は図３３の実行方法に従ってプログラム実行が行われる。初期値変更又は、初期値付き変数の追加があった部分に関しては、メモリ空間Ａに配置されている変数であって変更又は追加の影響を受ける変数群に対して、追加される変数群又は変更後の変数群を、差分コードが配置されているメモリ空間Ｂに新たに配置し、差分コード実行時には、アドレス変換機構を用いてこれら変数を参照し実行する事で、追加又は変更を伴うプログラム実行が実現される。特に、局所変数の場合は、メモリ空間Ｂ上に配置された変数へのアクセスを実施するのに対し、大域変数の場合は、メモリ空間Ｂに配置された変数がリブート後にデータセグメント(データセグメントがＳＲＡＭ４０６に割り当てられている場合はＳＲＡＭ４０６、データＲＯＭ４０８に割り当てられている場合はデータＲＯＭ４０８)に展開された後、初期値付き変数の追加又は変更を伴うプログラム実行がなされる。上記において、メモリ空間Aとメモリ空間Bは、同一メモリ空間に配置されていて、開始先頭アドレスが異なっていさえすれば良い。
【００８４】
図１１、図１２、図１３に、固定定数変数の差分生成処理フローの一例を示す。尚、ここでは、アドレス変換による差分コードの実行方式を前提とした場合の差分生成フローの一例を示す。アドレス変換方式ではない、差分コードと更新前プログラムから更新後プログラムを構築する従来手法の場合、本処理は不要とであるため、スキップすれば良い。
（１）Ｓ１−２−１で、差分コード生成部１０４１は、更新前プログラムと更新後プログラムの両方で用いられている関数からなる、同じ順番で並べたリストを下記演算で構成する。
new_func 
＝ tp_sort_new_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func2
old_func
＝ tp_sort_old_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func1
（２）Ｓ１−２−２で、差分コード生成部１０４１は、集合Lをφ(空集合)として初期化する。
（３）Ｓ１−２−３で、差分コード生成部１０４１は、new_funcに含まれるノードを取り出し、全ノードが取り出されるまで順次Ｓ１−２−４からＳ１−２−８を実施する。ここで、取り出したノードをf_newとして表す。
【００８５】
（４）Ｓ１−２−４で、差分コード生成部１０４１は、f_newと対応する、old_funcの元f_oldを取り出す。
（５）Ｓ１−２−５で、差分コード生成部１０４１は、f_newにテキストセグメントが含まれるか確認し、含まれる場合、Ｓ１−２−６へ処理を移行し、そうでない場合、(3)での繰返し処理を１つ進めて継続する。
（６）Ｓ１−２−６で、差分コード生成部１０４１は、f_oldにテキストセグメントが含まれるか確認する。f_oldにテキストセグメントが含まれる場合、Ｓ１−２−７へ処理を移行する。f_oldにテキストセグメントが含まれない場合、Ｓ１−２−８へ処理を移行する。
【００８６】
（７）Ｓ１−２−７で、差分コード生成部１０４１は、f_oldのテキストセグメントの先頭アドレスを求めて、head_adderとする。差分コード生成部１０４１は、f_newの先頭アドレスも同じhead_adderとする。f_oldのセグメントサイズをsize_oとして、最終アドレスを
last_addr_o＝head_adder＋size_o
として算出する。同様に、差分コード生成部１０４１は、f_newのセグメントサイズをsize_nとして、最終アドレスを
last_addr_n＝head_adder＋size_o
として算出する。差分コード生成部１０４１は、集合Lを下記で更新する。
L ＝ L∪{(f_new,head_addr,size_n,last_addr_n),
(f_old,head_addr,size_o,last_addr_o)}
（８）Ｓ１−２−８で、差分コード生成部１０４１は、f_newのテキストセグメント、即ち固定定数変数を更新面に配置するものとして、具体的なアドレス決定は図７での処理Ｓ１−９で行うものとする。
（９）Ｓ１−２−９で、差分コード生成部１０４１は、Lをhead_addrをキーとしてソートし、それを新たにLとする
【００８７】
（１０）Ｓ１−２−１０で、差分コード生成部１０４１は、集合Mをφ(空集合)として初期化する。
（１１）Ｓ１−２−１１で、差分コード生成部１０４１は、リストLに含まれる連続したノード２つを取り出し、１個づつずらしながら順次２ノードを全て取り出すまで、順次Ｓ１−２−１２、Ｓ１−２−１３を繰返し実施する。ここで、取り出した２つのノードを{a,b}として表す。例えば、L＝{a,b,c,d}なら、順次実施される２ノードの取り出しでは{a,b}{b,c}{c,d}となる。
（１２）Ｓ１−２−１２で、差分コード生成部１０４１は、aのテキストセグメントの最終アドレスと、その後段に配置されるべきbのテキストセグメントの先頭アドレスを以下の式（３）のブール式として比較する。
【数３】
2018049506.tif 000005
・・・（３）
結果が真ならＳ１−２−１３へ処理を移行する。結果が偽なら、（１１）での繰返し処理を継続する。
【００８８】
（１３）Ｓ１−２−１３で、差分コード生成部１０４１は、下記処理を実施し、bのテキストセグメントの先頭アドレス、終了アドレス、集合Lと集合Mの更新を実施する。
offset ＝ last_addr(a,f_new)-head_addr(b,f_new)
L ＝ L − {b}
b_new ＝ b + offset
L ＝ L + {b_new}
M ＝ M ∪ {b_new}
ここで、b_new ＝ b + offsetは、下記の略記である。
(f_new,head_addr_new,size,last_addr_new)
＝ (f_new,head_addr＋offset,size,last_addr＋offset)
（１４）Ｓ１−２−１４で、差分コード生成部１０４１は、結果得られた集合Mを返す。
（１５）Ｓ１−２−１５で、差分コード生成部１０４１は、集合Nをφ(空集合)として初期化する。
【００８９】
（１６）Ｓ１−２−１６で、差分コード生成部１０４１は、Lに含まれるノードを取り出し、全ノードが取り出されるまで順次Ｓ１−２−１７からＳ１−２−１９を実施する。ここで、取り出したノードをaとして表す。
（１７）Ｓ１−２−１７で、差分コード生成部１０４１は、更新前後で互いに対応する関数であるf_oldとf_newに対して、夫々含まれるテキストセグメントを比較して、f_oldのテキストセグメントがf_newのテキストセグメント先頭から完全一致する場合であって、夫々の終アドレスを
last_addr(a,f_old)  ＜ last_addr(a,f_new)
なるブール式として比較する。結果が真ならＳ１−２−１８へ処理を移行する。結果が偽なら、（１６）での繰返し処理を継続する。
（１８）Ｓ１−２−１８で、差分コード生成部１０４１は、a'として下記を算出する。
a’ ＝ last_addr(a,f_old) 〜 last_addr(a,f_new)
具体的には、差分コード生成部１０４１は、下記を算出する。
a' ＝(f_new, last_adder_o, size_n−size_o, last_adde_n)
ここで、f_oldのテキストセグメントが
(f_old, head_adder, size_o, last_adde_o)
f_newのテキストセグメントが
(f_new, head_adder, size_n, last_adde_n)
であるとする。
【００９０】
（１９）Ｓ１−２−１９で、差分コード生成部１０４１は、集合Nと集合Mを下記で更新する。
N ＝ N ∪  {a’}
M ＝ M − {a}
（２０）Ｓ１−２−２０で、差分コード生成部１０４１は、M∪Nを構築し、テキストが配置されていないアドレス空間を識別し、その空間移行に配置された各テキストセグメントの先頭アドレスと最終アドレスに当該空間のサイズをオフセットとして加える処理を、アドレスの若い順に、テキストが配置されていない空間に対して実施する。
【００９１】
図１４及び図１５に、各関数でのＳＳＡ形式を考慮したｄｉｆｆ形式、ｖｉｍｄｉｆｆ形式の差分コード対を構築するための処理フローの一例を示す。ここで、ｄｉｆｆ形式やｖｉｍｄｉｆｆ形式の結果の取得では、ＵＮＩＸ（登録商標）コマンドのdiffやvimdiffを用いても良い。
（１）Ｓ１−５−１で、差分コード生成部１０４１は、集合XとYをそれぞれφ(空集合)として初期化する。
（２）Ｓ１−５−２で、差分コード生成部１０４１は、リストnew_funcの各元f_newに対して、Ｓ１−５−３からＳ１−５−１２を繰り返し実施する。ここで、new_funcとold_funcは、図１１のＳ１−２−１で構成したリストである。具体的には、下記で構成したリストである。
new_func 
＝ tp_sort_new_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func2
old_func
＝ tp_sort_old_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func1
（３）Ｓ１−５−３で、差分コード生成部１０４１は、f_newと対応するold_funcの元f_oldを取り出す。
【００９２】
（４）Ｓ１−５−４で、差分コード生成部１０４１は、f_newとf_oldのアセンブリコードを下記で構成する。
f_new_asm 
＝ f_newのプログラム記述を、アドレス割当てやレジスタ割当てを 実施せずコンパイルして得られた、リロケータブルなアセンブリ記述
f_old_asm
＝ 組込み機器で動作中のオブジェクトコード内の関数f_oldに対応するアセンブリ記述
（５）Ｓ１−５−５で、差分コード生成部１０４１は、変数の区別を型の区別として抽象化してf_new_asm'、 f_old_asm'とし、f_new_asmとf_new_asm'、f_old_asmとf_old_asm'、各々での対応関係を保持する。この処理を＜１＞とする。
【００９３】
（６）Ｓ１−５−６で、差分コード生成部１０４１は、f_new_asm'、 f_old_asm'との差分を、最長パターンマッチのdiffアルゴリズムを用いて取得する。この処理を＜２＞とする。
【００９４】
（７）Ｓ１−５−７で、差分コード生成部１０４１は、一致箇所について、変数同士の干渉グラフから導出した制約を満たす範囲でf_old_asmの変数名と同一となるようにf_new_asm'への変数名割当てを実施する。その後、差分コード生成部１０４１は、レジスタ数が無限後存在するという仮定の下で、不一致箇所に異なる変数名の割当てを実施する。この処理を＜３＞とする。ここで、干渉グラフを用いた変数名割当て制約の導出に関しては、非特許文献５に開示されている。
（８）Ｓ１−５−８で、差分コード生成部１０４１は、f_new_asm'への対象組込み機器搭載プロセッサに搭載されているCPUレジスタ数を考慮したレジスタ割当てを実施する。
（９）Ｓ１−５−９で、差分コード生成部１０４１は、＜１＞、＜２＞及び＜３＞を再度実施する。但し、変数名割当て時は対象組込み機器搭載プロセッサに搭載されているＣＰＵレジスタ数を仮定する。必要に応じてスピルコードの挿入を実施し、差分が最小化されるようf_new_asmのアセンブリコードを生成する。
【００９５】
（１０）Ｓ１−５−１０で、差分コード生成部１０４１は、これまでの構成で識別しているf_new_asmとf_old_asmの差分コード情報を、
d ＝ {(差分コード,head_addr,size,last_addr)}
として格納する。
（１１）Ｓ１−５−１１で、差分コード生成部１０４１は、これまでの構成で識別しているf_new_asmとf_old_asmの差分情報を、ｖｉｍｄｉｆｆ形式で
Vimdiff(d)＝{((f_new,差分コード,head_addr,size_n,last_addr_n), (f_old,対応するコード,head_addr,size_o,last_addr_o))}
として格納する。
（１２）Ｓ１−５−１２で、差分コード生成部１０４１は、集合X、Yを次式で更新する。
X ＝ X∪{d}
Y ＝ Y∪{vimdiff(d)}
（１３）Ｓ１−５−１３で、差分コード生成部１０４１は、集合X、Yを処理結果として返し、処理を終了する。
【００９６】
図１６のフローチャートに、関数内での差分コード片のマージ処理の一例を示す。また、図１７は、関数内での差分コード片のマージ処理の概念を説明するための図である。
（１）Ｓ１−６−１で、差分コード生成部１０４１は、集合X、Yを図１４及び図１５のフローチャートの出力結果として、下記を満たすd1及びd2を選び、d' ＝ merge(d1, d2)とする。
【数４】
2018049506.tif 000006
・・・（４）
・ コード片d1とコード片d2は同一関数内
・ distance(d1, d2) が最小
・ (sizeof(d1)+sizeof(d2)) が最小
ここで、distance()、sizeof()、merge()は以下で定義される操作である。
distance(d1, d2)
：701に示すようにd1、d2間の一致箇所のコードサイズ
sizeof(d1)
：d1のコードサイズ
merge(d1, d2)
：701から702へのvimdiff結果の変更に示すように、d1とd2をd1、d2間の一致箇所を含めて結合する処理であり、結果として結合したコードを出力する。
【００９７】
（２）Ｓ１−６−２で、差分コード生成部１０４１は、集合X、Yを下記で更新する。
X ＝ X − d1 − d2 ＋ d’
Y ＝ Y − vimdiff ＋ vimdiff’
ここで、vimdiff'は７０２に示すように、変更後のd1,d2結合だけでなくd1,d2に対応する変更前コード(それぞれを、pd1,pd2とする)に対してmerge(pd1,pd2)を適用して得られた結合コードを利用して示される、更新前関数コードと更新後関数コードそれぞれの結合処理後のvimdiff結果を表す。
（３）Ｓ１−６−３で、差分コード生成部１０４１は、n ＝ X に含まれるコード片の個数とする。
（４）Ｓ１−６−４で、差分コード生成部１０４１は、nが指定個数以下となったか否か確認し、そうなら処理を終了し、そうでない場合は処理をＳ１−６−１へ移行する。
【００９８】
図１８に、図７のＳ１−８のリロケータブルなオブジェクトコード生成処理フローの一例を示す。
（１）Ｓ１−８−１で、差分コード生成部１０４１は、集合X、Yを図１４及び図１５のフローチャートの出力結果、または図１６のフローチャートを実施した場合はその出力結果として、Xの各元dに対して、Ｓ１−８−２からＳ１−８−７を繰り返し実施する。ここで、dと対応するYの元をpdとする。
（２）Ｓ１−８−２で、差分コード生成部１０４１は、差分コードdのサイズが、差分コード配置メモリ空間のセグメントサイズを越えるか否か判定し、超える場合Ｓ１−８−４へ、越えない場合Ｓ１−８−３へ処理を移行する。
（３）Ｓ１−８−３で、差分コード生成部１０４１は、差分コードdのサイズが、対応する修正前コード部pdのサイズを越えるか否か判定し、超える場合Ｓ１−８−４へ処理を移行する。
【００９９】
（４）Ｓ１−８−４で、差分コード生成部１０４１は、ＣＰＵレジスタの退避コードを生成し、差分コードdの先頭に付加する。
（５）Ｓ１−８−５で、差分コード生成部１０４１は、差分コードに対応するコードの先頭アドレスを計算するコードを生成し、（４）で追加した退避コード直後に追加する。
（６）Ｓ１−８−６で、差分コード生成部１０４１は、ＣＰＵレジスタの復旧コードを生成し、（５）で追加した先頭アドレス計算コードの直後に追加する。
（７）Ｓ１−８−７で、差分コード生成部１０４１は、算出結果の先頭アドレスへ分岐するJump命令を生成し、（６）で追加したＣＰＵレジスタ復旧コード直後に追加する。
【０１００】
図１９に、図７のＳ１−９の差分コードのアドレス解決処理フローの一例を示す。
（１）Ｓ１−９−１で、差分コード生成部１０４１は、集合Xを図１４及び図１５のフローチャートの出力結果、または図１８のフローチャートを実施した場合はその出力結果として、Xの各元dに対して、Ｓ１−９−２からＳ１−９−４を繰り返し実施する。
（２）Ｓ１−９−２で、差分コード生成部１０４１は、dをメモリ配置する際の先頭アドレス指定やアドレス解決済みsymbol tableを読込んでアドレス解決を実施するためのリンカスクリプトを生成する。
（３）Ｓ１−９−３で、差分コード生成部１０４１は、Symbol table中のアドレス未解決のsymbolを解決するためのリンカスクリプトを生成する。
（４）Ｓ１−９−４で、差分コード生成部１０４１は、dのコード見積りサイズからdの配置領域サイズを例えばセグメントサイズの整数倍などとして決定し、アセンブリコード各行のアドレスを決定するためのリンカスクリプトを生成する。
（５）Ｓ１−９−５で、差分コード生成部１０４１は、これまで生成されたリンカスクリプトをマージし、一つのリンカスクリプトとして生成する。
【０１０１】
図２０に、図７のＳ１−１０の差分バイナリ生成処理フローの一例を示す。
（１）Ｓ１−１０−１で、差分コード生成部１０４１は、差分以外の部分をインラインassembly化し、最適化抑止pragrmaを付加し、図１９の処理結果であるリンカスクリプトを用いてコンパイルを実行し、差分バイナリを得る。
【０１０２】
（５．更新対象部での更新前コードと更新後コードの簡約化）
図５のＳ２での処理に対応する処理の具体例の一例を図２１に示す。処理手順に関しては、コンパイラの既存技術で実現できる事は、これら具体例から明らかであるため詳細は割愛する。図２１には、（１）積極的コード移動(Eager Code Motion)、（２）不到達式削除(Dead code elimination)、及び（３）冗長削除(Redundancy Elimination)の具体例を示している。以下、夫々について説明する。ここで、以下の説明に先立って上述したorig k、update kの構築手法や条件1の式(2)の判定までの実施がなされているものとする。
【０１０３】
（１）積極的コード移動(Eager Code Motion)
本例では、一般的なEager Code Motionを、コード移動対象文の数が増加しない場合にのみ行うものとする。８０１では、コード移動前後で
t＝a＋b
が２文から１文になっており、実施対象となる。一方、８０２では、コード移動前後で、１文が２文となるため実施対象とならない。
【０１０４】
（２）不到達式削除(Dead code elimination)
本例では８０３に示す通り、Write after Writeの消去のみを実施する。また、前提として不到達コードは含まれていないものとしているため、一般的な到達不能式削除の実施は不要であり、（１）の処理で現れた場合に本処理を実施する。
【０１０５】
（３）冗長式削除(Redundancy Elimination)
本例では、一般的な冗長式削除を新たな中間変数導入を一切行わない制限の下で実施する。８０４では、冗長式削除で中間変数導入が発生しないコピー伝搬による冗長式削除を実施した例を示している。共通部分式削除や部分冗長式削除でも、新たな中間変数導入が一切不要な場合は実施するものとする。尚、各差分コードへの上記（１）（２）及び（３）の適用は、この順に実施するものとする。これら処理により、後段のＳＭＴ導出処理や模倣(Simulation)判定、双模倣(Bisimulation)判定処理での計算負荷が軽減される事は、本明細書の中で明らかとなる。
【０１０６】
これまで差分関数をinline展開せずに差分コードを構築する手法の一例を示した。しかしながら、更新前と更新後の各差分コードorig kとupdate kのサイズは、式（２）の判定処理に大きく影響を及ぼす。そのため、差分関数のinlineを適切に行う事での差分コードサイズ低減を行う事も検討される。図２２に、差分コードサイズ低減のための差分関数のinline展開方針決定処理フローの一例を示す。尚、本処理を適用しない場合は、差分コードを構築後にinline展開を実施するものとする。
【０１０７】
（１）Ｓ１−１１−１で、差分コード生成部１０４１は、集合Inline_Funcをφ(空集合)として初期化する。ここで、Inline_Funcは、差分関数の集合の部分集合であって、差分コード構成に先立ってInline展開を実施する差分関数の集合を表す。
（２）Ｓ１−１１−２で、差分コード生成部１０４１は、差分関数の元である関数fに対して、Ｓ１−１１−２からＳ１−１１−５を繰り返し実施する。
（３）Ｓ１−１１−３で、差分コード生成部１０４１は、関数fをinline展開して差分コードを構築する。
（４）Ｓ１−１１−４で、差分コード生成部１０４１は、差分コードサイズが減少したか否かを判定し、減少した場合Ｓ１−１１−５へ処理を移行する。
（５）Ｓ１−１１−５で、差分コード生成部１０４１は、Inline_Func＝{f}∪Inline_Funcを実施し、関数fを集合Inline_Funcに追加する。
【０１０８】
（６．拡張有限状態機(ＥＦＳＭ：Extended Finite Stata Machine)の構成）
図２３に、図５のＳ３でのＥＦＳＭ構成手法の具体例の一例を示す。プラグラムコードから変換される制御フローグラフは一般的に知られており、制御フローグラフから変換されるＥＦＳＭの構成は、非特許文献８にて構成すれば実現できるため、詳細を割愛する。
【０１０９】
９０１に制御フローグラフの一例を、９０２に９０１から上記非特許文献８にて構成されるＥＦＳＭの例を示す。９０１から９０２を構成するために、論理式導出部１０４２は、制御フローグラフの始点と各分岐に対して状態を割当て、状態から状態に至るまでを深さ優先探索で探索しつつ、９０２に示すように分岐条件を遷移条件とし、実行文を各状態遷移での実行文としてＥＦＳＭを構成する。ここで、分岐がなければ条件は無条件となり、９０２では、‘-’として無条件遷移である事を示している。
【０１１０】
（７．ＳＭＴ式導出）
図２２で求めた集合Inline_Funcに含まれない差分関数は、更新後差分コードからのＳＭＴ式導出に先立って更新後差分コード内でInline展開されているものとする。
【０１１１】
図２４と、図５のＳ４でのＳＭＴ式導出の、ループなしの場合の具体例の一例を示す。ＥＦＳＭからＳＭＴ式を導出するために、論理式導出部１０４２は、深さ優先探索を実施しつつ、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成する。図２４はループなしの場合であるため、１００１に対して深さ優先度を実施しつつ、各状態遷移の遷移条件と実行文の論理積を以下の式（５）の順に構成する。
【数５】
2018049506.tif 000007
・・・（５）
そして、全体の論理積を構成し、１００２に示す式（６）を構成している。
【数６】
2018049506.tif 000008
・・・（６）
【０１１２】
図２５にループありの場合の、ＥＦＳＭからのＳＭＴ式導出の処理フローの一例を示す。
（１）Ｓ４−１で、論理式導出部１０４２は、出力辺が２つ以上ある状態に論理和を取る状態である事をマーキングする。
（２）Ｓ４−２で、論理式導出部１０４２は、次のループバック状態や自身のループバック状態に至るまで深さ優先探索を実施し、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスの場合は論理和を構成し、得られた式全体で論理積を構成する。ここで、次のループバック状態を仮論理変数として配置する。
（３）Ｓ４−３で、論理式導出部１０４２は、次のループバック状態から、その次のループバック状態か自身のループバック状態か、既に探索した状態遷移を表すエッジに至るまで深さ優先探索を実施し、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスでは論理和を構成し、得られた式全体で論理積を構成する。ここで、既に探索した状態遷移は式に含めない。次のループバック状態を仮論理変数として配置する。先のステップで配置した仮論理変数に得られた式を展開する。
（４）Ｓ４−４で、論理式導出部１０４２は、探索で全パスを覆ったか否か確認し、そうならＳ４−５へ、そうでないなら処理をＳ４−３へ移行する。
（５）Ｓ４−５で、論理式導出部１０４２は、得られた複数のＳＭＴ式を対象に共通部分式の削除と簡約化を実施する。
【０１１３】
処理フローから明らかなように、ループ構造が同じであれば、プログラムの意味を保存する範囲での分岐構造の変更が成されていても、意味等価である事を双模倣等価性判定で示す事が可能なＳＭＴ式の導出が可能である。ループ構造の変更に対しては、処理に先立って対応する更新前後の差分コードに対して、do { ... } while(...);とwhile(...) { ... };の変換を実施する事でこれらの違いによる不一致判定を排除する。特に、更新前後の差分コードから、ループバック状態のみからなるＤＡＧを夫々構成してgraphとして一致している場合にのみ、図２５に示すＳＭＴ式構築処理を実施するものとする。
【０１１４】
図２６にループありの場合の、ＥＦＳＭからのＳＭＴ式導出の具体例の一例を示す。１１０１が対象となる変更前後の差分コードの構造である。本例では、変更にて、t4がt4'に、t5がt5'に、t7がt7'に修正がなされとしている。１１０２が更新前差分コードのＥＦＳＭであり、分岐を表す状態に論理和Ｖが付加されている。１１０３が更新後差分コードのＥＦＳＭであり、同様に分岐を表す状態に論理和Ｖが付加されている。１１０２に対して、図２５の処理を適用し、状態Ｓ１から次のループバック状態Ｓ３または自身の状態Ｓ１に至るまで深さ優先探索を実施し、以下の式（７）を得る。
【数７】
2018049506.tif 000009
・・・（７）
【０１１５】
ここで、（Ｓ３）は次のループバック状態を表す。次いで、状態Ｓ３から自身の状態Ｓ３または既に辿った状態遷移(本例の場合はＳ５−＞Ｓ１)に到達するまで深さ優先探索を実施し、以下の式（８）を得る。
【数８】
2018049506.tif 000010
・・・（８）
式（８）を（Ｓ３）に代入して以下の式（９）を得る。
【数９】
2018049506.tif 000011
・・・（９）
これを簡略化して以下の式（１０）を得る。
【数１０】
2018049506.tif 000012
・・・（１０）
１１０３に対しても同様な処理から、以下の式（１１）を得る。
【数１１】
2018049506.tif 000013
・・・（１１）
【０１１６】
（８．模倣(Simulation)判定、双模倣(Bisimulation)判定）
図２７に、導出したＳＭＴ式を用いた模倣関係判定と双模倣等価性判定の具体例の一例を示す。１２０１が更新前差分コードから構築したＥＦＳＭとそこから導出したＳＭＴ式（１２）であり、ＳＭＴ式をＡとする。
【数１２】
2018049506.tif 000014
・・・（１２）
一方、１２０２は更新後差分コードから構築したＥＦＳＭとそこから導出したＳＭＴ式（１３）であり、ＳＭＴ式をＢとする。
【数１３】
2018049506.tif 000015
・・・（１３）
模倣関係判定は１２０３に示す通り、以下の式（１４）を示す事となる。
【数１４】
2018049506.tif 000016
・・・（１４）
しかし、Ａ及びＢがＳＭＴ式である事から、これは、以下の式（１５）と等価である。
【数１５】
2018049506.tif 000017
・・・（１５）
即ち式（１５）の左辺が充足不能である事、従って、以下の式（１６）が充足可能である事と等価である。
【数１６】
2018049506.tif 000018
・・・（１６）
従って、以下の式（１７）のSAT/SMT Solverを用いた充足可能性判定を実施すれば良い。
【数１７】
2018049506.tif 000019
・・・（１７）
充足されれば、模倣関係が成立し、充足されなければ成立しない、となる。
【０１１７】
双模倣等価性判定は１２０４に示す通り、以下の式（１８）を示す事となる。
【数１８】
2018049506.tif 000020
・・・（１８）
しかし、Ａ及びＢがＳＭＴ式である事から、これは、以下の式（１９）と等価である。
【数１９】
2018049506.tif 000021
・・・（１９）
即ち式（１９）の左辺が充足不能である事、従って以下の式（２０）が充足可能である事と等価である。
【数２０】
2018049506.tif 000022
・・・（２０）
それ故、以下の式（２１）のSAT/SMT Solverを用いた充足可能性判定を実施すれば良い。
【数２１】
2018049506.tif 000023
・・・（２１）
充足されれば、双模倣等価性が成立し、充足されなければ成立しない、となる。
【０１１８】
（効果）
以上のことから、本実施の形態は、次のような効果を奏する。
（１）独立に動作可能な冗長多重構成を伴うプロセッサではなく、しかもタスクディスパッチャのみが搭載された安価な組込み機器で、動的プログラム更新が可能か判定可能で、可能な場合動的プログラム更新を実現できる。
（２）更新プログラムが、更新前プログラムに対して、動作意味を保存した修正、機能追加、固定定数値の変更、これら高々3つの変更であれば、動的プログラム更新が可能である。
（３）従来技術では必須となるプログラムコンテキストのトレースを、全タスクがアイドル状態になっているか否かの判定のみと出来るため、動的切り替えでのオーバーヘッドを極小化可能である。
尚、組込み機器においてはリアルタイム性が求められるため、プログラムを変更する際に、サイクルに影響するようなループ構造の変更は取りえない。それ故、上述した手法による解析が有効といえる。
【０１１９】
＜実施の形態２＞
上記実施の形態１では、全タスクがアイドル状態になったときのみ動的プログラム更新が可能であった。切り替えオーバーヘッドは極小化されている一方、更新タイミング（全タスクがアイドル状態になったときのみ）の制約が大きいと云える。そこで、実施の形態２では、動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新を可能とする手法を以下に開示する。本手法により、従来より大幅にオーバーヘッドを低減しつつ、実施の形態１より柔軟な動的プログラム更新が可能となる。
【０１２０】
本実施の形態２は、更新前プログラムと更新後プログラム、ユーザ指定更新可能変数情報、及びプログラムのタスク分割情報を受付け、動的更新可能かの十分条件判定、及び各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無判定、を実施し、夫々の判定結果を返す手段、及びシステムである。そして、当該手段又はシステムは差分プログラムを生成しても良い。本実施の形態２にかかるシステム構成を図２８に示す。また、組込み機器での動的プログラム更新を、プロセッサ上の全タスクが、アイドル状態、wait、ready、suspendいずれかとなったときのみに実施する手段を含む。尚、動的更新可能かの十分条件は実施の形態１と同じである。
【０１２１】
（１．システム構成）
図２８に本実施の形態２にかかるシステム構成を示す。判定装置２０４は、更新前プログラム１０１、更新後プログラム１０２、ユーザ指定更新可能変数１０３、及びプログラムのタスク分割情報２０３を入力し、動的更新可能かの十分判定処理を行い、判定結果１０６、差分プログラム１０５、及び各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無２０７を出力する。ここで、ユーザ指定更新可能変数１０３は、実施の形態１の図２と同じであり、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。また、プログラムのタスク分割情報２０３は、各タスクがどのプログラム関数群から構成されているのかのタスク定義情報である。判定装置２０４は、差分コード生成部２０４１と、論理式導出部１０４２と、判定部１０４３とを備える。
【０１２２】
組込み機器での動的プログラム更新は、プロセッサ上の全タスクが、アイドル状態となったときに、組込み機器が具備するプログラム切り替え機構を用いて実施する。例えば、動的プログラム配置をプログラム実行中に実施し、プロセッサ上で動作するタスクディスパッチャが、全タスクがアイドル状態、wait、ready、suspendいずれかとなった事を確認する。そして、アイドル状態又はwait、suspendになった更新前タスクに定数変数利用演算結果を出力するタスクが含まれないか、またはwait、ready状態となったタスクの更新後の状態で定数変数利用演算結果を受け取るタスクが含まれない時、または全タスクがアイドル状態となった事を確認する。そして、更新要求を格納するレジスタ値をポーリング読出し、更新要求有無を確認し、要求があると確認出来た場合に、アドレス変換器をイネーブルする事で実現される。
【０１２３】
（２．条件1の判定手続き概要）
実施の形態１と同様である。
【０１２４】
（３．動的更新可能十分条件判定全体フロー）
実施の形態１と同様である。
【０１２５】
（４．関数階層を考慮した差分コード生成処理）
差分コード生成部２０４１は、実施の形態１の差分コード生成部１０４１の処理に加えて、更新前プログラム及び更新後プログラム夫々に対して、手続き間データフロー解析を実施し、先ず各関数が定数配列演算結果を戻り値として返すか、タスク間データ出力を行うか、及び、当該戻り値や当該タスク間データ出力を受け取るかを識別する。次いで、差分コード生成部２０４１は、各タスクを構成する関数群の情報を示すプログラムのタスク分割情報２０３を用いて、更新前の各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、更新後の各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別する。差分コード生成部２０４１は、これら識別情報を、各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無結果２０７として出力する。
【０１２６】
（５．更新対象部での更新前コードと更新後コードの簡約化）
実施の形態１と同様である。
【０１２７】
（６．拡張有限状態機(ＥＦＳＭ)の構成）
実施の形態１と同様である。
【０１２８】
（７．ＳＭＴ式導出）
実施の形態１と同様である。
【０１２９】
（８．模倣(Simulation)判定、双模倣(Bisimulation)判定）
実施の形態１と同様である。
【０１３０】
（効果）
動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新が可能となる。
【０１３１】
＜実施の形態３＞
本実施の形態３は、組込み機器での更新差分プログラムのセキュアな動的配置と、セキュアな動的更新動作とを行うものである。本実施の形態３は、上記実施の形態１及び２と組み合わせて実施することが可能である。そこで、組込み機器での更新差分プログラムのセキュアな動的配置と、セキュアな動的更新動作について以下に説明する。
【０１３２】
（差分コードの動的配置）（３面の場合）
まず、組込み機器４０におけるプログラムの動的な配置動作について説明する。図３６は、組込み機器４０におけるプログラムの動的な配置動作の一例を説明する模式図である。なお、ここでは、組込み機器４０のＳＲＡＭ４０６は、起動時に固定割り付けされるプログラム更新作業領域４４２を有する。また、ＣＰＵ４０１は、汎用割込みベクタテーブル４４０と専用割込みベクタテーブル４４１を具備するものとする。また、専用割込みベクタテーブル４４１は、動的なプログラム配置で用いられる割込みベクタテーブルであり、物理的には、汎用割込みベクタテーブル４４０の一部として実装されていても良い。プログラムの動的な配置動作例は下記の通りである。
【０１３３】
（１）ＣＡＮインターフェース４０９から更新情報の転送を要求する割込みを割込みコントローラ４０３が受け、割込みコントローラ４０３がＣＰＵ４０１に割込みをかける。
（２）ＣＰＵ４０１は専用割込みベクタテーブル４４１を参照し、対応する割込みハンドラが実行される。これにより、ＣＰＵ４０１またはＤＭＡコントローラ４０５の制御の下、ＣＡＮインターフェース４０９からＳＲＡＭ４０６に更新情報がデータ転送される。ここで、更新情報に含まれるインジェクションコードはプログラム更新作業領域４４２に配置される。また、受信した各データには予め署名が付加されており、プログラム更新作業領域４４２の予め定められたアドレスを先頭アドレスとして格納されるものとする。
（３）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受けてＣＰＵ４０１が割込みを受け付けるまで、上記（１）と（２）が繰り返される。
（４）ＣＡＮインターフェース４０９から更新情報の転送の区切りを示す割込みを割込みコントローラ４０３が受け、ＣＰＵ４０１が割込みを受ける。
（５）ＣＰＵ４０１は専用割込みベクタテーブル４４１を参照し、対応する割込みハンドラが実行される。これにより、プログラム更新作業領域４４２に配置されたインジェクションコードが実行される。インジェクションコードは、その種類に応じて、ＣＰＵ４０１がアクセスしていないプログラムＲＯＭ４０７／データＲＯＭ４０８に対する更新データテーブル（すなわち更新差分コードに含まれる初期値付き局所変数と大域変数）の配置、ＣＰＵ４０１がアクセスしていないプログラムＲＯＭ４０７に対する更新差分バイナリの配置、並びに現在実行中にないデータＲＯＭ４０８に対するアドレス変換テーブルの配置を実施する。
（６）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受けてＣＰＵ４０１が割込みを受け付けるまで、上記（１）〜（５）が繰り返される。
（７）ＣＡＮインターフェース４０９から更新情報の転送の終了を示す割込みを割込みコントローラ４０３が受け、ＣＰＵ４０１が割込みを受け付ける。
（８）ＣＰＵ４０１は専用割込みベクタテーブル４４１を参照し、対応する割込みハンドラが実行される。これにより、プログラムＲＯＭ４０７／データＲＯＭ４０８に配置したデータテーブルや差分コードの署名検証、アドレス変換器４０２やデータＲＯＭ４０８に配置したアドレス変換テーブルの署名検証が実施される。ここで、組込み機器４０は、署名検証をパスした場合、差分コードの署名（ハッシュ値）をデータＲＯＭ４０８に格納するとともに、ＣＡＮインターフェース４０９から完了通知を外部へ出力する。また、組込み機器４０は、再起動後に差分コード配置面の切り替えを実施する旨、フラグ設定を実施する。組込み機器４０は、署名検証で不一致となった場合は、プログラムＲＯＭ４０７／データＲＯＭ４０８に配置したデータテーブルや差分コードの消去、アドレス変換器やデータＲＯＭに配置したアドレス変換テーブルの消去を実施するとともに、ＣＡＮインターフェース４０９から署名検証不一致の通知を外部へ出力する。
【０１３４】
（差分コードの動的配置）（２面の場合）
プログラムＲＯＭ４０７／データＲＯＭ４０８が２面の場合、まず、デフォルトプログラムの切り替えを実施する。当該切り替えは、本実施の形態１にかかる判定にて動的更新が可能と判定されている場合、全てのタスクがｓｌｅｅｐ状態となったことを検知して、アドレス変換テーブルをオフとすることで実現できる。その後、上述した３面の場合の差分コードの動的配置を実施する。
【０１３５】
（差分コードのセキュアな動的配置）
本実施の形態では、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に署名検証が行われる。そして、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に署名検証が行われたか否かをハードウェアにて管理する事で、より堅牢な更新情報の動的な配置を可能とする。図３７は、ＲＯＭへの書込みの許否を制御する制御回路４５０の一例を示す模式図である。
【０１３６】
本実施の形態において、組込み機器４０は、制御回路４５０を有する。制御回路４５０は、更新制御レジスタ４５１、反転回路４５２、ＡＮＤ回路４５３、及びＯＲ回路４５４を有する。更新制御レジスタ４５１は、「許可」ビット、「ｆ１」ビット、「ｆ２」ビット、「ｒ」ビットを含む。反転回路４５２には、更新制御レジスタ４５１の「許可」ビットが入力される。ＡＮＤ回路４５３には、更新制御レジスタ４５１の「ｆ１」ビット及び「ｆ２」ビットが入力される。ＯＲ回路４５４には、ＡＮＤ回路４５３の出力及び反転回路４５２の出力が入力される。ＯＲ回路４５４の出力は、プログラムＲＯＭ４０７／データＲＯＭ４０８が有する制御回路である書込みコントローラに入力される。ここで、「許可」ビットは、ＣＰＵ４０１が特権モードの時のみ、読み書き可能であり、このビットに‘１’が設定された場合のみ制御回路４５０による制御が有効となる。「ｆ１」ビットは、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みの前に実施されるＳＲＡＭ４０６へのデータ転送が完了した事を示すビットである。「ｆ１」ビットは、ＳＲＡＭ４０６へのデータ転送完了時に‘１’が設定される。「ｆ２」ビットは、署名検証が成功したか否かを示すビットであり、署名検証完了時に‘１’が設定される。「ｆ１」ビットと「ｆ２」ビットは読出しがなされることで‘０’にクリアされる。制御回路４５０によれば、「許可」ビットを‘１’に設定する事で、制御回路４５０による制御が有効となり、その後に「ｆ１」ビットと「ｆ２」ビットがともに‘１’に設定されたときのみ、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラが有効化される。制御回路４５０による制御が有効化されている状態で署名検証がスキップされた場合、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラは無効化されているため、書込みＢＩＯＳを何らかの手段で実行したとしても、プログラムＲＯＭ４０７／データＲＯＭ４０８への書込みは実施されない。「ｒ」ビットには、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラへのイネーブル信号値が書き込まれる。「ｒ」ビットは読出しのみ可能であり、読み出すと‘０’にクリアされる。ここで、制御回路４５０は、プログラムＲＯＭ４０７とデータＲＯＭ４０８のそれぞれに対して個別に設けても良い。
【０１３７】
次に、制御回路４５０を用いた動作例について説明する。図３８は、制御回路４５０を用いた書き込みの制御動作の一例を示すフローチャートである。本フローチャートは、ステップ６１００が実行された事を契機として処理を開始するものとする。
ステップ６１００（Ｓ６１００）で、実施の形態１又は実施の形態２で説明した更新動作に従い、更新差分プログラムがＳＲＡＭ４０６へ転送される。
ステップ６１０１（Ｓ６１０１）で、転送完了後、ＣＰＵ４０１は、「ｆ１」ビットを設定する。ここで、ＣＰＵ４０１は、転送が正常終了した場合‘１’を設定し、そうでない場合、‘０’を設定する。
ステップ６１０２（Ｓ６１０２）で、暗号処理ユニット４０４（署名検証部）が、更新差分プログラムの署名検証を実施する。
ステップ６１０３（Ｓ６１０３）で、署名検証完了後、ＣＰＵ４０１は、「ｆ２」ビットを設定する。ＣＰＵ４０１は、署名検証結果が正常な場合、‘１’を設定し、そうでない場合、‘０’を設定する。
ステップ６１０４（Ｓ６１０４）で、「許可」ビットが‘１’か否かが確認され、‘１’の場合、処理はステップ６１０５へ移行し、そうでない場合、処理はステップ６１０６へ移行する。
ステップ６１０５（Ｓ６１０５）で、「ｆ１」ビットが‘１’でかつ「ｆ２」ビットが‘１’であるか否かが確認され、双方ともに‘１’の場合、処理はステップ６１０６へ移行し、そうでない場合、処理はステップ６１０８へ移行する。
ステップ６１０６（Ｓ６１０６）で、プログラムＲＯＭ４０７／データＲＯＭ４０８の書込みコントローラに対し書込み許可を設定し、「ｒ」ビットに‘１’が設定される。
ステップ６１０７（Ｓ６１０７）で、ＣＰＵ４０１は、更新制御レジスタ４５１を必ず読み出す。読み出す事で、「ｆ１」ビット、「ｆ２」ビット、及び「ｒ」ビットの内容を確認する。また、これら３つのビットが‘０’にクリアされ、そして、処理が終了する。なお、ステップ６１０７において、書込み処理が完了した場合に、ＣＰＵ４０１は、「ｒ」ビットの確認を行うことで、書き込み処理が行われた際に書込みコントローラへのイネーブル信号値が実際に１であったか否かを確認することができる。また、許可ビット以外の全ビットが‘０’にクリアされるため、次の更新差分プログラムのプログラム/データＲＯＭへの書込みで、署名検証や転送完了が正常に行われているかのチェックが必須となり、これらチェックをスキップする事での攻撃を排除可能となる。
ステップ６１０８（Ｓ６１０８）で、「ｒ」ビットに‘０’が設定され、処理はステップ６１０７へ移行する。
【０１３８】
このように、本実施の形態では、組込み機器４０は、署名検証結果が正当であることが確認された場合に、プログラムＲＯＭ４０７又はデータＲＯＭ４０８への更新情報の書き込みを許可する制御回路４５０を有する。これにより、署名検証結果が不当である更新情報がプログラムＲＯＭ４０７又はデータＲＯＭ４０８に書き込まれることを抑制し、不当である更新情報に起因するプログラムＲＯＭ４０７又はデータＲＯＭ４０８の消去処理を抑制することが可能となる。
【０１３９】
（差分コードの動的更新動作）（３面の場合）
プログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が３である場合の更新手順は、例えば以下のようになる。図３９は、プログラム更新手順の一例を示すフローチャートである。
ステップ３７００（Ｓ３７００）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ３７０１へ移行し、許可されない場合、処理はステップ３７０５へ移行する。
ステップ３７０１（Ｓ３７０１）で、管理サーバ３０は、更新プログラムの動的ロード、即ちプログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。なお、動的な配置とは、プログラムの動作を停止させることなく、当該プログラムに対する差分をＲＯＭに配置することをいう。
ステップ３７０２（Ｓ３７０２）で、管理サーバ３０は、更新プログラムの動的な配置の完了を確認する。
ステップ３７０３（Ｓ３７０３）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ３７０４へ移行し、許可されない場合、処理はステップ３７０６へ移行する。
ステップ３７０４（Ｓ３７０４）で、タスクディスパッチャは、全タスクがアイドル状態であることを確認し、差分コードの更新を実施する。
ステップ３７０５（Ｓ３７０５）では、所定の待機時間が経過した後、ステップ３７００へ処理が移行する。同様に、ステップ３７０６（Ｓ３７０６）でも、所定の待機時間が経過した後、ステップ３７０３へ処理が移行する。
【０１４０】
（差分コードの動的更新動作）（２面の場合）
プログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が２である場合の更新手順は、例えば以下のようになる。図４０は、プログラム更新手順の一例を示すフローチャートである。
ステップ４９００（Ｓ４９００）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ４９０１へ移行し、許可されない場合、処理はステップ４９０６へ移行する。
ステップ４９０１（Ｓ４９０１）で、アドレス変換テーブルの不許可設定など、デフォルトプログラムの実行状態とするために必要な設定が完了した後、組込み機器４０がリセットされ、組込み機器４０が再起動される。そして、再起動後に組込み機器４０は、デフォルトプログラムの実行状態へと遷移する。
ステップ４９０２（Ｓ４９０２）で、管理サーバ３０は、更新プログラムの動的ロード、即ちプログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。
ステップ４９０３（Ｓ４９０３）で、管理サーバ３０は、更新プログラムの動的な配置の完了を確認する。
ステップ４９０４（Ｓ４９０４）で、管理サーバ３０は、ユーザインターフェース３７を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ４９０５へ移行し、許可されない場合、処理はステップ４９０７へ移行する。
ステップ４９０５（Ｓ４９０５）で、タスクディスパッチャは、全タスクがアイドル状態であることを確認し、差分コードの更新を実施する。
ステップ４９０６（Ｓ４９０６）では、所定の待機時間が経過した後、ステップ４９００へ処理が移行する。同様に、ステップ４９０７（Ｓ４９０７）で、所定の待機時間が経過した後、ステップ４９０４へ処理が移行する。
【０１４１】
（差分コードのセキュアな動的更新動作）
ここで、本実施の形態における、組込み機器での更新動作について説明する。本実施の形態をプログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が３である組込み機器４０に適用した場合の更新動作は、図３９と同様であるが、以下の点で異なる。また、本実施の形態をプログラムＲＯＭ４０７及びデータＲＯＭ４０８の面数が２である組込み機器４０に適用した場合の更新動作は、図４０と同様であるが、以下の点で異なる。すなわち、本実施の形態が適用された場合、図３９に示したステップ３７０１及び図４０に示したステップ４９０２では、管理サーバは、更新プログラムのセキュアな動的ロード、即ち本実施の形態で述べたセキュア対応を考慮した、プログラムＲＯＭ４０７及びデータＲＯＭ４０８への更新プログラムの動的な配置を開始する。尚、動的配置を行わない場合、プログラムＲＯＭ４０７／データＲＯＭ４０８が１面であっても、動的更新動作は可能である。
【０１４２】
（効果）
（１）独立に動作可能な冗長多重構成を伴うプロセッサではなく、しかもタスクディスパッチャのみが搭載された安価な組込み機器で、動的プログラム更新が可能か判定可能で、可能な場合、動的プログラム更新をセキュアに実現できる。
（２）更新プログラムが、更新前プログラムに対して、動作意味を保存した修正、機能追加、固定定数値の変更、これら高々３つの変更であれば、動的プログラム更新がセキュアに可能である。
（３）従来技術では必須となるプログラムコンテキストのトレースを、全タスクがアイドル状態になっているか否かの判定のみと出来るため、動的切り替えでのオーバーヘッドを極小化がセキュアに可能となる。
（４）動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新がセキュアに可能となる。
【０１４３】
＜実施の形態４＞
本実施の形態４は、組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントやデフォルトプログラムへの動的ロールバック（又はフォールバック）後のプログラムに対してロールバック前後のプログラムが条件１、条件２を満たす場合、全タスクがアイドルとなったときの動的ロールバックを実施するものである。非特許文献１より、前記動的ロールバックがその実施条件の下で動的プログラム更新可能条件を満たす事も明らかである。本実施の形態４は、上記実施の形態１と組み合わせて実施することが可能である。そこで、組込み機器での動的ロールバックについて、以下に説明する。
【０１４４】
（デフォルトプログラムへのロールバック）
組込み機器の更新での異常検知時や外部からの指示に基づくデフォルトプログラムへのロールバック指示に基づき、タスクが全てSleep状態となったときに、図２９のアドレス変換器をオフとする事で、差分プログラム実行を不可、即ちデフォルトのプログラムのみ実行可能とする事で実現する。
【０１４５】
（指定ポイントへのロールバック）
組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントへのロールバック指示に基づき、タスクが全てSleep状態となったときに、図２９のアドレス変換器を先ずオフとし、デフォルトプログラムへ遷移後、データROMなどに保存しておいた指定ポイントに対応するプログラム実行を可能とする差分コード実行に対応するアドレス変換テーブルを読出し、アドレス変換器に設定、その後、実施例１の動的切り替えタイミング、即ちタスクが全てSleep状態となったときにアドレス変換器をオンとする事で、指定ポイントに対応するプログラムの実行を可能とする事で実現する。ここで、指定ポイントのプログラム実行に必要となる差分プログラムをデータROMから読出しコードROMへ上書きを実施しても良い。特に、更新差分コードを書き込む際に、既にコードROM上に存在する差分コードをデータROMに読出して書込みを実施するものとしても良い。
【０１４６】
（効果）
組込み機器において動作実行中のプログラムのフォールバックやロールバックが可能となる。
【０１４７】
＜その他の実施の形態＞
組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントやデフォルトプログラムへの動的ロールバック後のプログラムに対してロールバック前後のプログラムが条件１、条件２を満たす場合、全タスクがアイドルまたはwait、ready、suspendとなったときの動的ロールバックが、上記実施の形態３又は４と実施の形態２との組合せにより実現可能である。
【０１４８】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【符号の説明】
【０１４９】
１０１  更新前プログラム
１０２  更新後プログラム
１０３  ユーザ指定更新可能変数
１０４  判定装置
１０４１  差分コード生成部
１０４２  論理式導出部
１０４３  判定部
１０５  差分プログラム
１０６  判定結果
２０３  プログラムのタスク分割情報
２０４  判定装置
２０４１  差分コード生成部
２０７  各タスクでの定数変数利用演算結果の入力・出力の有無
【図１】
2018049506.tif 000024
【図２】
2018049506.tif 000025
【図３】
2018049506.tif 000026
【図４】
2018049506.tif 000027
【図５】
2018049506.tif 000028
【図６】
2018049506.tif 000029
【図７】
2018049506.tif 000030
【図８】
2018049506.tif 000031
【図９】
2018049506.tif 000032
【図１０】
2018049506.tif 000033
【図１１】
2018049506.tif 000034
【図１２】
2018049506.tif 000035
【図１３】
2018049506.tif 000036
【図１４】
2018049506.tif 000037
【図１５】
2018049506.tif 000038
【図１６】
2018049506.tif 000039
【図１７】
2018049506.tif 000040
【図１８】
2018049506.tif 000041
【図１９】
2018049506.tif 000042
【図２０】
2018049506.tif 000043
【図２１】
2018049506.tif 000044
【図２２】
2018049506.tif 000045
【図２３】
2018049506.tif 000046
【図２４】
2018049506.tif 000047
【図２５】
2018049506.tif 000048
【図２６】
2018049506.tif 000049
【図２７】
2018049506.tif 000050
【図２８】
2018049506.tif 000051
【図２９】
2018049506.tif 000052
【図３０】
2018049506.tif 000053
【図３１】
2018049506.tif 000054
【図３２】
2018049506.tif 000055
【図３３】
2018049506.tif 000056
【図３４】
2018049506.tif 000057
【図３５】
2018049506.tif 000058
【図３６】
2018049506.tif 000059
【図３７】
2018049506.tif 000060
【図３８】
2018049506.tif 000061
【図３９】
2018049506.tif 000062
【図４０】
2018049506.tif 000063