JP6637398B2 - 判定装置及び判定方法 - Google Patents

判定装置及び判定方法 Download PDF

Info

Publication number
JP6637398B2
JP6637398B2 JP2016185274A JP2016185274A JP6637398B2 JP 6637398 B2 JP6637398 B2 JP 6637398B2 JP 2016185274 A JP2016185274 A JP 2016185274A JP 2016185274 A JP2016185274 A JP 2016185274A JP 6637398 B2 JP6637398 B2 JP 6637398B2
Authority
JP
Japan
Prior art keywords
program
code
difference
update
expression
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2016185274A
Other languages
English (en)
Other versions
JP2018049506A (ja
Inventor
匡亮 谷本
匡亮 谷本
直幸 森田
直幸 森田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Renesas Electronics Corp
Original Assignee
Renesas Electronics Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Renesas Electronics Corp filed Critical Renesas Electronics Corp
Priority to JP2016185274A priority Critical patent/JP6637398B2/ja
Priority to US15/656,893 priority patent/US10642607B2/en
Publication of JP2018049506A publication Critical patent/JP2018049506A/ja
Application granted granted Critical
Publication of JP6637398B2 publication Critical patent/JP6637398B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/658Incremental updates; Differential updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4498Finite state machines
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/70Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
    • G06F21/71Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information
    • G06F21/76Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure computing or processing of information in application-specific integrated circuits [ASIC] or field-programmable devices, e.g. field-programmable gate arrays [FPGA] or programmable logic devices [PLD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Description

本発明は判定装置及び判定方法に関し、例えば、組込み機器に対するプログラムの動的更新の判定装置及び判定方法に関する。
近年、車載機器及び産業機器などに組み込まれる組込み機器が増加している。そして、このような組込み機器におけるプログラムをいわゆるOTA(Over The Air)により更新する方法が求められている。プログラムの更新に関しては、種々の技術が提案されている。
例えば、特許文献1には、モジュール単位の更新プログラムに対して基準アドレスと相対アドレスを予め割当てておく事で、組込み機器上で動作するプログラムの動作を停止させることなく、プログラムをモジュール単位で動的に更新する技術が開示されている。
また、特許文献2には、OS(Operating System)の置換手法であって、現在実行中のOSにて、新規OSを読み込むための準備と新規OS起動時に引き渡すべき情報の格納を実施し、現在実行中のOSを再起動する事で、新規OSの読み込みと新規OS再起動時に新規OSへの情報引渡しの準備を実施し、新規OSを再起動する事でOS置換を実現する手法が開示されている。
また、非特許文献1には、更新前後でどのようなコード削除・挿入がなされ、コード削除・挿入によるプログラムの制御フローとデータフローへの影響を解析し、変更による影響が出る前の部分を識別し、識別したプログラム部を切り替え可能プログラム・ポイントとし、動作実行中にプログラム更新を実現する手法が開示されている。
特開2010−218334号公報 特開2015−32314号公報
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.
しかしながら、非特許文献1を用いて、組み込み機器においてプログラムを動的に更新するには、プログラム実行中にプログラムコンテキスト情報をトレースする必要があり、実行オーバーヘッドが大きく、そのままでは、車載制御や産業制御などハードリアルタイムシステムでの適用が困難である、という問題があった。ここで、プログラムコンテキスト情報とは、プログラムの実行に必要な各種情報として動的にヒープなどメモリに格納される情報であり、プログラムの制御依存関係やデータ依存関係、データへのアクセスなどの情報を含む情報である。
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
一実施の形態によれば、判定装置は、プログラムの動的更新可能問題を差分コードに着目して充足可能性問題に帰着させて解くものである。
前記一実施の形態によれば、実行オーバーヘッドを抑制し、車載制御や産業制御などハードリアルタイムシステムでの適用を可能とすることができる。
プログラムの動的更新可能条件を説明するための図である。 本実施の形態1にかかるシステム構成を示すブロック図である。 本実施の形態1にかかる重要な性質を説明するための図である。 本実施の形態1にかかる包含判定手順を説明するための図である。 動的更新可能かの十分条件判定 全体フローの流れを示すフローチャートである。 vimdiff形式の概念を説明するための図である。 差分コード生成フローの流れを説明するためのフローチャートである。 Call Graph Diffの例を示す図である。 Call Graph Diff構築処理概要の例を示す図である。 Call Graph Diff処理フローの流れを説明するためのフローチャートである。 固定定数変数の差分生成処理(1)の流れを説明するためのフローチャートである。 固定定数変数の差分生成処理(2)の流れを説明するためのフローチャートである。 固定定数変数の差分生成処理(3)の流れを説明するためのフローチャートである。 各関数でのSSAを考慮したdiff形式等の差分コードの構築処理(1)の流れを説明するためのフローチャートである。 各関数でのSSAを考慮したdiff形式等の差分コードの構築処理(2)の流れを説明するためのフローチャートである。 関数内での差分コード片のマージ処理の流れを説明するためのフローチャートである。 関数内での差分コード片のマージ処理の概念を説明するための図である。 オブジェクトコード生成処理の流れを説明するためのフローチャートである。 差分コードのアドレス解決処理の流れを説明するためのフローチャートである。 差分バイナリ生成処理の流れを説明するためのフローチャートである。 差分コードのsimplificationの例を示す図である。 差分コードサイズ低減ための各差分関数のinline展開方針決定の流れを説明するためのフローチャートである。 EFSMの構成の例を示す図である。 ループなしの場合のSMT式導出の例を示す図である。 ループありの場合のSMT変換処理フローの流れを説明するためのフローチャートである。 ループありの場合のSMT変換の例を示す図である。 模倣関係判定と双模倣等価性判定の例を示す図である。 本実施の形態2にかかるシステム構成を示すブロック図である。 更新後のプログラム実行手順例を説明する模式図である。 アドレス変換器によるアドレス変換の詳細を説明する模式図である。 更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。 変換されたアドレスと差分コードの対応例を示す模式図である。 変換されたアドレスと差分コードの別の対応例を示す模式図である。 変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。 変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。 組込み機器におけるプログラムの動的な配置動作の一例を説明する模式図である。 ROMへの書込みの許否を制御する制御回路の一例を示す模式図である。 制御回路を用いた書き込みの制御動作の一例を示すフローチャートである。 プログラム更新手順の一例を示すフローチャートである。 プログラム更新手順の一例を示すフローチャートである。
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、CPU、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体(non−transitory computer readable medium)を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体(tangible storage medium)を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体(例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ)、光磁気記録媒体(例えば光磁気ディスク)、CD−ROM(Read Only Memory)CD−R、CD−R/W、半導体メモリ(例えば、マスクROM、PROM(Programmable ROM)、EPROM(Erasable PROM)、フラッシュROM、RAM(Random Access Memory))を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体(transitory computer readable medium)によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
まず、本実施の形態が解決しようとする課題について以下に詳述する。図1は、プログラムの動的更新可能条件を説明するための図である。ここで、プログラムの動的更新可能条件は、「プログラム実行途中でプログラムの更新を実施した後、有限回のステップ実行で、更新プログラムを初期状態から実行して到達可能な状態へ、必ず到達する事」となる。図1では、以下の定義とする。
P:更新前プログラム、
P':更新後プログラム、
P(s0):Pの初期状態
P(sk):Pの初期状態から有限回のステップ実行で到達可能な状態
P'(t0):P'の初期状態
P'(tl):P'の初期状態から有限回のステップ実行で到達可能な状態
T:更新前プログラムから更新後プログラムへの動的変更
そして、上記条件満たす場合、即ち、P(sk)にて動的プログラム更新が実施され、その後の有限回のステップ実行でP'(tl)に到達する実行例を示している。
また、本条件を満たすか否かの判定問題が決定不能である事が、非特許文献2に示されている。従って、十分条件を与えて判定可能とせざるを得ず、非特許文献1で指摘されているように、非常に厳しい制約が課されるという問題がある。また、非特許文献1を含め、既存手法そのままでは、車載制御や産業制御などハードリアルタイムシステムでの適用が困難である、という問題がある。その理由は、既存手法では、プログラムコンテキスト情報を、プログラム実行中にトレースする必要があり、実行オーバーヘッドが大きいためである。プログラムコンテキスト情報とは、上述した通り、プログラムの実行に必要な各種情報として動的にヒープなどメモリに格納される情報であり、プログラムの制御依存関係やデータ依存関係、データへのアクセスなどの情報を含む情報である。
ここで、上述した特許文献1及び2並びに非特許文献1の課題について説明する。
まず、特許文献1では、組込み機器で基準アドレスと相対アドレスから実アドレスを算出する事で、更新プログラムの動的なアドレス解決が可能である事を前提としている。そのため、組込み機器が前記動的アドレス解決機能を有さない場合、直接適用する事ができない。また、特許文献1の実施例ではLinux(登録商標)など動的アドレス変換機構を伴う高機能OS(Operating System)搭載が前提となっている。よって、特許文献1にかかる技術は、そのような機構がない組込みOSのみが搭載されている場合や、OS自体が搭載されていない場合に適用する事が出来ない。また、モジュール単位での端末機器での動的更新を対象としているため、差分コードのみを用いた更なるメモリ削減が達成できない。
また、特許文献2では、動的プログラム更新手段を提供していない。そして、特許文献2では、更新プログラムの読み込みでは、必ず現在実行中のOSの再起動を行わなければならない。また、更新のための新規OSでの再起動を連続実行してしまう。さらに、特許文献2では、OS全体での更新を対象としているため、差分コードのみでの更新によるメモリ削減が達成できない。
また、非特許文献1は、修正前後の2つのプログラムで動的切り替えが可能なプログラム・ポイント導出に関する技術である。そのため、非特許文献1は、差分更新コードを用いた動的プログラム更新技術を直接示すものではない。また、非特許文献1は、前記プログラム・ポイント導出が記述の意味ではなく文法に基づく方法であるため、更新後プログラムで更新前プログラムの意味を変更する事なくコード移動を行うなどのコード最適化を行った場合は、適切なプログラム・ポイントの導出が出来ないという問題がある。また、非特許文献1は、プログラム実行時に構築されるヒープをトレースする事で、動的切り替え可能なプログラム・ポイントであるか否かを判断する事が前提であり、実行時オーバーヘッドが大きいという問題がある。
また、特許文献1及び2並びに非特許文献1のいずれも、更新での異常検知時や外部からの指示に基づく更新前プログラムへのロールバックを可能とする手段が提供されていない。
(解決手段)
本実施の形態による解決手段は、差分バイナリを用いて、システム再起動を伴わないプログラム更新が可能かの十分条件と、前記十分条件を差分バイナリが満たすか否かを、開発環境で更新前プログラムと更新後プログラムから差分プログラムを生成する際に検証する方法及び装置といえる。また、前記差分プログラムを用いた組込み機器での動的プログラム更新手法も含む。
ここで、組込み機器は、プログラムカウンタを動的に更新可能なプロセッサ、及び独立な読出し及び書込みアクセスが可能な1面以上のプログラムメモリとデータメモリを少なくとも有するハードウェア機構を具備しているものとする。そして、既に更新前プログラムが配置されているとする。その上で、前記十分条件を満たさない場合は、システム再起動を伴うプログラム更新を実施するものとする。
尚、本実施の形態による解決手段は次のように言い換えることもできる。すなわち、本実施の形態にかかる判定装置は、
第1のプログラムのうち第2のプログラムと異なるコード片の集合を示す第1の差分コードと、前記第2のプログラムのうち前記第1のプログラムと異なるコード片の集合を示す第2の差分コードとを生成する差分コード生成部と、
前記第1の差分コードから所定の変換により第1の論理式を導出し、前記第2の差分コードから前記所定の変換により第2の論理式を導出する論理式導出部と、
前記第2の論理式が前記第1の論理式を含むか否かにより、所定の組込み機器における前記第1のプログラムから前記第2のプログラムへの動的更新の可否を判定する判定部と、
を備える。
また、前記論理式導出部は、
前記所定の変換として、前記第1の差分コードから第1のSMT(Satisfiability Modulo Theories)式を前記第1の論理式として導出し、前記第2の差分コードから第2のSMT式を前記第2の論理式として導出する。
さらに、前記論理式導出部は、
前記第1の差分コード及び前記第2の差分コードがループ記述を含む場合に、前記所定の変換として、前記第1の差分コードから第1のEFSM(Extended Finite State Machine)を構築し、前記第2の差分コードから第2のEFSMを構築し、当該第1のEFSMから前記第1のSMT式を前記第1の論理式として導出し、当該第2のEFSMから前記第2のSMT式を前記第2の論理式として導出する。
さらに、前記論理式導出部は、
深さ優先探索を実施しつつ、当該深さ優先探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成することにより、前記第1のEFSMから前記第1のSMT式及び前記第2のEFSMから前記第2のSMT式を導出する。
また、前記判定部は、
前記第1の論理式及び前記第2の論理式を用いて模倣(Simulation)関係判定により前記第2の論理式が前記第1の論理式を含むか否か、及び双模倣(Bisimulation)等価性判定により、前記第1の論理式と前記第2の論理式が等価であるか否かを判定する。
また、前記論理式導出部は、
前記第1の差分コード及び前記第2の差分コードを簡略化して前記所定の変換を行う。
さらに、前記論理式導出部は、
前記簡略化として、前記第1の差分コード及び前記第2の差分コードを積極的コード移動、不到達式削除及び冗長式削除の順に実施して前記所定の変換を行う。
また、前記差分コード生成部は、
前記第1のプログラムと前記第2のプログラムとの差分のコードからアドレス解決を行ったオブジェクトコードを前記第1の差分コード及び前記第2の差分コードとして生成する。
また、前記差分コード生成部は、
関数呼び出し構造を維持するように前記第1のプログラムと前記第2のプログラムとの差分を取ることにより、前記第1の差分コード及び前記第2の差分コードを生成する。
また、前記差分コード生成部は、
各タスクが構成されているプログラム関数群を定義したタスク分割情報を入力し、
前記タスク分割情報を用いて、前記第1のプログラムの各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、前記第2のプログラムの各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別し、当該識別した情報を出力する。
また、本実施の形態にかかる判定方法は、
第1のプログラムのうち第2のプログラムと異なるコード片の集合を示す第1の差分コードと、前記第2のプログラムのうち前記第1のプログラムと異なるコード片の集合を示す第2の差分コードとを生成し、
前記第1の差分コードから所定の変換により第1の論理式を導出し、前記第2の差分コードから前記所定の変換により第2の論理式を導出し、
前記第2の論理式が前記第1の論理式を含むか否かにより、所定の組込み機器における前記第1のプログラムから前記第2のプログラムへの動的更新の可否を判定する。
(効果)
(1)組込み機器が動的アドレス解決機能を有さない場合であっても、差分コードを用いた動的プログラム更新が可能か判定可能であり可能な場合、実施可能である。
(2)プログラムの実行に必要な各種情報として動的に格納されるプログラムコンテキスト情報に関して、タスク間でのデータ引渡しとして利用される出力結果の有無を表す情報を除いて、プログラム実行中にトレースする機能を伴う事なくプログラム更新が可能であり、実行時オーバーヘッドが従来手法に比べて大幅に軽減可能である。
(3)モジュール単位での更新に比べ、差分コードのみを用いた更なるメモリ削減が達成可能である。
(4)フラッシュメモリの書込み及び消去をより細かい単位で実施可能となるため、モジュール単位での更新手法に比べ、フラッシュメモリの長寿命化が達成可能となる。
(5)更新での異常検知時や外部からの指示に基づく更新前プログラムへの動的ロールバックが可能か判定可能で、可能な場合、動的ロールバックが実施可能となる。
<実施の形態1>
まず、本実施の形態における前提を説明する。本実施の形態では、ある一定以上の品質が要求されるプログラムを対象として成されたものであり、ISO26262 ASIL-AまたはIEC61508 SIL1相当のMISRA-C規約相当を満たすプログラム記述などを対象とする。具体的には本実施の形態が対象とするプログラム記述は、言語の指定は特にないが、到達不能変数や未使用変数が記述に含まれず、静的コード解析で下記が可能であると仮定する。下記が満たされる場合、プログラムから到達不能変数や未使用変数を自動で削除可能となるため、本実施の形態が対象とするプログラムは下記条件のみを満たせば良い事となる。
(1)関数間の依存関係を表すCall Graphが構築可能
(2)データフローグラフが構築可能
(3)制御フローグラフが構築可能
(4)再帰記述は繰返し記述に変換可能
(5)構造化されており、ソースコードレベルでのジャンプ記述は非存在
以下、再帰記述は全て繰返し処理記述に変換されているものとする。また、大域変数は用いられていないものとする。
また、動的プログラム更新での差分プログラムや更新プログラムのプログラムメモリへの動的配置を、プログラム実行を行うプロセッサが実施する場合は、下記を必ず実施するものとする。
(1)動的配置前のプロセッサレジスタの値を退避し、切り替え直前にプロセッサレジスタ値を復旧すること
(2)差分プログラムや更新プログラムをプログラムメモリへ格納する際に使用するメモリ領域は、(1)同様、退避及び復旧を行うか、プログラム実行領域と異なる領域を利用し、動的配置がプログラム実行に影響しないよう管理すること
また、本システムの適用対象分野は、リアルタイムシステム、特にハードリアルタイムシステムである。特に、プロセッサ上のサービスとして、タスクディスパッチャを最低限具備しているものとする。また、動的プログラム更新適用対象組込み機器は、非特許文献3又は4のような、プログラム配置機構とプログラム更新機構を具備しているものとする。動的プログラム変更手続きの一例としては、タスクディスパッチャがタスクの実行状況を確認する事で後述する切り替えタイミング条件を満たすか判定し、更新があるか否かを表すレジスタ値などフラグ値をポーリングし、更新がある場合に動的プログラム更新を実施する、といった手続きが挙げられる。ここで、判定やポーリング、切り替え処理はタスクディスパッチャからの割込みにより起動された割込みハンドラで実施しても良い。
続いて本実施の形態の構成について説明する。
本実施の形態は、更新前プログラムと更新後プログラム、及びユーザ指定更新可能変数情報を受け付け、動的更新可能かの十分条件判定を実施し、判定結果を返す手段及びシステムである。当該手段又はシステムは差分プログラムを生成しても良い。本実施の形態1にかかるシステム構成を図2に示す。また、組込み機器での動的プログラム更新を、プロセッサ上の全タスクが実行を完了し、全てアイドル状態となったときのみに実施する手段を含む。
動的更新可能かの十分条件は下記の通りである。
条件1. Pにおける有効なプログラム実行トレースを、有効なプログラム実行トレースとしてP'が全て含む。
条件2. プロセッサレジスタ以外の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に含まれる変数の集合
Λ={ユーザ指定更新可能変数}∪{固定定数変数}
:ユーザが指定した更新可能変数、及び固定定数変数を加えた変数の集合
ユーザ指定更新可能変数は、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。
固定定数変数は、大域変数が存在しないとの前提から関数内で宣言されており、プログラム実行での変更がない定数変数の事である。例えば、フィルタ処理での固定フィルタ定数係数などが該当する。
条件1からP'の動きをPで一部模倣可能であり、条件2から更新可能変数がP'のみで新たに導入された変数とユーザが更新を許可した変数に制限されており、組込み機器での動的プログラム更新をプロセッサ上の全タスクがアイドル状態となったとき、即ち変数更新がプログラム更新に影響を与えないタイミングで行う。これらの事から、非特許文献1の議論により、動的更新可能条件である「プログラム実行途中でプログラムの更新を実施した後、有限回のステップ実行で、更新プログラムを初期状態から実行して到達可能な状態へ必ず到達する事」が満たされる事が解る。
また、更新条件から、プログラムコンテキストのトレースが不要である事が解り、実行時オーバーヘッドが、トレース実施が前提の従来手法より大きく低減されている事が解る。
更新前プログラムと更新後プログラムを対象とした条件2の確認実施は、それぞれのプログラムに未使用変数や到達不能コードが事前に削除されており、存在しない前提から、一般的なデータフロー解析で実現可能である。
更新前プログラムと更新後プログラムを対象とした条件1の確認実施は、非特許文献1では直接述べられていない。特に修正前後の2つのプログラムで動的切り替えが可能なプログラム・ポイント導出手法に基づく手法を提案出来たとしても、前記プログラム・ポイント導出が記述の意味ではなく文法に基づく方法である。そのため、更新後プログラムで更新前プログラムの意味を変更する事なくコード移動を行うなどのコード最適化を行った場合は、適切なプログラム・ポイントの導出が出来ないという問題がある。即ち、条件1の確認実施は自明でない。本確認手段は、本実施の形態において明らかとされる。
(1.システム構成)
図2に本実施の形態1にかかるシステム構成を示す。判定装置104は、更新前プログラム101、更新後プログラム102、及びユーザ指定更新可能変数103を入力し、動的更新可能かの十分判定処理を行い、判定結果106及び差分プログラム105を出力する。ここで、ユーザ指定更新可能変数103は、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。ユーザ指定更新可能変数103は、例えば、設定済みのペリフェラルI/Oレジスタである。ユーザは、当該レジスタ値の動的更新がプログラム全体の動作に対して影響しない場合に、当該レジスタに対応する変数をユーザ指定更新可能変数103に指定する。尚、更新前プログラム101は、第1のプログラムの一例であり、更新後プログラム102は、第2のプログラムの一例である。
判定装置104は、差分コード生成部1041と、論理式導出部1042と、判定部1043とを備える。差分コード生成部1041は、更新前プログラム101のうち更新後プログラム102と異なるコード片の集合を示す第1の差分コードを生成する。また、差分コード生成部1041は、更新後プログラム102のうち更新前プログラム101と異なるコード片の集合を示す第2の差分コードを生成する。論理式導出部1042は、第1の差分コードから所定の変換により第1の論理式を導出する。また、論理式導出部1042は、第2の差分コードから所定の変換により第2の論理式を導出する。判定部1043は、第2の論理式が第1の論理式を含むか否かにより、上述した組込み機器における更新前プログラム101から更新後プログラム102への動的更新の可否を判定し、判定結果106及び差分プログラム105を出力する。尚、差分プログラム105は、少なくとも第2の差分コードを含み、第1の差分コードを含めても良い。
本実施の形態にかかる組込み機器での動的プログラム更新は、プロセッサ上の全タスクが、アイドル状態となったときに、組込み機器が具備するプログラム切り替え機構を用いて実施する。例えば、動的プログラム配置をプログラム実行中に実施し、プロセッサ上で動作するタスクディスパッチャが、全タスクがアイドル状態となった事を確認し、更新要求を格納するレジスタ値をポーリング読出し、更新要求有無を確認、要求があると確認出来た場合に、更新前プログラムに対して、更新部分に対応する差分コードのみを実行するよう制御するためのアドレス変換器をイネーブルする事で実現される。
(2.条件1の判定手続き概要)
更新前プログラムと更新後プログラム全体で条件1を満たすか否かの判定は、プログラム記述へ課した仮定から計算可能であるが、現実的な時間で処理を終える事は一般に困難であると考えられる。そこで、下記2つの重要な性質に着目する。
性質1. 2つのプログラムで異なっているのは差分コード部のみ
性質2. プログラムは実行順に関して自然な半順序を持つ
性質2から、更新前後で差異がある部分が条件1を満たすか否かの判定処理実行順を、図3の更新前の差異部間のグラフ構造301と更新後の差異部のグラフ構造302に示すように、トポロジカルソートを行う事で定義可能である。従って、以下のような記号定義が矛盾なく実施可能となる。
orig i:更新前後で差異が生じる更新前プログラムのi番目の差異部
update i:更新前後で差異が生じる更新後プログラムのi番目の差異部
Figure 0006637398
・・・(1)
:orig iとupdate iで条件1が満たされる
これと性質2より、例えば式(1)が満たされている場合、更新前プログラムの先頭からorig 2直前に至るまでの全プログラムパスと、更新後プログラムの先頭からupdate 2直前に至るまでの全プログラムパスとで条件1が満たされることが解る。任意に一つ選んだkに対して、k番目まで以下の式(2)が成り立っているとする。
Figure 0006637398
・・・(2)
この場合、再び性質1と2とから、更新前プログラムの先頭からorig k+1直前に至るまでの全プログラムパスと、更新後プログラムの先頭からupdate k+1直前に至るまでの全プログラムパスとで条件1が満たされる。ここで、kは任意であったため、全ての差異部で条件1が満たされれば、更新前後でプログラムが条件1を満たす事となる。従って、各kに対して、式(2)が成立している事を示せば良い。残る問題は、orig k、update kの構築手法と、式(2)の判定手法である。
図4に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解析に関しては非特許文献5に開示されている。
続いて、以下の定義で参照されるV3に含まれる変数の集合として、名前の異なる変数を求める。
Δ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内最初の文の集合
そして、下記の処理を実施する。
1)LastDefStmt(Δorig k)≠φなら、LastDefStmt(Δorig k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びHyperBlock集合からorig kに至るプログラムパスをorig kに加えたものを、新たにorig kとする。ここで、これらorig kに加えたコードの中で元々のorig kに到達しないコードを削除しても良い。
2)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集合内のコードを削除しても良い。
3)LastDefStmt(Δupdate k)≠φなら、LastDefStmt(Δupdate k)に含まれる文を含むBasic Block集合を求め、それらBasic Block集合を包含するHyperBlock集合を求める。HyperBlock集合及びHyperBlock集合からupdate kに至るプログラムパスをupdate kに加えたものを、新たにupdate kとする。ここで、これらupdate kに加えたコードの中で元々のupdate kに到達しないコードを削除しても良い。
4)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上で上記3)と4)を実施し得られたHyperBlockをorig kとする。
尚、Basic BlockやHyperBlockに関しては、非特許文献6に開示されている。
そして、得られたorig kとupdate k夫々からユーザ指定更新可能変数の定義文や参照文を全て削除する。
最後に、update kに、{V2−dep(V2, V1)}∪Λの元に該当する変数が含まれている場合は、当該変数集合をUV(update k)として識別する。UV(update k)に含まれる変数は、式(2)の判定にて、任意の値をとる変数として解釈する。
一方で、orig kに、V2−dep(V3, V1)の元に該当する変数が含まれる場合、当該変数はupdate kに存在せずorig kにのみ存在する変数となる。P、P'ともに未使用変数や到達不能変数が存在しないという仮定から、update kではorig kから当該変数への代入や参照などの文が削除されている事となる。それ故、式(2)は不成立となり、条件1は満たされない、と判断される。
各kでの式(2)の判定は、両方ともに非決定分岐を含まず、非決定分岐が含まれない場合トレース関係・等価性と模倣関係・双模倣等価性が一致するため、模倣(Simulation))の判定問題に帰着する事で実施する。特に双模倣(Bisimulation)判定を実施して一致が確認できた場合、orig k = update k、即ちorig kとupdate kは文法的に異なるが意味が同一な差分コードである事が示される。動作実行サイクル数のみが修正されていると解釈できる。
尚、模倣や双模倣に関しては、非特許文献7に開示されている。
(3.動的更新可能十分条件判定全体フロー)
図5に、動的更新可能かの十分条件判定処理の全体フローの一例を示す。
(1)S1で、差分コード生成部1041は、V2−dep(V3,V1)=φか否か判定し、不成立の場合、条件1を満たさないとして判定処理を終了する。成立した場合、差分コード生成部1041は、更新前プログラムと更新後プログラムの差分部の対応を取り、{(orig k, update k)|0<=k<=N}を作成する。ここで、Nは差分があった箇所の総数である。差分部の対応は、UNIX(登録商標)コマンドvimdiffでの出力と同様に図6に示す形で得られるものとする。図6では、更新前プログラム601と更新後プログラム602が与えられており、一致箇所と変更箇所の対応が示されている。例えば、左辺変数が一致しているが、右辺が異なる場合や、分岐文で条件判定式が一部変更されている場合などで、変更前1と変更後1のような対応関係が得られ、加えて文の追加が行われている場合などで、変更前2と変更後2のような対応関係が得られる。図示していないが、文の削除を伴う場合でも、変更前後の関係が得られる。
(2)S2で、論理式導出部1042は、各kに対して、orig k、update k夫々のコードの簡約化を実施する。コードのループ記述が含まれないものに関しては、S3をスキップして、S4へ処理を移行する。
(3)S3で、論理式導出部1042は、各kに対して、簡約化後のorig k、update k夫々のコードから拡張有限状態機(EFSM:Extended Finite State Machine)を構築する。
(4)S4で、コードがループ記述を含む場合、論理式導出部1042は、各kに対して、orig k、update k夫々から構築したEFSMからSMT(Satisfiability Modulo Theories)式への変換を実施する。尚、ループ記述を含まない場合、論理式導出部1042は、S2で簡約化されたコードから直接、SMT式への変換を実施する。尚、S2、S3及びS4は、所定の変換の一例である。
(5)S5で、判定部1043は、各kに対して、orig k、update k夫々から構成したSMT式を用いて模倣判定を実施する。
(4.関数階層を考慮した差分コード生成処理)
図7に関数階層を考慮した差分コード生成処理フローの一例を示す。
(1)S1−1で、差分コード生成部1041は、関数の呼び出し関係をグラフ表現したコールグラフを対象として、更新前後での差分情報を取得する。
(2)S1−2で、差分コード生成部1041は、固定定数変数データの差分を生成する。
(3)更新前後での差異が現れる関数は一般に複数存在し得るため、その数に対して上限Nがある場合、S1−3で、差分コード生成部1041は、差異のある関数の数がNを越えるか否か判定する。差異のある関数の数がNを超える場合は、S1−4で、差分コード生成部1041は、対象となる関数の配置アドレスを考慮しつつ関数の数がN以下となるよう関数のマージを実施する。例えば、アドレスが連続になるように関数を連結する。差異のある関数の数がNを越えない場合、処理をS1−5へ移行する。上限Nがない場合は、処理せずS1−5へ処理を移行する。
(4)S1−5で、差分コード生成部1041は、更新前後の対応付けが成された各関数でのSSA(静的単一代入形式、Single Static Assignment Form)での差分コードの対応関係{orig k, update k}の抽出を実施する。
(5)更新前後での差異が現れるコード塊(以下、差分コード片)は一般に複数存在し得るため、その数に対して上限Nがある場合、S1−6で、差分コード生成部1041は、関数内での差分コード片のマージ処理を実施する。尚、図7の右下にS1−6により解かれる最適化問題を示す。但し、S1−6の詳細は後述する。上限Nがない場合は、処理せずS1−7へ処理を移行する。
(6)S1−7で、差分コード生成部1041は、差分SSAを用いた差分オブジェクトコードを生成する。
(7)S1−8で、差分コード生成部1041は、上記組込み機器での差分オブジェクトコードに修正するためのリロケータブルなオブジェクトコードを生成する。上記組込み機器が具備するプログラム更新機構を用いない場合は、本ステップをスキップする。
ここで、上記組込み機器が具備するプログラム更新機構における更新後のプログラムの実行手順について説明する。図29は、更新後のプログラム実行手順例を説明する模式図である。ここでは、プログラムROM407の第1の面に、更新前プログラムオブジェクトコードが配置され、プログラムROM407の第2の面に、更新差分プログラムオブジェクトコードの一部が配置されている場合を考える。ここで、第2の面に配置されているコードブロック800は、更新前プログラムオブジェクトコードの一部であるコードブロック801に対応しているものとする。CPU401によるプログラム実行の際、アドレス変換器402によるアドレス変換を実施する事で、コードブロック801がコードブロック800に置き換えられて実行される。このような方法により、更新後のプログラム実行を可能としている。以下、図29での更新後プログラム実行例を示す。
まず、CPU401のプログラムカウンタの値はWである(図中(1)参照)。このとき、アドレス変換テーブルの変換元アドレスにWが存在しないので、アドレス変換器402はWを出力する(図中(2)参照)。続いて、CPU401が、アドレスWにある命令Jump Xを実行し、プログラムカウンタをXに書き換える(図中(3)参照)。次に、CPUはアドレスXにある命令を読み出そうとするが(図中(4)参照)、Xが変換元アドレスに一致したため(図中(5)参照)、アドレス変換器402はアドレスYを出力する(図中(6)参照)。このため、CPU401はアドレスYから命令を読み出し、実行する(図中(7)参照)。その後、プログラムカウンタの値は、X+1に変更され、アドレス変換器402によって、X+1がY+1に読み替えられ、アドレスY+1にある命令が実行される。更新後コードブロック800の末尾には命令Jump Zが配置されており、これをCPU401が実行する(図中(8)参照)。その後、CPU401は、更新前プログラムのアドレスZから実行を継続する(図中(9)参照)。
ここで、アドレス変換器402によるアドレス変換の詳細を説明する。アドレス変換器402は、具体的には、CPU401により命令がデコードされることによって取得されたアドレスにおける予め定められたビット数の上位ビット列(以下、上位アドレスと称されうる)を変更し、かつ、変更された上位ビット列とアドレスの下位ビット列(以下、下位アドレスと称されうる)とを連結することにより、アドレスの変換を実現する。すなわち、アドレス変換器402は、入力された上位アドレスが、アドレス変換テーブルに登録された変換元アドレスに一致するか否か判定し、一致した場合、当該上位アドレスを変換先アドレスに置換し、変換した上位アドレスに下位アドレスを連接して出力する。このように、アドレス変換器402は、上位アドレスのビット数を一つのセグメントとして、アドレス変換を行う。これにより、アドレスの全ビットを変換対象とする場合に比べ、アドレス変換テーブルの大きさを小さくすることができる。図30は、アドレス変換器402によるアドレス変換の詳細を説明する模式図である。ここでは、アドレスのビット数が32ビットであるとし、アドレス変換器402に設定されるセグメントサイズが2バイトであるとする。この場合、例えば最大k個の変換が記されるアドレス変換テーブルには、変換元のアドレスとしての(32−s)ビットの上位アドレスと、変換先のアドレスとしての(32−s)ビットの上位アドレスとの対が格納されている。アドレス変換器402は、比較器430により、変換前アドレスの上位アドレスが、アドレス変換テーブルに示される変換元のアドレスと一致するか否かを判定する。セレクタ431は、一致する場合、アドレス変換テーブルに示される変換先のアドレスを出力し、一致しない場合、変換前アドレスの上位アドレスを出力する。その後、連結器432が、セレクタ431が出力した(32−s)ビットの上位アドレスと、sビットの変換前アドレスの下位アドレスを連結し、変換後アドレスを生成する。
尚、プログラム実行中の動的差分コード配置では、2面以上の物理的メモリ面配置が必要となるが、アドレス変換器の切り替えによるプログラム更新のみを動的に実行する対象とする場合は、その必要はなく、更新前プログラム、差分コード、アドレス変換器設定が成されていれば、(十分条件を満たす限りにおいて)動的なプログラム更新のデバイスでの実行が可能となる。それ故、本明細書では、より条件の緩い、メモリは1面以上配置されている、としている。
図7に戻り説明を続ける。
(8)S1−9で、差分コード生成部1041は、アドレス解決を行うためのリンカスクリプトを生成する。
(9)S1−10で、差分コード生成部1041は、差分コード、それ以外のアドレス解決済みオブジェクトコード、及びリンカスクリプトを用いて、差分コードのオブジェクトコード(差分バイナリ)を生成する。
ここで、S1−1の具体的処理の説明に先立って、図8にコールグラフの例を示す。制御フローとデータフローの解析が可能であるとの仮定から、関数の呼び出し関係を表すコールグラフが構築可能であり、再帰呼び出しが存在しないとの仮定からコールグラフが必ずDAG(有効グラフ、Directed Acyclic Graph)になる事に注意する。更新前のコールグラフ例を501に、更新後のコールグラフ例を502に示す。ここで、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}
として得られる。一般に関数は、複数箇所から呼び出される傾向にあるため、501に含まれず502に含まれる関数jをInlineして扱うのは非効率であると考えられる。そのため、Inlineせずにコールグラフでの差分を識別する必要がある。この実現では、DAG構造のコールグラフの葉ノードからDAGの始点ノードに向かって、更新前コールグラフと更新後コールグラフの違いを識別する事が一つの方法となる。
図9にコールグラフの差分構築処理の概要を示す。更新前のコールグラフ例を504に、更新後のコールグラフ例を505に示す。ここで、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}
として得られる。関数を展開する事なく差分を識別する場合、差分として識別された関数を呼び出す関数も、前記呼び出しが少なくとも差分となるため、同時に識別する必要がある。更新前後それぞれのコールグラフのノードに対してトポロジカルソートを実施し、逆順に比較を実施しつつ差分関数ノードを識別し、コールグラフで差分関数への出力エッジを持つ関数ノードを更新で呼び出し関数が増加した関数としてマークしている例を506に示す。
図10に、コールグラフでの差分関数と差分関数呼び出し関数の識別処理フローの一例を示す。ここで、
get_prev_node(Call Graph cg, node n)
を、コールグラフcgにおいて、cgのノードnへの出力エッジを持つcg上のノード全てを返す関数とする。
(1)S−1−1で、差分コード生成部1041は、Oldを更新前プログラムのコールグラフ、Newを更新後プログラムのコールグラフとして初期化する。
(2)S1−1−2で、差分コード生成部1041は、Oldをトポロジカルソートして逆順の順番ラベルをOldの各ノードに与えたものをtp_sort_old_func、Newをトポロジカルソートして逆順の順番ラベルをNewの各ノードに与えたものをtp_sort_new_func、とする。
(3)S1−1−3で、差分コード生成部1041は、順番を付けたコールグラフ間のノードの差集合を下記で算出する。
diff_func1
=tp_sort_old_funcの全ノード − tp_sort_new_funcの全ノード
diff_func2
=tp_sort_new_funcの全ノード − tp_sort_old_funcの全ノード
(4)S1−1−4で、差分コード生成部1041は、集合C1をφ(空集合)として初期化する。
(5)S1−1−5で、差分コード生成部1041は、diff_func1に含まれるノードを取り出し、全ノードが取り出されるまで順次S1−1−6を実施する。ここで、取り出したノードをoとして表す。
(6)S1−1−6で、差分コード生成部1041は、下記演算を行う事で差分関数呼び出し関数を識別する。
C1 := C1 ∪ {get_prev_node(Old,o)}
(7)S1−1−7で、差分コード生成部1041は、集合C2をφ(空集合)として初期化する。
(8)S1−1−8で、差分コード生成部1041は、diff_func2に含まれるノードを取り出し、全ノードが取り出されるまで順次S1−1−9を実施。ここで、取り出したノードをnとして表す。
(9)S1−1−9で、差分コード生成部1041は、下記演算を行う事で差分関数呼び出し関数を識別する。
C2 := C2 ∪ {get_prev_node(New,o)}
(10)S1−1−10で、差分コード生成部1041は、C1、C2、diff_func2を処理結果として返し、処理を終了する。
ここで、組み込み機器における「アドレス変換による差分コードの実行方式」について以下に説明する。
まず、更新前プログラムと差分プログラムの間のプログラム実行遷移について説明する。図31は、更新前プログラムと差分プログラムの間のプログラム実行遷移の様子を示す模式図である。ここではメモリ空間Aに更新前プログラムのオブジェクトコードが配置されている。メモリ空間Aにおいて、Const変数及び列挙型値などのテキストセグメントに配置される定数変数とその値がメモリ領域802に、関数fがメモリ領域803に、関数gがメモリ領域804に、関数hがメモリ領域805に、初期値付き変数がメモリ領域806に、初期値なし変数がメモリ領域807に、スタックなどをメモリ領域808に配置した例を示している。またメモリ空間Bに、更新差分プログラムのオブジェクトコードが配置されている。パッチ809は、関数fの一部に対応する更新差分プログラムオブジェクトコード、パッチ810は、関数gの一部に対応する更新差分プログラムオブジェクトコード、パッチ811は、関数hの一部に対応する更新差分プログラムオブジェクトコード、に夫々対応しているものとする。図31に記載のコード間のプログラム実行遷移例を以下に示す。
まず、CPU401による関数fの実行中に、アドレス変換により、パッチ809の先頭アドレスにプログラムの実行が遷移する。パッチ809における関数gの実行では、メモリ空間Aに配置された関数gの先頭アドレスが呼び出される。関数gの呼び出し完了後は、パッチ809の関数gの呼び出し位置の次のアドレスにプログラムの実行が遷移し、パッチ809の残りのプログラムの実行がなされる。そして、パッチ809の実行完了後に戻るべき関数fのアドレスへと、プログラムの実行が遷移する。次に、CPU401による関数g実行中に、アドレス変換により、パッチ810の先頭アドレスにプログラムの実行が遷移する。パッチ810における関数hの実行では、メモリ空間Aに配置された関数hの先頭アドレスが呼び出される。関数hの呼び出し完了後は、パッチ810の関数hの呼び出し位置の次のアドレスに、プログラムの実行が遷移し、パッチ810の残りのプログラムの実行がなされる。そして、パッチ810の実行完了後に戻るべき関数gのアドレスへと、プログラムの実行が遷移する。次に、CPU401での関数hの実行中に、アドレス変換により、パッチ811の先頭アドレスにプログラムの実行が遷移する。そして、パッチ811の実行完了後に戻るべき関数hのアドレスへと、プログラムの実行が遷移する。その後、CPU401は、関数hの実行を継続し、プログラムの実行を完了する。
次に、変換されたアドレスと差分コードの対応例について図32〜図35を参照しながら説明する。図32は、変換されたアドレスと差分コードの対応例を示す模式図である。ここでは、置換対象コード812を差分コード813で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図32に示す例は、差分コードサイズtが置換対象コードのサイズsと同じ、又は置換対象コードのサイズsより小さい場合であって、sとtがプログラム用アドレス変換器402Aに設定されるセグメントサイズ以下の場合の例である。置換対象コード812の先頭アドレスにCPU401によるプログラム実行が到達すると、プログラム用アドレス変換器402Aにより、プログラムカウンタに設定されたアドレスが、差分コード813の先頭アドレスに変換され、プログラム遷移が実施される。プログラム用アドレス変換器402Aが順次、変換前アドレスを差分コード813のアドレスに変換しつつ、差分コード813の終了アドレスまでプログラム実行が継続される。差分コード813の終了アドレスには、置換対象コード812の終了アドレスの次のアドレスへのJUMP(ジャンプ)命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
図33は、変換されたアドレスと差分コードの別の対応例を示す模式図である。ここでは、置換対象コード814を差分コード815で置換えることにより、更新後のプログラムが実行される場合を例に説明する。なお、図33に示す例は、差分コードサイズtが置換対象コードのサイズsより大きい場合か、またはsとtの何れかがプログラム用アドレス変換器402Aに設定されるセグメントサイズより大きい場合に対応している。置換対象コード814の先頭アドレスにCPU401によるプログラム実行が到達すると、プログラム用アドレス変換器402Aにより、プログラムカウンタに設定されたアドレスが、差分コード815の先頭アドレスに変換され、プログラム遷移が実施される。差分コード815の先頭には、更新差分プログラムの開始アドレスへのジャンプ命令に関わる命令が配置されている。ここで、ジャンプ命令に関わる命令には、ジャンプを実施するオブジェクトコードが含まれるが、必要に応じて、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコード、及びジャンプ先のアドレス計算を実施するオブジェクトコードが含まれてもよい。なお、レジスタの記憶内容の退避及び復旧を実施するオブジェクトコードは、次のような理由により必要となる場合がある。ジャンプ命令のジャンプ先アドレスの計算を行う命令の挿入が一般には必要となるが、ジャンプ命令のためのアドレス計算に必要となる命令列とジャンプ命令は、更新差分バイナリ生成時に挿入されるものであり、更新差分バイナリを生成するための更新プログラムには元々存在しない命令列である。つまり、この命令列は、更新プログラムを実行した場合には本来現れない命令列である。従って、これら命令列の実行は、本来あるべきCPUレジスタ状態と異なるCPUレジスタ状態を構成し得る。それ故、これら命令列の実行前のCPUのレジスタ状態をレジスタ退避により保持し、実行後にレジスタ復旧する事で、これら命令列のCPUレジスタ状態への影響が排除される。ここで、ジャンプ先のアドレスは、例えば、ジャンプ命令に関わる命令列のオブジェクトコードが完了するアドレスの次のアドレスである。これにより、ジャンプ命令によるプログラム遷移後、CPU401は、差分コード815の終了アドレスまでプログラム実行を継続する。差分コード815の終了アドレスには、置換対象コード814の終了アドレスの次のアドレスへのジャンプ命令が配置されており、更新前コードの残りのプログラムの実行が再開される。
このように、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合、アドレス変換器402は、次のようなアドレス変換を行う。すなわち、アドレス変換器402は、置換対象部分のコードの開始アドレスを、置換対象部分のコードに代わる命令列の開始アドレスへのジャンプ命令に関わる命令が記憶されたアドレスへと変換する。このようにすれば、プログラムにおける置換対象部分のコードのサイズよりも、置換対象部分のコードの代わりとなる差分コードのサイズが大きい場合、又は、置換対象のコードのサイズ若しくは差分コードのサイズがセグメントサイズより大きい場合であっても、適切に更新後のプログラムの実行を実現することが可能となる。
次に、変数についての更新がある場合の例について図34及び図35を参照して説明する。図34は、変数についての更新がある場合の、変換されたアドレスと差分コードの対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、更新に伴い、Const変数や列挙型値などテキストセグメントに配置される定数変数の追加、定数変数の変更、又は初期値付き変数の追加があり、これら変数に差分コードのみからアクセスされる例に対応している。変数の追加又は変更があった部分は元々メモリ空間Aに配置されている変数ではなく、メモリ空間Bに配置した変数を参照しつつ、図32又は図33の実行方法に従ってプログラム実行が行われる。これら変数は差分コードが配置されるメモリ空間Bに新たに差分コードの一部として配置され、差分コード実行時には、追加又は変更があった部分に関しては、元々メモリ空間Aに配置されている変数ではなく、メモリ空間Bの変数が参照されてプログラムが実行される事で、変数の値更新が実現される。
図35は、変数についての更新がある場合の、変換されたアドレスと差分コードの別の対応例を示す模式図である。この図は、置換対象コードを差分コードで置換えて、更新後のプログラムが実行される場合であって、大域変数である初期値付き変数又は局所変数である初期値付き変数の初期値の変更があるとき、又は更新前コードから参照される初期値付き変数の追加があるときの例に対応している。これら変更又は追加があった部分はメモリ空間Bに新たに配置した変数群をアドレス変換機構を援用して参照しつつ、図32又は図33の実行方法に従ってプログラム実行が行われる。初期値変更又は、初期値付き変数の追加があった部分に関しては、メモリ空間Aに配置されている変数であって変更又は追加の影響を受ける変数群に対して、追加される変数群又は変更後の変数群を、差分コードが配置されているメモリ空間Bに新たに配置し、差分コード実行時には、アドレス変換機構を用いてこれら変数を参照し実行する事で、追加又は変更を伴うプログラム実行が実現される。特に、局所変数の場合は、メモリ空間B上に配置された変数へのアクセスを実施するのに対し、大域変数の場合は、メモリ空間Bに配置された変数がリブート後にデータセグメント(データセグメントがSRAM406に割り当てられている場合はSRAM406、データROM408に割り当てられている場合はデータROM408)に展開された後、初期値付き変数の追加又は変更を伴うプログラム実行がなされる。上記において、メモリ空間Aとメモリ空間Bは、同一メモリ空間に配置されていて、開始先頭アドレスが異なっていさえすれば良い。
図11、図12、図13に、固定定数変数の差分生成処理フローの一例を示す。尚、ここでは、アドレス変換による差分コードの実行方式を前提とした場合の差分生成フローの一例を示す。アドレス変換方式ではない、差分コードと更新前プログラムから更新後プログラムを構築する従来手法の場合、本処理は不要とであるため、スキップすれば良い。
(1)S1−2−1で、差分コード生成部1041は、更新前プログラムと更新後プログラムの両方で用いられている関数からなる、同じ順番で並べたリストを下記演算で構成する。
new_func
= tp_sort_new_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func2
old_func
= tp_sort_old_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func1
(2)S1−2−2で、差分コード生成部1041は、集合Lをφ(空集合)として初期化する。
(3)S1−2−3で、差分コード生成部1041は、new_funcに含まれるノードを取り出し、全ノードが取り出されるまで順次S1−2−4からS1−2−8を実施する。ここで、取り出したノードをf_newとして表す。
(4)S1−2−4で、差分コード生成部1041は、f_newと対応する、old_funcの元f_oldを取り出す。
(5)S1−2−5で、差分コード生成部1041は、f_newにテキストセグメントが含まれるか確認し、含まれる場合、S1−2−6へ処理を移行し、そうでない場合、(3)での繰返し処理を1つ進めて継続する。
(6)S1−2−6で、差分コード生成部1041は、f_oldにテキストセグメントが含まれるか確認する。f_oldにテキストセグメントが含まれる場合、S1−2−7へ処理を移行する。f_oldにテキストセグメントが含まれない場合、S1−2−8へ処理を移行する。
(7)S1−2−7で、差分コード生成部1041は、f_oldのテキストセグメントの先頭アドレスを求めて、head_adderとする。差分コード生成部1041は、f_newの先頭アドレスも同じhead_adderとする。f_oldのセグメントサイズをsize_oとして、最終アドレスを
last_addr_o=head_adder+size_o
として算出する。同様に、差分コード生成部1041は、f_newのセグメントサイズをsize_nとして、最終アドレスを
last_addr_n=head_adder+size_o
として算出する。差分コード生成部1041は、集合Lを下記で更新する。
L = L∪{(f_new,head_addr,size_n,last_addr_n),
(f_old,head_addr,size_o,last_addr_o)}
(8)S1−2−8で、差分コード生成部1041は、f_newのテキストセグメント、即ち固定定数変数を更新面に配置するものとして、具体的なアドレス決定は図7での処理S1−9で行うものとする。
(9)S1−2−9で、差分コード生成部1041は、Lをhead_addrをキーとしてソートし、それを新たにLとする
(10)S1−2−10で、差分コード生成部1041は、集合Mをφ(空集合)として初期化する。
(11)S1−2−11で、差分コード生成部1041は、リストLに含まれる連続したノード2つを取り出し、1個づつずらしながら順次2ノードを全て取り出すまで、順次S1−2−12、S1−2−13を繰返し実施する。ここで、取り出した2つのノードを{a,b}として表す。例えば、L={a,b,c,d}なら、順次実施される2ノードの取り出しでは{a,b}{b,c}{c,d}となる。
(12)S1−2−12で、差分コード生成部1041は、aのテキストセグメントの最終アドレスと、その後段に配置されるべきbのテキストセグメントの先頭アドレスを以下の式(3)のブール式として比較する。
Figure 0006637398
・・・(3)
結果が真ならS1−2−13へ処理を移行する。結果が偽なら、(11)での繰返し処理を継続する。
(13)S1−2−13で、差分コード生成部1041は、下記処理を実施し、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)
(14)S1−2−14で、差分コード生成部1041は、結果得られた集合Mを返す。
(15)S1−2−15で、差分コード生成部1041は、集合Nをφ(空集合)として初期化する。
(16)S1−2−16で、差分コード生成部1041は、Lに含まれるノードを取り出し、全ノードが取り出されるまで順次S1−2−17からS1−2−19を実施する。ここで、取り出したノードをaとして表す。
(17)S1−2−17で、差分コード生成部1041は、更新前後で互いに対応する関数であるf_oldとf_newに対して、夫々含まれるテキストセグメントを比較して、f_oldのテキストセグメントがf_newのテキストセグメント先頭から完全一致する場合であって、夫々の終アドレスを
last_addr(a,f_old) < last_addr(a,f_new)
なるブール式として比較する。結果が真ならS1−2−18へ処理を移行する。結果が偽なら、(16)での繰返し処理を継続する。
(18)S1−2−18で、差分コード生成部1041は、a'として下記を算出する。
a’ = last_addr(a,f_old) 〜 last_addr(a,f_new)
具体的には、差分コード生成部1041は、下記を算出する。
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)
であるとする。
(19)S1−2−19で、差分コード生成部1041は、集合Nと集合Mを下記で更新する。
N = N ∪ {a’}
M = M − {a}
(20)S1−2−20で、差分コード生成部1041は、M∪Nを構築し、テキストが配置されていないアドレス空間を識別し、その空間移行に配置された各テキストセグメントの先頭アドレスと最終アドレスに当該空間のサイズをオフセットとして加える処理を、アドレスの若い順に、テキストが配置されていない空間に対して実施する。
図14及び図15に、各関数でのSSA形式を考慮したdiff形式、vimdiff形式の差分コード対を構築するための処理フローの一例を示す。ここで、diff形式やvimdiff形式の結果の取得では、UNIX(登録商標)コマンドのdiffやvimdiffを用いても良い。
(1)S1−5−1で、差分コード生成部1041は、集合XとYをそれぞれφ(空集合)として初期化する。
(2)S1−5−2で、差分コード生成部1041は、リストnew_funcの各元f_newに対して、S1−5−3からS1−5−12を繰り返し実施する。ここで、new_funcとold_funcは、図11のS1−2−1で構成したリストである。具体的には、下記で構成したリストである。
new_func
= tp_sort_new_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func2
old_func
= tp_sort_old_funcのトポロジカルソートの逆順に配置されたノードのリスト − diff_func1
(3)S1−5−3で、差分コード生成部1041は、f_newと対応するold_funcの元f_oldを取り出す。
(4)S1−5−4で、差分コード生成部1041は、f_newとf_oldのアセンブリコードを下記で構成する。
f_new_asm
= f_newのプログラム記述を、アドレス割当てやレジスタ割当てを 実施せずコンパイルして得られた、リロケータブルなアセンブリ記述
f_old_asm
= 組込み機器で動作中のオブジェクトコード内の関数f_oldに対応するアセンブリ記述
(5)S1−5−5で、差分コード生成部1041は、変数の区別を型の区別として抽象化してf_new_asm'、 f_old_asm'とし、f_new_asmとf_new_asm'、f_old_asmとf_old_asm'、各々での対応関係を保持する。この処理を<1>とする。
(6)S1−5−6で、差分コード生成部1041は、f_new_asm'、 f_old_asm'との差分を、最長パターンマッチのdiffアルゴリズムを用いて取得する。この処理を<2>とする。
(7)S1−5−7で、差分コード生成部1041は、一致箇所について、変数同士の干渉グラフから導出した制約を満たす範囲でf_old_asmの変数名と同一となるようにf_new_asm'への変数名割当てを実施する。その後、差分コード生成部1041は、レジスタ数が無限後存在するという仮定の下で、不一致箇所に異なる変数名の割当てを実施する。この処理を<3>とする。ここで、干渉グラフを用いた変数名割当て制約の導出に関しては、非特許文献5に開示されている。
(8)S1−5−8で、差分コード生成部1041は、f_new_asm'への対象組込み機器搭載プロセッサに搭載されているCPUレジスタ数を考慮したレジスタ割当てを実施する。
(9)S1−5−9で、差分コード生成部1041は、<1>、<2>及び<3>を再度実施する。但し、変数名割当て時は対象組込み機器搭載プロセッサに搭載されているCPUレジスタ数を仮定する。必要に応じてスピルコードの挿入を実施し、差分が最小化されるようf_new_asmのアセンブリコードを生成する。
(10)S1−5−10で、差分コード生成部1041は、これまでの構成で識別しているf_new_asmとf_old_asmの差分コード情報を、
d = {(差分コード,head_addr,size,last_addr)}
として格納する。
(11)S1−5−11で、差分コード生成部1041は、これまでの構成で識別しているf_new_asmとf_old_asmの差分情報を、vimdiff形式で
Vimdiff(d)={((f_new,差分コード,head_addr,size_n,last_addr_n), (f_old,対応するコード,head_addr,size_o,last_addr_o))}
として格納する。
(12)S1−5−12で、差分コード生成部1041は、集合X、Yを次式で更新する。
X = X∪{d}
Y = Y∪{vimdiff(d)}
(13)S1−5−13で、差分コード生成部1041は、集合X、Yを処理結果として返し、処理を終了する。
図16のフローチャートに、関数内での差分コード片のマージ処理の一例を示す。また、図17は、関数内での差分コード片のマージ処理の概念を説明するための図である。
(1)S1−6−1で、差分コード生成部1041は、集合X、Yを図14及び図15のフローチャートの出力結果として、下記を満たすd1及びd2を選び、d' = merge(d1, d2)とする。
Figure 0006637398
・・・(4)
・ コード片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間の一致箇所を含めて結合する処理であり、結果として結合したコードを出力する。
(2)S1−6−2で、差分コード生成部1041は、集合X、Yを下記で更新する。
X = X − d1 − d2 + d’
Y = Y − vimdiff + vimdiff’
ここで、vimdiff'は702に示すように、変更後のd1,d2結合だけでなくd1,d2に対応する変更前コード(それぞれを、pd1,pd2とする)に対してmerge(pd1,pd2)を適用して得られた結合コードを利用して示される、更新前関数コードと更新後関数コードそれぞれの結合処理後のvimdiff結果を表す。
(3)S1−6−3で、差分コード生成部1041は、n = X に含まれるコード片の個数とする。
(4)S1−6−4で、差分コード生成部1041は、nが指定個数以下となったか否か確認し、そうなら処理を終了し、そうでない場合は処理をS1−6−1へ移行する。
図18に、図7のS1−8のリロケータブルなオブジェクトコード生成処理フローの一例を示す。
(1)S1−8−1で、差分コード生成部1041は、集合X、Yを図14及び図15のフローチャートの出力結果、または図16のフローチャートを実施した場合はその出力結果として、Xの各元dに対して、S1−8−2からS1−8−7を繰り返し実施する。ここで、dと対応するYの元をpdとする。
(2)S1−8−2で、差分コード生成部1041は、差分コードdのサイズが、差分コード配置メモリ空間のセグメントサイズを越えるか否か判定し、超える場合S1−8−4へ、越えない場合S1−8−3へ処理を移行する。
(3)S1−8−3で、差分コード生成部1041は、差分コードdのサイズが、対応する修正前コード部pdのサイズを越えるか否か判定し、超える場合S1−8−4へ処理を移行する。
(4)S1−8−4で、差分コード生成部1041は、CPUレジスタの退避コードを生成し、差分コードdの先頭に付加する。
(5)S1−8−5で、差分コード生成部1041は、差分コードに対応するコードの先頭アドレスを計算するコードを生成し、(4)で追加した退避コード直後に追加する。
(6)S1−8−6で、差分コード生成部1041は、CPUレジスタの復旧コードを生成し、(5)で追加した先頭アドレス計算コードの直後に追加する。
(7)S1−8−7で、差分コード生成部1041は、算出結果の先頭アドレスへ分岐するJump命令を生成し、(6)で追加したCPUレジスタ復旧コード直後に追加する。
図19に、図7のS1−9の差分コードのアドレス解決処理フローの一例を示す。
(1)S1−9−1で、差分コード生成部1041は、集合Xを図14及び図15のフローチャートの出力結果、または図18のフローチャートを実施した場合はその出力結果として、Xの各元dに対して、S1−9−2からS1−9−4を繰り返し実施する。
(2)S1−9−2で、差分コード生成部1041は、dをメモリ配置する際の先頭アドレス指定やアドレス解決済みsymbol tableを読込んでアドレス解決を実施するためのリンカスクリプトを生成する。
(3)S1−9−3で、差分コード生成部1041は、Symbol table中のアドレス未解決のsymbolを解決するためのリンカスクリプトを生成する。
(4)S1−9−4で、差分コード生成部1041は、dのコード見積りサイズからdの配置領域サイズを例えばセグメントサイズの整数倍などとして決定し、アセンブリコード各行のアドレスを決定するためのリンカスクリプトを生成する。
(5)S1−9−5で、差分コード生成部1041は、これまで生成されたリンカスクリプトをマージし、一つのリンカスクリプトとして生成する。
図20に、図7のS1−10の差分バイナリ生成処理フローの一例を示す。
(1)S1−10−1で、差分コード生成部1041は、差分以外の部分をインラインassembly化し、最適化抑止pragrmaを付加し、図19の処理結果であるリンカスクリプトを用いてコンパイルを実行し、差分バイナリを得る。
(5.更新対象部での更新前コードと更新後コードの簡約化)
図5のS2での処理に対応する処理の具体例の一例を図21に示す。処理手順に関しては、コンパイラの既存技術で実現できる事は、これら具体例から明らかであるため詳細は割愛する。図21には、(1)積極的コード移動(Eager Code Motion)、(2)不到達式削除(Dead code elimination)、及び(3)冗長削除(Redundancy Elimination)の具体例を示している。以下、夫々について説明する。ここで、以下の説明に先立って上述したorig k、update kの構築手法や条件1の式(2)の判定までの実施がなされているものとする。
(1)積極的コード移動(Eager Code Motion)
本例では、一般的なEager Code Motionを、コード移動対象文の数が増加しない場合にのみ行うものとする。801では、コード移動前後で
t=a+b
が2文から1文になっており、実施対象となる。一方、802では、コード移動前後で、1文が2文となるため実施対象とならない。
(2)不到達式削除(Dead code elimination)
本例では803に示す通り、Write after Writeの消去のみを実施する。また、前提として不到達コードは含まれていないものとしているため、一般的な到達不能式削除の実施は不要であり、(1)の処理で現れた場合に本処理を実施する。
(3)冗長式削除(Redundancy Elimination)
本例では、一般的な冗長式削除を新たな中間変数導入を一切行わない制限の下で実施する。804では、冗長式削除で中間変数導入が発生しないコピー伝搬による冗長式削除を実施した例を示している。共通部分式削除や部分冗長式削除でも、新たな中間変数導入が一切不要な場合は実施するものとする。尚、各差分コードへの上記(1)(2)及び(3)の適用は、この順に実施するものとする。これら処理により、後段のSMT導出処理や模倣(Simulation)判定、双模倣(Bisimulation)判定処理での計算負荷が軽減される事は、本明細書の中で明らかとなる。
これまで差分関数をinline展開せずに差分コードを構築する手法の一例を示した。しかしながら、更新前と更新後の各差分コードorig kとupdate kのサイズは、式(2)の判定処理に大きく影響を及ぼす。そのため、差分関数のinlineを適切に行う事での差分コードサイズ低減を行う事も検討される。図22に、差分コードサイズ低減のための差分関数のinline展開方針決定処理フローの一例を示す。尚、本処理を適用しない場合は、差分コードを構築後にinline展開を実施するものとする。
(1)S1−11−1で、差分コード生成部1041は、集合Inline_Funcをφ(空集合)として初期化する。ここで、Inline_Funcは、差分関数の集合の部分集合であって、差分コード構成に先立ってInline展開を実施する差分関数の集合を表す。
(2)S1−11−2で、差分コード生成部1041は、差分関数の元である関数fに対して、S1−11−2からS1−11−5を繰り返し実施する。
(3)S1−11−3で、差分コード生成部1041は、関数fをinline展開して差分コードを構築する。
(4)S1−11−4で、差分コード生成部1041は、差分コードサイズが減少したか否かを判定し、減少した場合S1−11−5へ処理を移行する。
(5)S1−11−5で、差分コード生成部1041は、Inline_Func={f}∪Inline_Funcを実施し、関数fを集合Inline_Funcに追加する。
(6.拡張有限状態機(EFSM:Extended Finite Stata Machine)の構成)
図23に、図5のS3でのEFSM構成手法の具体例の一例を示す。プラグラムコードから変換される制御フローグラフは一般的に知られており、制御フローグラフから変換されるEFSMの構成は、非特許文献8にて構成すれば実現できるため、詳細を割愛する。
901に制御フローグラフの一例を、902に901から上記非特許文献8にて構成されるEFSMの例を示す。901から902を構成するために、論理式導出部1042は、制御フローグラフの始点と各分岐に対して状態を割当て、状態から状態に至るまでを深さ優先探索で探索しつつ、902に示すように分岐条件を遷移条件とし、実行文を各状態遷移での実行文としてEFSMを構成する。ここで、分岐がなければ条件は無条件となり、902では、‘-’として無条件遷移である事を示している。
(7.SMT式導出)
図22で求めた集合Inline_Funcに含まれない差分関数は、更新後差分コードからのSMT式導出に先立って更新後差分コード内でInline展開されているものとする。
図24と、図5のS4でのSMT式導出の、ループなしの場合の具体例の一例を示す。EFSMからSMT式を導出するために、論理式導出部1042は、深さ優先探索を実施しつつ、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成する。図24はループなしの場合であるため、1001に対して深さ優先度を実施しつつ、各状態遷移の遷移条件と実行文の論理積を以下の式(5)の順に構成する。
Figure 0006637398
・・・(5)
そして、全体の論理積を構成し、1002に示す式(6)を構成している。
Figure 0006637398
・・・(6)
図25にループありの場合の、EFSMからのSMT式導出の処理フローの一例を示す。
(1)S4−1で、論理式導出部1042は、出力辺が2つ以上ある状態に論理和を取る状態である事をマーキングする。
(2)S4−2で、論理式導出部1042は、次のループバック状態や自身のループバック状態に至るまで深さ優先探索を実施し、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスの場合は論理和を構成し、得られた式全体で論理積を構成する。ここで、次のループバック状態を仮論理変数として配置する。
(3)S4−3で、論理式導出部1042は、次のループバック状態から、その次のループバック状態か自身のループバック状態か、既に探索した状態遷移を表すエッジに至るまで深さ優先探索を実施し、探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスでは論理和を構成し、得られた式全体で論理積を構成する。ここで、既に探索した状態遷移は式に含めない。次のループバック状態を仮論理変数として配置する。先のステップで配置した仮論理変数に得られた式を展開する。
(4)S4−4で、論理式導出部1042は、探索で全パスを覆ったか否か確認し、そうならS4−5へ、そうでないなら処理をS4−3へ移行する。
(5)S4−5で、論理式導出部1042は、得られた複数のSMT式を対象に共通部分式の削除と簡約化を実施する。
処理フローから明らかなように、ループ構造が同じであれば、プログラムの意味を保存する範囲での分岐構造の変更が成されていても、意味等価である事を双模倣等価性判定で示す事が可能なSMT式の導出が可能である。ループ構造の変更に対しては、処理に先立って対応する更新前後の差分コードに対して、do { ... } while(...);とwhile(...) { ... };の変換を実施する事でこれらの違いによる不一致判定を排除する。特に、更新前後の差分コードから、ループバック状態のみからなるDAGを夫々構成してgraphとして一致している場合にのみ、図25に示すSMT式構築処理を実施するものとする。
図26にループありの場合の、EFSMからのSMT式導出の具体例の一例を示す。1101が対象となる変更前後の差分コードの構造である。本例では、変更にて、t4がt4'に、t5がt5'に、t7がt7'に修正がなされとしている。1102が更新前差分コードのEFSMであり、分岐を表す状態に論理和Vが付加されている。1103が更新後差分コードのEFSMであり、同様に分岐を表す状態に論理和Vが付加されている。1102に対して、図25の処理を適用し、状態S1から次のループバック状態S3または自身の状態S1に至るまで深さ優先探索を実施し、以下の式(7)を得る。
Figure 0006637398
・・・(7)
ここで、(S3)は次のループバック状態を表す。次いで、状態S3から自身の状態S3または既に辿った状態遷移(本例の場合はS5−>S1)に到達するまで深さ優先探索を実施し、以下の式(8)を得る。
Figure 0006637398
・・・(8)
式(8)を(S3)に代入して以下の式(9)を得る。
Figure 0006637398
・・・(9)
これを簡略化して以下の式(10)を得る。
Figure 0006637398
・・・(10)
1103に対しても同様な処理から、以下の式(11)を得る。
Figure 0006637398
・・・(11)
(8.模倣(Simulation)判定、双模倣(Bisimulation)判定)
図27に、導出したSMT式を用いた模倣関係判定と双模倣等価性判定の具体例の一例を示す。1201が更新前差分コードから構築したEFSMとそこから導出したSMT式(12)であり、SMT式をAとする。
Figure 0006637398
・・・(12)
一方、1202は更新後差分コードから構築したEFSMとそこから導出したSMT式(13)であり、SMT式をBとする。
Figure 0006637398
・・・(13)
模倣関係判定は1203に示す通り、以下の式(14)を示す事となる。
Figure 0006637398
・・・(14)
しかし、A及びBがSMT式である事から、これは、以下の式(15)と等価である。
Figure 0006637398
・・・(15)
即ち式(15)の左辺が充足不能である事、従って、以下の式(16)が充足可能である事と等価である。
Figure 0006637398
・・・(16)
従って、以下の式(17)のSAT/SMT Solverを用いた充足可能性判定を実施すれば良い。
Figure 0006637398
・・・(17)
充足されれば、模倣関係が成立し、充足されなければ成立しない、となる。
双模倣等価性判定は1204に示す通り、以下の式(18)を示す事となる。
Figure 0006637398
・・・(18)
しかし、A及びBがSMT式である事から、これは、以下の式(19)と等価である。
Figure 0006637398
・・・(19)
即ち式(19)の左辺が充足不能である事、従って以下の式(20)が充足可能である事と等価である。
Figure 0006637398
・・・(20)
それ故、以下の式(21)のSAT/SMT Solverを用いた充足可能性判定を実施すれば良い。
Figure 0006637398
・・・(21)
充足されれば、双模倣等価性が成立し、充足されなければ成立しない、となる。
(効果)
以上のことから、本実施の形態は、次のような効果を奏する。
(1)独立に動作可能な冗長多重構成を伴うプロセッサではなく、しかもタスクディスパッチャのみが搭載された安価な組込み機器で、動的プログラム更新が可能か判定可能で、可能な場合動的プログラム更新を実現できる。
(2)更新プログラムが、更新前プログラムに対して、動作意味を保存した修正、機能追加、固定定数値の変更、これら高々3つの変更であれば、動的プログラム更新が可能である。
(3)従来技術では必須となるプログラムコンテキストのトレースを、全タスクがアイドル状態になっているか否かの判定のみと出来るため、動的切り替えでのオーバーヘッドを極小化可能である。
尚、組込み機器においてはリアルタイム性が求められるため、プログラムを変更する際に、サイクルに影響するようなループ構造の変更は取りえない。それ故、上述した手法による解析が有効といえる。
<実施の形態2>
上記実施の形態1では、全タスクがアイドル状態になったときのみ動的プログラム更新が可能であった。切り替えオーバーヘッドは極小化されている一方、更新タイミング(全タスクがアイドル状態になったときのみ)の制約が大きいと云える。そこで、実施の形態2では、動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新を可能とする手法を以下に開示する。本手法により、従来より大幅にオーバーヘッドを低減しつつ、実施の形態1より柔軟な動的プログラム更新が可能となる。
本実施の形態2は、更新前プログラムと更新後プログラム、ユーザ指定更新可能変数情報、及びプログラムのタスク分割情報を受付け、動的更新可能かの十分条件判定、及び各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無判定、を実施し、夫々の判定結果を返す手段、及びシステムである。そして、当該手段又はシステムは差分プログラムを生成しても良い。本実施の形態2にかかるシステム構成を図28に示す。また、組込み機器での動的プログラム更新を、プロセッサ上の全タスクが、アイドル状態、wait、ready、suspendいずれかとなったときのみに実施する手段を含む。尚、動的更新可能かの十分条件は実施の形態1と同じである。
(1.システム構成)
図28に本実施の形態2にかかるシステム構成を示す。判定装置204は、更新前プログラム101、更新後プログラム102、ユーザ指定更新可能変数103、及びプログラムのタスク分割情報203を入力し、動的更新可能かの十分判定処理を行い、判定結果106、差分プログラム105、及び各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無207を出力する。ここで、ユーザ指定更新可能変数103は、実施の形態1の図2と同じであり、動的プログラム更新で変更可能であるとユーザが指定した変数群を指定した情報である。また、プログラムのタスク分割情報203は、各タスクがどのプログラム関数群から構成されているのかのタスク定義情報である。判定装置204は、差分コード生成部2041と、論理式導出部1042と、判定部1043とを備える。
組込み機器での動的プログラム更新は、プロセッサ上の全タスクが、アイドル状態となったときに、組込み機器が具備するプログラム切り替え機構を用いて実施する。例えば、動的プログラム配置をプログラム実行中に実施し、プロセッサ上で動作するタスクディスパッチャが、全タスクがアイドル状態、wait、ready、suspendいずれかとなった事を確認する。そして、アイドル状態又はwait、suspendになった更新前タスクに定数変数利用演算結果を出力するタスクが含まれないか、またはwait、ready状態となったタスクの更新後の状態で定数変数利用演算結果を受け取るタスクが含まれない時、または全タスクがアイドル状態となった事を確認する。そして、更新要求を格納するレジスタ値をポーリング読出し、更新要求有無を確認し、要求があると確認出来た場合に、アドレス変換器をイネーブルする事で実現される。
(2.条件1の判定手続き概要)
実施の形態1と同様である。
(3.動的更新可能十分条件判定全体フロー)
実施の形態1と同様である。
(4.関数階層を考慮した差分コード生成処理)
差分コード生成部2041は、実施の形態1の差分コード生成部1041の処理に加えて、更新前プログラム及び更新後プログラム夫々に対して、手続き間データフロー解析を実施し、先ず各関数が定数配列演算結果を戻り値として返すか、タスク間データ出力を行うか、及び、当該戻り値や当該タスク間データ出力を受け取るかを識別する。次いで、差分コード生成部2041は、各タスクを構成する関数群の情報を示すプログラムのタスク分割情報203を用いて、更新前の各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、更新後の各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別する。差分コード生成部2041は、これら識別情報を、各タスクでの(ユーザ指定更新可能変数を除く)定数変数利用演算結果の入力・出力の有無結果207として出力する。
(5.更新対象部での更新前コードと更新後コードの簡約化)
実施の形態1と同様である。
(6.拡張有限状態機(EFSM)の構成)
実施の形態1と同様である。
(7.SMT式導出)
実施の形態1と同様である。
(8.模倣(Simulation)判定、双模倣(Bisimulation)判定)
実施の形態1と同様である。
(効果)
動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新が可能となる。
<実施の形態3>
本実施の形態3は、組込み機器での更新差分プログラムのセキュアな動的配置と、セキュアな動的更新動作とを行うものである。本実施の形態3は、上記実施の形態1及び2と組み合わせて実施することが可能である。そこで、組込み機器での更新差分プログラムのセキュアな動的配置と、セキュアな動的更新動作について以下に説明する。
(差分コードの動的配置)(3面の場合)
まず、組込み機器40におけるプログラムの動的な配置動作について説明する。図36は、組込み機器40におけるプログラムの動的な配置動作の一例を説明する模式図である。なお、ここでは、組込み機器40のSRAM406は、起動時に固定割り付けされるプログラム更新作業領域442を有する。また、CPU401は、汎用割込みベクタテーブル440と専用割込みベクタテーブル441を具備するものとする。また、専用割込みベクタテーブル441は、動的なプログラム配置で用いられる割込みベクタテーブルであり、物理的には、汎用割込みベクタテーブル440の一部として実装されていても良い。プログラムの動的な配置動作例は下記の通りである。
(1)CANインターフェース409から更新情報の転送を要求する割込みを割込みコントローラ403が受け、割込みコントローラ403がCPU401に割込みをかける。
(2)CPU401は専用割込みベクタテーブル441を参照し、対応する割込みハンドラが実行される。これにより、CPU401またはDMAコントローラ405の制御の下、CANインターフェース409からSRAM406に更新情報がデータ転送される。ここで、更新情報に含まれるインジェクションコードはプログラム更新作業領域442に配置される。また、受信した各データには予め署名が付加されており、プログラム更新作業領域442の予め定められたアドレスを先頭アドレスとして格納されるものとする。
(3)CANインターフェース409から更新情報の転送の区切りを示す割込みを割込みコントローラ403が受けてCPU401が割込みを受け付けるまで、上記(1)と(2)が繰り返される。
(4)CANインターフェース409から更新情報の転送の区切りを示す割込みを割込みコントローラ403が受け、CPU401が割込みを受ける。
(5)CPU401は専用割込みベクタテーブル441を参照し、対応する割込みハンドラが実行される。これにより、プログラム更新作業領域442に配置されたインジェクションコードが実行される。インジェクションコードは、その種類に応じて、CPU401がアクセスしていないプログラムROM407/データROM408に対する更新データテーブル(すなわち更新差分コードに含まれる初期値付き局所変数と大域変数)の配置、CPU401がアクセスしていないプログラムROM407に対する更新差分バイナリの配置、並びに現在実行中にないデータROM408に対するアドレス変換テーブルの配置を実施する。
(6)CANインターフェース409から更新情報の転送の終了を示す割込みを割込みコントローラ403が受けてCPU401が割込みを受け付けるまで、上記(1)〜(5)が繰り返される。
(7)CANインターフェース409から更新情報の転送の終了を示す割込みを割込みコントローラ403が受け、CPU401が割込みを受け付ける。
(8)CPU401は専用割込みベクタテーブル441を参照し、対応する割込みハンドラが実行される。これにより、プログラムROM407/データROM408に配置したデータテーブルや差分コードの署名検証、アドレス変換器402やデータROM408に配置したアドレス変換テーブルの署名検証が実施される。ここで、組込み機器40は、署名検証をパスした場合、差分コードの署名(ハッシュ値)をデータROM408に格納するとともに、CANインターフェース409から完了通知を外部へ出力する。また、組込み機器40は、再起動後に差分コード配置面の切り替えを実施する旨、フラグ設定を実施する。組込み機器40は、署名検証で不一致となった場合は、プログラムROM407/データROM408に配置したデータテーブルや差分コードの消去、アドレス変換器やデータROMに配置したアドレス変換テーブルの消去を実施するとともに、CANインターフェース409から署名検証不一致の通知を外部へ出力する。
(差分コードの動的配置)(2面の場合)
プログラムROM407/データROM408が2面の場合、まず、デフォルトプログラムの切り替えを実施する。当該切り替えは、本実施の形態1にかかる判定にて動的更新が可能と判定されている場合、全てのタスクがsleep状態となったことを検知して、アドレス変換テーブルをオフとすることで実現できる。その後、上述した3面の場合の差分コードの動的配置を実施する。
(差分コードのセキュアな動的配置)
本実施の形態では、プログラムROM407/データROM408への書込みの前に署名検証が行われる。そして、プログラムROM407/データROM408への書込みの前に署名検証が行われたか否かをハードウェアにて管理する事で、より堅牢な更新情報の動的な配置を可能とする。図37は、ROMへの書込みの許否を制御する制御回路450の一例を示す模式図である。
本実施の形態において、組込み機器40は、制御回路450を有する。制御回路450は、更新制御レジスタ451、反転回路452、AND回路453、及びOR回路454を有する。更新制御レジスタ451は、「許可」ビット、「f1」ビット、「f2」ビット、「r」ビットを含む。反転回路452には、更新制御レジスタ451の「許可」ビットが入力される。AND回路453には、更新制御レジスタ451の「f1」ビット及び「f2」ビットが入力される。OR回路454には、AND回路453の出力及び反転回路452の出力が入力される。OR回路454の出力は、プログラムROM407/データROM408が有する制御回路である書込みコントローラに入力される。ここで、「許可」ビットは、CPU401が特権モードの時のみ、読み書き可能であり、このビットに‘1’が設定された場合のみ制御回路450による制御が有効となる。「f1」ビットは、プログラムROM407/データROM408への書込みの前に実施されるSRAM406へのデータ転送が完了した事を示すビットである。「f1」ビットは、SRAM406へのデータ転送完了時に‘1’が設定される。「f2」ビットは、署名検証が成功したか否かを示すビットであり、署名検証完了時に‘1’が設定される。「f1」ビットと「f2」ビットは読出しがなされることで‘0’にクリアされる。制御回路450によれば、「許可」ビットを‘1’に設定する事で、制御回路450による制御が有効となり、その後に「f1」ビットと「f2」ビットがともに‘1’に設定されたときのみ、プログラムROM407/データROM408の書込みコントローラが有効化される。制御回路450による制御が有効化されている状態で署名検証がスキップされた場合、プログラムROM407/データROM408の書込みコントローラは無効化されているため、書込みBIOSを何らかの手段で実行したとしても、プログラムROM407/データROM408への書込みは実施されない。「r」ビットには、プログラムROM407/データROM408の書込みコントローラへのイネーブル信号値が書き込まれる。「r」ビットは読出しのみ可能であり、読み出すと‘0’にクリアされる。ここで、制御回路450は、プログラムROM407とデータROM408のそれぞれに対して個別に設けても良い。
次に、制御回路450を用いた動作例について説明する。図38は、制御回路450を用いた書き込みの制御動作の一例を示すフローチャートである。本フローチャートは、ステップ6100が実行された事を契機として処理を開始するものとする。
ステップ6100(S6100)で、実施の形態1又は実施の形態2で説明した更新動作に従い、更新差分プログラムがSRAM406へ転送される。
ステップ6101(S6101)で、転送完了後、CPU401は、「f1」ビットを設定する。ここで、CPU401は、転送が正常終了した場合‘1’を設定し、そうでない場合、‘0’を設定する。
ステップ6102(S6102)で、暗号処理ユニット404(署名検証部)が、更新差分プログラムの署名検証を実施する。
ステップ6103(S6103)で、署名検証完了後、CPU401は、「f2」ビットを設定する。CPU401は、署名検証結果が正常な場合、‘1’を設定し、そうでない場合、‘0’を設定する。
ステップ6104(S6104)で、「許可」ビットが‘1’か否かが確認され、‘1’の場合、処理はステップ6105へ移行し、そうでない場合、処理はステップ6106へ移行する。
ステップ6105(S6105)で、「f1」ビットが‘1’でかつ「f2」ビットが‘1’であるか否かが確認され、双方ともに‘1’の場合、処理はステップ6106へ移行し、そうでない場合、処理はステップ6108へ移行する。
ステップ6106(S6106)で、プログラムROM407/データROM408の書込みコントローラに対し書込み許可を設定し、「r」ビットに‘1’が設定される。
ステップ6107(S6107)で、CPU401は、更新制御レジスタ451を必ず読み出す。読み出す事で、「f1」ビット、「f2」ビット、及び「r」ビットの内容を確認する。また、これら3つのビットが‘0’にクリアされ、そして、処理が終了する。なお、ステップ6107において、書込み処理が完了した場合に、CPU401は、「r」ビットの確認を行うことで、書き込み処理が行われた際に書込みコントローラへのイネーブル信号値が実際に1であったか否かを確認することができる。また、許可ビット以外の全ビットが‘0’にクリアされるため、次の更新差分プログラムのプログラム/データROMへの書込みで、署名検証や転送完了が正常に行われているかのチェックが必須となり、これらチェックをスキップする事での攻撃を排除可能となる。
ステップ6108(S6108)で、「r」ビットに‘0’が設定され、処理はステップ6107へ移行する。
このように、本実施の形態では、組込み機器40は、署名検証結果が正当であることが確認された場合に、プログラムROM407又はデータROM408への更新情報の書き込みを許可する制御回路450を有する。これにより、署名検証結果が不当である更新情報がプログラムROM407又はデータROM408に書き込まれることを抑制し、不当である更新情報に起因するプログラムROM407又はデータROM408の消去処理を抑制することが可能となる。
(差分コードの動的更新動作)(3面の場合)
プログラムROM407及びデータROM408の面数が3である場合の更新手順は、例えば以下のようになる。図39は、プログラム更新手順の一例を示すフローチャートである。
ステップ3700(S3700)で、管理サーバ30は、ユーザインターフェース37を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ3701へ移行し、許可されない場合、処理はステップ3705へ移行する。
ステップ3701(S3701)で、管理サーバ30は、更新プログラムの動的ロード、即ちプログラムROM407及びデータROM408への更新プログラムの動的な配置を開始する。なお、動的な配置とは、プログラムの動作を停止させることなく、当該プログラムに対する差分をROMに配置することをいう。
ステップ3702(S3702)で、管理サーバ30は、更新プログラムの動的な配置の完了を確認する。
ステップ3703(S3703)で、管理サーバ30は、ユーザインターフェース37を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ3704へ移行し、許可されない場合、処理はステップ3706へ移行する。
ステップ3704(S3704)で、タスクディスパッチャは、全タスクがアイドル状態であることを確認し、差分コードの更新を実施する。
ステップ3705(S3705)では、所定の待機時間が経過した後、ステップ3700へ処理が移行する。同様に、ステップ3706(S3706)でも、所定の待機時間が経過した後、ステップ3703へ処理が移行する。
(差分コードの動的更新動作)(2面の場合)
プログラムROM407及びデータROM408の面数が2である場合の更新手順は、例えば以下のようになる。図40は、プログラム更新手順の一例を示すフローチャートである。
ステップ4900(S4900)で、管理サーバ30は、ユーザインターフェース37を介して、ユーザに更新プログラムのロード可否を問合せる。ロードが許可されると、処理はステップ4901へ移行し、許可されない場合、処理はステップ4906へ移行する。
ステップ4901(S4901)で、アドレス変換テーブルの不許可設定など、デフォルトプログラムの実行状態とするために必要な設定が完了した後、組込み機器40がリセットされ、組込み機器40が再起動される。そして、再起動後に組込み機器40は、デフォルトプログラムの実行状態へと遷移する。
ステップ4902(S4902)で、管理サーバ30は、更新プログラムの動的ロード、即ちプログラムROM407及びデータROM408への更新プログラムの動的な配置を開始する。
ステップ4903(S4903)で、管理サーバ30は、更新プログラムの動的な配置の完了を確認する。
ステップ4904(S4904)で、管理サーバ30は、ユーザインターフェース37を介して、ユーザに更新可否を問合せる。更新が許可されると、処理はステップ4905へ移行し、許可されない場合、処理はステップ4907へ移行する。
ステップ4905(S4905)で、タスクディスパッチャは、全タスクがアイドル状態であることを確認し、差分コードの更新を実施する。
ステップ4906(S4906)では、所定の待機時間が経過した後、ステップ4900へ処理が移行する。同様に、ステップ4907(S4907)で、所定の待機時間が経過した後、ステップ4904へ処理が移行する。
(差分コードのセキュアな動的更新動作)
ここで、本実施の形態における、組込み機器での更新動作について説明する。本実施の形態をプログラムROM407及びデータROM408の面数が3である組込み機器40に適用した場合の更新動作は、図39と同様であるが、以下の点で異なる。また、本実施の形態をプログラムROM407及びデータROM408の面数が2である組込み機器40に適用した場合の更新動作は、図40と同様であるが、以下の点で異なる。すなわち、本実施の形態が適用された場合、図39に示したステップ3701及び図40に示したステップ4902では、管理サーバは、更新プログラムのセキュアな動的ロード、即ち本実施の形態で述べたセキュア対応を考慮した、プログラムROM407及びデータROM408への更新プログラムの動的な配置を開始する。尚、動的配置を行わない場合、プログラムROM407/データROM408が1面であっても、動的更新動作は可能である。
(効果)
(1)独立に動作可能な冗長多重構成を伴うプロセッサではなく、しかもタスクディスパッチャのみが搭載された安価な組込み機器で、動的プログラム更新が可能か判定可能で、可能な場合、動的プログラム更新をセキュアに実現できる。
(2)更新プログラムが、更新前プログラムに対して、動作意味を保存した修正、機能追加、固定定数値の変更、これら高々3つの変更であれば、動的プログラム更新がセキュアに可能である。
(3)従来技術では必須となるプログラムコンテキストのトレースを、全タスクがアイドル状態になっているか否かの判定のみと出来るため、動的切り替えでのオーバーヘッドを極小化がセキュアに可能となる。
(4)動的なプログラムコンテキストのトレース解析を行う事なく、タスクディスパッチャで実現可能な静的なコンテキスト解析のみで、各タスクがアイドル、wait、suspend、readyの何れかの状態となったときに、動的プログラム更新がセキュアに可能となる。
<実施の形態4>
本実施の形態4は、組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントやデフォルトプログラムへの動的ロールバック(又はフォールバック)後のプログラムに対してロールバック前後のプログラムが条件1、条件2を満たす場合、全タスクがアイドルとなったときの動的ロールバックを実施するものである。非特許文献1より、前記動的ロールバックがその実施条件の下で動的プログラム更新可能条件を満たす事も明らかである。本実施の形態4は、上記実施の形態1と組み合わせて実施することが可能である。そこで、組込み機器での動的ロールバックについて、以下に説明する。
(デフォルトプログラムへのロールバック)
組込み機器の更新での異常検知時や外部からの指示に基づくデフォルトプログラムへのロールバック指示に基づき、タスクが全てSleep状態となったときに、図29のアドレス変換器をオフとする事で、差分プログラム実行を不可、即ちデフォルトのプログラムのみ実行可能とする事で実現する。
(指定ポイントへのロールバック)
組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントへのロールバック指示に基づき、タスクが全てSleep状態となったときに、図29のアドレス変換器を先ずオフとし、デフォルトプログラムへ遷移後、データROMなどに保存しておいた指定ポイントに対応するプログラム実行を可能とする差分コード実行に対応するアドレス変換テーブルを読出し、アドレス変換器に設定、その後、実施例1の動的切り替えタイミング、即ちタスクが全てSleep状態となったときにアドレス変換器をオンとする事で、指定ポイントに対応するプログラムの実行を可能とする事で実現する。ここで、指定ポイントのプログラム実行に必要となる差分プログラムをデータROMから読出しコードROMへ上書きを実施しても良い。特に、更新差分コードを書き込む際に、既にコードROM上に存在する差分コードをデータROMに読出して書込みを実施するものとしても良い。
(効果)
組込み機器において動作実行中のプログラムのフォールバックやロールバックが可能となる。
<その他の実施の形態>
組込み機器の更新での異常検知時や外部からの指示に基づく指定ポイントやデフォルトプログラムへの動的ロールバック後のプログラムに対してロールバック前後のプログラムが条件1、条件2を満たす場合、全タスクがアイドルまたはwait、ready、suspendとなったときの動的ロールバックが、上記実施の形態3又は4と実施の形態2との組合せにより実現可能である。
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
101 更新前プログラム
102 更新後プログラム
103 ユーザ指定更新可能変数
104 判定装置
1041 差分コード生成部
1042 論理式導出部
1043 判定部
105 差分プログラム
106 判定結果
203 プログラムのタスク分割情報
204 判定装置
2041 差分コード生成部
207 各タスクでの定数変数利用演算結果の入力・出力の有無

Claims (11)

  1. 第1のプログラムのうち第2のプログラムと異なるコード片の集合を示す第1の差分コードと、前記第2のプログラムのうち前記第1のプログラムと異なるコード片の集合を示す第2の差分コードとを生成する差分コード生成部と、
    前記第1の差分コードから所定の変換により第1の論理式を導出し、前記第2の差分コードから前記所定の変換により第2の論理式を導出する論理式導出部と、
    前記第2の論理式が前記第1の論理式を含むか否かにより、所定の組込み機器における前記第1のプログラムから前記第2のプログラムへの動的更新の可否を判定する判定部と、
    を備える判定装置。
  2. 前記論理式導出部は、
    前記所定の変換として、前記第1の差分コードから第1のSMT(Satisfiability Modulo Theories)式を前記第1の論理式として導出し、前記第2の差分コードから第2のSMT式を前記第2の論理式として導出する
    請求項1に記載の判定装置。
  3. 前記論理式導出部は、
    前記第1の差分コード及び前記第2の差分コードがループ記述を含む場合に、前記所定の変換として、前記第1の差分コードから第1のEFSM(Extended Finite State Machine)を構築し、前記第2の差分コードから第2のEFSMを構築し、当該第1のEFSMから前記第1のSMT式を前記第1の論理式として導出し、当該第2のEFSMから前記第2のSMT式を前記第2の論理式として導出する
    請求項2に記載の判定装置。
  4. 前記論理式導出部は、
    深さ優先探索を実施しつつ、当該深さ優先探索で辿る状態遷移毎に付加された遷移条件と実行文からなる論理積を構成し、分岐パスは論理和で結合し、得られた式全体で論理積を構成することにより、前記第1のEFSMから前記第1のSMT式及び前記第2のEFSMから前記第2のSMT式を導出する
    請求項3に記載の判定装置。
  5. 前記判定部は、
    前記第1の論理式及び前記第2の論理式を用いて模倣(Simulation)関係判定により前記第2の論理式が前記第1の論理式を含むか否か、及び双模倣(Bisimulation)等価性判定により、前記第1の論理式と前記第2の論理式が等価であるか否かを判定する
    請求項1に記載の判定装置。
  6. 前記論理式導出部は、
    前記第1の差分コード及び前記第2の差分コードを簡略化して前記所定の変換を行う
    請求項1に記載の判定装置。
  7. 前記論理式導出部は、
    前記簡略化として、前記第1の差分コード及び前記第2の差分コードを積極的コード移動、不到達式削除及び冗長式削除の順に実施して前記所定の変換を行う
    請求項6に記載の判定装置。
  8. 前記差分コード生成部は、
    前記第1のプログラムと前記第2のプログラムとの差分のコードからアドレス解決を行ったオブジェクトコードを前記第1の差分コード及び前記第2の差分コードとして生成する
    請求項1に記載の判定装置。
  9. 前記差分コード生成部は、
    関数呼び出し構造を維持するように前記第1のプログラムと前記第2のプログラムとの差分を取ることにより、前記第1の差分コード及び前記第2の差分コードを生成する
    請求項1に記載の判定装置。
  10. 前記差分コード生成部は、
    各タスクが構成されているプログラム関数群を定義したタスク分割情報を入力し、
    前記タスク分割情報を用いて、前記第1のプログラムの各タスクが更新対象の定数群の演算結果を戻り値として返すか、タスク間データ出力を行うかを識別し、前記第2のプログラムの各タスクが当該戻り値や当該タスク間データ出力を受け取るかを識別し、当該識別した情報を出力する
    請求項1に記載の判定装置。
  11. 第1のプログラムのうち第2のプログラムと異なるコード片の集合を示す第1の差分コードと、前記第2のプログラムのうち前記第1のプログラムと異なるコード片の集合を示す第2の差分コードとを生成し、
    前記第1の差分コードから所定の変換により第1の論理式を導出し、前記第2の差分コードから前記所定の変換により第2の論理式を導出し、
    前記第2の論理式が前記第1の論理式を含むか否かにより、所定の組込み機器における前記第1のプログラムから前記第2のプログラムへの動的更新の可否を判定する、
    判定方法。
JP2016185274A 2016-09-23 2016-09-23 判定装置及び判定方法 Active JP6637398B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2016185274A JP6637398B2 (ja) 2016-09-23 2016-09-23 判定装置及び判定方法
US15/656,893 US10642607B2 (en) 2016-09-23 2017-07-21 Determination apparatus and determination method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016185274A JP6637398B2 (ja) 2016-09-23 2016-09-23 判定装置及び判定方法

Publications (2)

Publication Number Publication Date
JP2018049506A JP2018049506A (ja) 2018-03-29
JP6637398B2 true JP6637398B2 (ja) 2020-01-29

Family

ID=61686173

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016185274A Active JP6637398B2 (ja) 2016-09-23 2016-09-23 判定装置及び判定方法

Country Status (2)

Country Link
US (1) US10642607B2 (ja)
JP (1) JP6637398B2 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11593342B2 (en) 2016-02-01 2023-02-28 Smartshift Technologies, Inc. Systems and methods for database orientation transformation
US10585655B2 (en) 2016-05-25 2020-03-10 Smartshift Technologies, Inc. Systems and methods for automated retrofitting of customized code objects
US10089103B2 (en) 2016-08-03 2018-10-02 Smartshift Technologies, Inc. Systems and methods for transformation of reporting schema
US10496469B2 (en) 2017-07-25 2019-12-03 Aurora Labs Ltd. Orchestrator reporting of probability of downtime from machine learning process
US10698674B2 (en) 2018-02-06 2020-06-30 Smartshift Technologies, Inc. Systems and methods for entry point-based code analysis and transformation
US10528343B2 (en) 2018-02-06 2020-01-07 Smartshift Technologies, Inc. Systems and methods for code analysis heat map interfaces
US10740075B2 (en) * 2018-02-06 2020-08-11 Smartshift Technologies, Inc. Systems and methods for code clustering analysis and transformation
US10834206B2 (en) * 2018-02-27 2020-11-10 Excelfore Corporation Broker-based bus protocol and multi-client architecture
US10853183B2 (en) 2018-04-27 2020-12-01 EMC IP Holding Company LLC Serverless application operational recovery and manifest creation
CN109582344A (zh) * 2018-11-27 2019-04-05 北京车和家信息技术有限公司 增量更新方法、装置、云服务器及计算机可读存储介质
KR20220028879A (ko) * 2020-08-31 2022-03-08 현대자동차주식회사 차량의 ecu 업데이트 관리 장치 및 그 방법
DE102021201212A1 (de) * 2021-02-09 2022-08-11 Robert Bosch Gesellschaft mit beschränkter Haftung Verfahren zum Steuern einer Mehrzahl an Fahrfunktionen in einem automatisierten oder autonomen Fahrzeug
US11789421B2 (en) * 2021-08-19 2023-10-17 Rockwell Automation Technologies, Inc. Efficient client updates using patience difference algorithm in a unidirectional data flow architecture for industrial automation design
US20230115149A1 (en) * 2021-09-24 2023-04-13 Insitro, Inc. System, devices and/or processes for updating call graphs
CN114139189B (zh) * 2021-12-08 2023-03-24 广西民族大学 一种基于互模拟等价的数据安全处理方法和装置

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1992016905A1 (en) * 1991-03-18 1992-10-01 Echelon Corporation Programming language structures for use in a network for communicating, sensing and controlling information
US7020850B2 (en) * 2001-05-02 2006-03-28 The Mathworks, Inc. Event-based temporal logic
JP4302970B2 (ja) * 2002-12-16 2009-07-29 富士通株式会社 差分更新方法、プログラム及び装置
US8468516B1 (en) * 2008-12-19 2013-06-18 Juniper Networks, Inc. Creating hot patches for embedded systems
JP5297848B2 (ja) 2009-03-18 2013-09-25 株式会社日立ソリューションズ プログラム動的更新システム、管理サーバ、組込み機器及びプログラム
JP5893954B2 (ja) * 2012-02-24 2016-03-23 ルネサスエレクトロニクス株式会社 等価性検証方法、等価性検証プログラム及び等価性検証装置
US9910660B2 (en) 2013-08-05 2018-03-06 Harman International Industries, Incorporated Operating system replacement for in-vehicle computing system

Also Published As

Publication number Publication date
US10642607B2 (en) 2020-05-05
JP2018049506A (ja) 2018-03-29
US20180088936A1 (en) 2018-03-29

Similar Documents

Publication Publication Date Title
JP6637398B2 (ja) 判定装置及び判定方法
JP7090657B2 (ja) アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体
US8954939B2 (en) Extending a development environment
US6427234B1 (en) System and method for performing selective dynamic compilation using run-time information
US11579852B2 (en) Device profiling in GPU accelerators by using host-device coordination
CN102364433B (zh) 在ARM处理器上实现Wine构建工具移植的方法
Blom et al. Correct program parallelisations
CN107408054B (zh) 设备中的流控制的方法和计算机可读介质
Liu et al. Exploring missed optimizations in webassembly optimizers
JP6481515B2 (ja) 情報処理装置、コンパイル方法、及びコンパイラプログラム
Cousot Syntactic and semantic soundness of structural dataflow analysis
Larus et al. Using tracing and dynamic slicing to tune compilers
CN112199110B (zh) 一种免重启运维升级方法、***、装置和介质
Sewell et al. Cakes that bake cakes: Dynamic computation in CakeML
CN111796832B (zh) 热补丁文件生成方法、装置、设备及存储介质
Doerfert et al. Polyhedral expression propagation
Weidendorfer et al. The case for binary rewriting at runtime for efficient implementation of high-level programming models in HPC
Mpeis et al. Iterative compilation on mobile devices
Campbell et al. Improving the GP 2 compiler
Zhang et al. Towards re-engineering legacy systems for assured dynamic adaptation
Li et al. Compiler-based multiple instruction retry
van der Spek et al. Automatic restructuring of linked data structures
Hashimoto A method of safety analysis for runtime code update
JP2002082811A (ja) コンパイル方法および記録媒体
Dolev et al. Self-stabilization preserving compiler

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190207

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20191127

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20191210

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20191220

R150 Certificate of patent or registration of utility model

Ref document number: 6637398

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150