(57)【要約】      （修正有）【課題】システムの再起動が不要で、且つバージョンアップの前後で処理の連続性を保ちながらオブジェクトファイルをバージョンアップする方法を提供する。【解決手段】情報処理装置で実行されるプログラムの新しいバージョンを、外部記憶装置からダウンロードしてバージョンアップする時に、呼び出しカウントが０で無い場合は、０になるまで待ってからリンク処理を開始することで、実行中のプログラムが誤ってバージョンアップされることを防ぐ。【選択図】図８
2012221133.tif 000002
【特許請求の範囲】
【請求項１】
情報処理装置の制御プログラムをオブジェクトプログラムとして格納する記憶装置と、
該記憶装置から読み出した、情報処理装置の制御プログラムを記憶させるメインメモリと、
該制御プログラムを前記メインメモリにローディングするための通信手段と、
前記メインメモリ上に、オブジェクトプログラムに含まれる関数が呼び出されている回数を格納した、呼び出しカウントテーブルと、
を有し、
前記情報処理装置で実行されるプログラムの新しいバージョンを、前記記憶装置から読み出してバージョンアップする時に、
前記呼び出しカウントテーブルの、オブジェクトプログラムに含まれる関数が呼び出されている回数が０であるときに、前記新しいバージョンのプログラムのバージョンアップ処理を開始するように制御する制御手段を備えたことを特徴とする情報処理装置。
【請求項２】
情報処理装置の制御プログラムをオブジェクトプログラムとして格納する記憶装置と、
該記憶装置から読み出した、情報処理装置の制御プログラムを記憶させるメインメモリと、
該制御プログラムを前記メインメモリにローディングするための通信手段と、
前記メインメモリ上に、オブジェクトプログラムに含まれる関数が呼び出されている回数を格納した、呼び出しカウントテーブルと、
を有し、
前記情報処理装置で実行されるプログラムの新しいバージョンを、前記記憶装置から読み出してバージョンアップする時に、バージョンアップ中のオブジェクトファイルに含まれる関数が、ダウンロード済みの他のオブジェクトファイルに含まれる関数を呼び出している場合、呼び出されている関数の実体である実関数を直接呼び出すのではなく、実関数呼び出し前に、前記呼び出しカウントテーブルの呼び出し回数を加算し、実関数呼出し後に、前記呼び出し回数を減算する仮関数を呼び出すように制御することを特徴とする情報処理装置。
【請求項３】
情報処理装置の制御プログラムをオブジェクトプログラムとして格納する記憶装置と、
該記憶装置から読み出した、情報処理装置の制御プログラムを記憶させるメインメモリと、
該制御プログラムを前記メインメモリにローディングするための通信手段と、
前記メインメモリ上に、オブジェクトプログラム内で定義されているグローバル変数の、変数名と、前記グローバル変数が割り付けられたメインメモリ上のアドレスを格納した変数アドレスと、前記グローバル変数のサイズを格納した変数サイズ、から構成される定義変数テーブルと、
を有し、
前記情報処理装置で実行されるプログラムの新しいバージョンを、前記記憶装置からダウンロードしてバージョンアップする時に、バージョンアップ前のオブジェクトファイルの前記定義変数テーブルを参照し、変数の値を、バージョンアップ後のオブジェクトファイルに複製することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置に係り、特にプログラムのバージョンアップを実施する機能を備えた情報処理装置に関する。
【背景技術】
【０００２】
本技術分野の背景技術として、特開２００９−２６５９８０号公報（特許文献１）がある。この公報には、「ダイナミックライブラリをランタイムでバージョンアップすることができる情報処理装置を提供する」と記載されている（要約参照）。また、特開２００６−３２３８２９号公報（特許文献２）がある。この公報には、「動的にリンクするプログラムのオーバーレイのための方法及び装置」について記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−２６５９８０号公報
【特許文献２】特開２００６−３２３８２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
前記特許文献１には、ダイナミックライブラリを実行時にバージョンアップする仕組みが記載されている。しかし、前記特許文献１のバージョンアップ方法では、バージョンアップ後に情報処理装置を再起動する必要がある。そのため、情報処理装置の再起動が望ましくないシステム、たとえば２４時間稼動が要求されるシステムには適用することができない。また、再起動時間の長いシステムでは、ソフトウェア開発効率向上の観点から、なるべく再起動せずにプログラムをバージョンアップすることが望ましい。
【０００５】
前記特許文献２には、複数のモジュールから構成されるソフトウェアにおいて、プロセッサのローカルメモリ内へモジュールをロードし、実行する仕組みが記載されている。しかし、前記特許文献２では、バージョンアップ前のモジュールによる処理結果が、バージョンアップ後のモジュールに引き継がれないため、処理の連続性が要求される場合には適用できない。
【０００６】
そこで、本発明は、システムの再起動が不要で、且つバージョンアップの前後で処理の連続性を保ちながら、一般的には拡張子として“.o”が用いられるオブジェクトファイルを単位として、バージョンアップする方法を提供する。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、例えば特許請求の範囲に記載の構成を採用する。
【０００８】
本発明は上記課題を解決する手段を複数含んでいるが、その一例を挙げるならば、オブジェクトファイル内で定義されている関数が呼び出されている回数を格納した、呼び出しカウントテーブルを有し、呼び出しカウントが０でない場合は、０になるまで待ってからリンク処理を開始することを特徴とする。
【発明の効果】
【０００９】
本発明によれば、相互に依存する複数のオブジェクトファイルから構成されるアプリケーションプログラムを、再起動することなく、且つ処理の連続性を保ちながら、オブジェクトファイルを単位として、バージョンアップできる方法を提供することができる。
【図面の簡単な説明】
【００１０】
【図１】生化学自動分析装置の構成図の例である。
【図２】リンク情報テーブルの例である。
【図３】定義関数テーブルの例である。
【図４】定義変数テーブルの例である。
【図５】参照変数テーブルの例である。
【図６】呼び出しカウントテーブルの例である。
【図７】仮関数のフローチャートの例である。
【図８】バージョンアップのフローチャートの例である。
【図９】リンク処理のフローチャートの例である。
【図１０】参照関数解決処理の例である。
【図１１】他オブジェクトファイルからの参照更新処理の例である。
【図１２】定義変数値複製処理の例である。
【発明を実施するための形態】
【００１１】
以下、本発明の実施例を図面を用いて説明する。
【００１２】
本実施例では、血液の生化学分析を行う自動分析装置の例を説明するが、本発明はこれ以外のアプリケーションにも適用可能であることは言うまでもない。
【００１３】
図１は、本実施例の生化学自動分析装置の構成図の例である。
【００１４】
生化学自動分析装置は、装置を操作するための操作端末１００と、検体に試薬を注入し分析結果を得る装置本体１１０から構成されている。操作端末と装置本体は所定のプロトコールで規定された通信ネットワーク（例えばイーサネット（登録商標）など）１２０で接続されており、操作端末から装置本体への操作者の指示の伝達と、装置本体から操作端末への分析結果の報告が、イーサネットを経由して行われる。
【００１５】
装置本体には、情報処理装置１３０が組み込まれている。情報処理装置は、ＣＰＵ１４０，不揮発性メモリ１５０，メインメモリ１６０，通信Ｉ／Ｆ１７０，モータコントローラ１８０，Ａ／Ｄ変換器１９０から構成されている。
【００１６】
不揮発性メモリにはオペレーティングシステムが格納されている。オペレーティングシステムは、装置本体の電源投入によりメインメモリに転送され、メインメモリ上で実行を開始する。オペレーティングシステムは、自身の起動処理が完了すると、操作端末に格納されている制御プログラム１９５を通信Ｉ／Ｆからメインメモリ上にダウンロードし、制御プログラムを実行する。この制御プログラムによって、試薬の注入等を行うための、ノズル制御用のモータコントローラの制御や、試薬反応結果を情報処理装置に取り込むためのＡ／Ｄ変換器の制御を行う。
【００１７】
オペレーティングシステムが制御プログラムをダウンロードし実行する時の動作について説明する。制御プログラムは、複数のオブジェクトプログラムの形で操作端末に格納されている。オブジェクトプログラムとは、制御プログラムのソースプログラムをコンパイルしたものである。オブジェクトプログラムは、メインメモリ上の実行アドレスに関連付けられていないため、オブジェクトプログラムをメインメモリにダウンロードしただけでは、実行することはできない。ダウンロードしたオブジェクトプログラムを実行可能な状態にするには、リンクと呼ばれる処理が必要である。リンク処理とは、制御プログラムをメインメモリ上にダウンロードした後、オブジェクトプログラムに含まれる関数の実行アドレスを決定し、決定したアドレスを使用するようにダウンロードしたオブジェクトプログラムの一部を書き換える処理である。グローバル変数についても同様な処理を行う。メインメモリにダウンロードされたオブジェクトプログラムは、オペレーティングシステムによってリンク処理を施されることで、初めて実行可能な状態となる。オブジェクトプログラムが、本発明によるバージョンアップの単位となる。
【００１８】
オペレーティングシステムは、オブジェクトプログラムのリンク処理において、本発明によるリンク情報テーブルと、本発明による呼び出しカウントテーブルを作成する。これらのテーブルは、ダウンロードしたオブジェクトプログラム毎に作成されるものである。以下、リンク情報テーブルと、呼び出しカウントテーブルの詳細について説明する。
【００１９】
まず、リンク情報テーブルを説明する。リンク情報テーブルは、バージョンアップされた新しいオブジェクトファイルを呼び出すように他のオブジェクトファイルを修正する目的と、バージョンアップの前後でオブジェクトファイルのグローバル変数に連続性を持たせる目的で使用する。
【００２０】
図２にリンク情報テーブルを示す。リンク情報テーブル２００は、オブジェクトファイル名称２１０，定義関数テーブル２２０，定義変数テーブル２３０，参照関数テーブル２４０から構成される。
【００２１】
オブジェクトファイル名称は、このリンク情報テーブルに対応するオブジェクトファイル名称を表す。オブジェクトファイル名称は、オブジェクトファイルをバージョンアップするときに、旧オブジェクトファイルに対応するリンク情報テーブルを検索するために使用する。
【００２２】
図３に定義関数テーブルを示す。定義関数テーブルは、１つのレコードが、定義関数名３００と、実関数アドレスと３１０，仮関数アドレス３２０から構成される。定義関数名は、オブジェクトファイル内で定義されている関数で、なお且つ他のオブジェクトファイルから呼び出される可能性のある関数の名称を表す。実関数アドレスは、定義関数名で示される関数の、メインメモリ上での先頭アドレスを現す。仮関数アドレスは、定義関数名で示される関数に対応する、仮関数のメインメモリ上での先頭アドレスを現す。定義関数テーブルのレコードは、オブジェクトファイル内で定義されている関数で、なお且つ他のオブジェクトファイルから呼び出される可能性のあるすべての関数の数だけ存在する。なお、仮関数については後述する。
【００２３】
図４に定義変数テーブルを示す。定義変数テーブルは、１つのレコードが、定義変数名４００と、変数アドレス４１０と、変数サイズ４２０から構成される。定義変数名は、オブジェクトファイル内で定義されているグローバル変数の名称を表す。変数アドレスは、定義変数名で示される変数の、メインメモリ上での先頭アドレスを表す。変数サイズは、定義変数名で示される変数の、メインメモリ上でのサイズを表す。定義変数テーブルのレコードは、オブジェクトファイル内で定義されているすべてのグローバル変数の数だけ存在する。
【００２４】
図５に参照関数テーブルを示す。参照関数テーブルは、１つのレコードが、参照関数名５００と、オフセット５１０から構成される。参照関数名は、このオブジェクトファイル内で参照している関数で、他のオブジェクトファイルで定義されている関数の名称を表す。オフセットは、参照関数名で示される関数を、このオブジェクトファイル内で参照している箇所を、このオブジェクトファイルの先頭アドレスからのオフセットで現した数値である。参照関数テーブルのレコードは、オブジェクトファイル内で参照しているすべての参照箇所について存在する。
【００２５】
次に、呼び出しカウントテーブルについて説明する。呼び出しカウントテーブルは、バージョンアップ対象のオブジェクトファイル内で定義されているいずれの関数も、他のオブジェクトファイルから呼び出されていないときにバージョンアップするタイミングを判定する目的で使用する。
【００２６】
図６に呼び出しカウントテーブルを示す。呼び出しカウントテーブルは、オブジェクトファイル名称６１０と、呼び出しカウント６２０から構成される。
【００２７】
オブジェクトファイル名称は、この呼び出しカウントテーブルに対応するオブジェクトファイル名称を表す。オブジェクトファイル名称は、このオブジェクトファイルをバージョンアップするときに、旧オブジェクトファイルに対応する呼び出しカウントテーブルを検索するために使用する。
【００２８】
呼び出しカウントは、このオブジェクトファイルに含まれる関数が呼び出されている回数を表す数値である。すなわち、呼び出しカウントが０なら、このオブジェクトファイルに含まれるいずれの関数も呼び出されていないことになる。
【００２９】
ここで、仮関数について説明する。仮関数は、呼び出しカウントの加算操作，減算操作を行う関数である。図７に仮関数のフローチャートを示す。仮関数は、まず、自身に対応する定義関数が定義されているオブジェクトファイルの、呼び出しカウントテーブルに含まれる、呼び出しカウントに１を加算する（ステップ７２０）。次に、自身に対応する定義関数の実関数アドレスを呼び出す（ステップ７３０）。次に、実関数呼び出しからリターンしてきたら、呼び出しカウントから１を減算する（ステップ７４０）。このような仮関数を作成し、ある関数を呼び出すときに、直接その関数の実関数アドレスを呼び出すのではなく、仮関数アドレスを呼び出すことで、呼び出しカウントを実現する。
【００３０】
図８に、以上説明した、リンク情報テーブルと、呼び出しカウントテーブルを使用して、オブジェクトファイルをダウンロードするフローチャートを示す。以下、フローチャートの各ステップを説明する。
【００３１】
まず、オブジェクトファイルを操作端末からダウンロードしてメインメモリに転送する（ステップ８１０）。
【００３２】
次に、このオブジェクトファイルに対応する呼び出しカウントテーブルを検索する（ステップ８２０）。
【００３３】
もし呼び出しカウントテーブルが見つかれば、このダウンロードはバージョンアップであることがわかる。バージョンアップの場合は、呼び出しカウントが０になるまでウェイトし、リンク処理を行う（ステップ８３０，８５０，８６０）。このステップは、実行中のオブジェクトファイルを誤ってバージョンアップしないようにするための、重要なステップである。
【００３４】
もし呼び出しカウントテーブルが見つからなければ、このダウンロードは新規のダウンロードであることがわかるため、直ちにリンク処理を行う（ステップ８４０，８６０）。
【００３５】
図９に、リンク処理の詳細フローチャートを示す。以下、フローチャートの各ステップを説明する。
【００３６】
まず、参照関数テーブルを作成する（ステップ９１０）。参照関数テーブル作成処理は、オブジェクトプログラムに含まれる情報から容易に作成可能であり、本発明の本質ではないため、説明を省略する。
【００３７】
次に、作成した参照関数テーブルに基づいて、参照関数の解決を行う（ステップ９２０）。参照関数の解決処理では、リンク中のオブジェクトファイルを除く、すべてのリンク済みオブジェクトファイルのリンク情報テーブルに含まれる定義関数テーブルの中から、参照関数名と同一の定義関数名を持つレコードを検索する。そして、そのレコードに含まれる仮関数アドレスを、リンク中のオブジェクトファイルの先頭アドレスに、参照関数テーブルに含まれるオフセットを加算した値で示されるアドレスに書き込む。この処理によって、リンク中のオブジェクトファイルに含まれる関数が他のオブジェクトファイルに含まれる関数を実際に呼び出すときに、呼び出されようとしている関数に対応した仮関数を呼び出すことができるようになる。
【００３８】
図１０を用いて参照解決処理の例を説明する。図１０では、オブジェクトファイルＡがすでにダウンロード済みのオブジェクトファイル，オブジェクトファイルＣ′がリンク中のオブジェクトファイルである。簡単のため、オブジェクトファイルＡの先頭アドレスと、オブジェクトファイルＡで定義されている関数ＦＵＮＣ_Ａの先頭アドレスが等しく、オブジェクトファイルＣ′の先頭アドレスと、オブジェクトファイルＣ′で定義されている関数ＦＵＮＣ_Ｃの先頭アドレスが等しいと仮定している。オブジェクトファイルＣの参照関数テーブルを見ると、オフセット１０において、ＦＵＮＣ_Ａを参照していることがわかる。ＦＵＮＣ_Ａは、オブジェクトファイルＡの定義関数テーブルから、仮関数アドレスが１１００であることがわかる。そこで、オブジェクトファイルＣ′の先頭アドレス（４０００）に、オフセット（１０）を加算した値、すなわち４０１０番地に、値１１００を書き込む。このようにすることで、アドレス４０１０番地において、ＦＵＮＣ_Ａを呼び出すときに、ＦＵＮＣ_Ａの仮関数を呼び出すようにすることができる。
【００３９】
図９に戻る。参照解決処理の次に、定義関数テーブルを作成する（ステップ９３０）。定義関数テーブルに含まれる、定義関数名と実関数アドレスについては、オブジェクトプログラムに含まれる情報から容易に作成が可能であり、本発明の本質ではないため、説明を省略する。仮関数アドレスについては、図７に示したフローチャートのような処理を行う仮関数をメインメモリ上に作成し、作成した仮関数の先頭アドレスを、仮関数アドレスとして定義関数テーブルに設定する。
【００４０】
次に、定義変数テーブルを作成する（ステップ９４０）。定義変数テーブル作成処理は、オブジェクトプログラムに含まれる情報から容易に作成可能であり、本発明の本質ではないため、説明を省略する。
【００４１】
ダウンロードモードがバージョンアップモードの場合は、次に他オブジェクトファイルからの参照更新処理を行う（ステップ９６０）。このステップは、オブジェクトファイルがバージョンアップされたことを、このオブジェクトファイルを参照する他のオブジェクトファイルに通知するための、重要なステップである。参照更新処理では、すべてのリンク済みオブジェクトファイルについて、リンク中のオブジェクトファイルの定義関数テーブルに含まれる定義関数名と同一の名称を持つ、参照関数テーブルのレコードを検索する。そして、リンク済みオブジェクトファイルの先頭アドレスにオフセットを加算した値で示されるアドレスに、定義関数テーブルに含まれる仮関数アドレスを書き込む。
【００４２】
図１１を用いて参照更新処理の例を説明する。図１１では、オブジェクトファイルＢ，オブジェクトファイルＣがすでにリンク終了している。オブジェクトファイルＢを見ると、オブジェクトファイルＢのオフセット１０において、ＦＵＮＣ_Ｃを参照していることがわかる。このような状態で、オブジェクトファイルＣをオブジェクトファイルＣ′にバージョンアップする。オブジェクトファイルＣ′の定義関数テーブルを見ると、ＦＵＮＣ_Ｃが定義されており、ＦＵＮＣ_Ｃの仮関数アドレスが４１００であることがわかる。そのため、オブジェクトファイルＢの先頭アドレス２０００にオフセット１０を加算したアドレス、すなわち２０１０番地に、ＦＵＮＣ_Ｃの仮関数アドレス４１００を書き込む。このようにすることで、２０１０番地においてＦＵＮＣ_Ｃを呼び出すときに、バージョンアップ後の新しいＦＵＮＣ_Ｃを呼び出すことができるようになる。
【００４３】
図９に戻る。ダウンロードモードがバージョンアップモードの場合は、さらに次に定義変数値複製処理を行う（ステップ９７０）。このステップは、処理の連続性を保ちながらオブジェクトファイルをバージョンアップするための、重要なステップである。定義変数値複製処理では、バージョンアップ前のオブジェクトファイルの定義変数テーブルで示される、変数アドレスから変数サイズ分のメモリデータを、バージョンアップ後のオブジェクトファイルの定義変数テーブルで示される、変数アドレスに変数サイズ分複製する。このステップにより、グローバル変数の値をバージョンアップ後のオブジェクトファイルに引き継ぐことができる。
【００４４】
図１２を用いて定義変数値複製処理の例を説明する。図１２では、リンク済みのオブジェクトファイルＣを、オブジェクトファイルＣ′にバージョンアップするときの定義変数地複製処理の様子を表している。オブジェクトファイルＣの定義変数テーブルを見ると、ＶＡＲ_Ｃなる変数がアドレス１０００からの４バイトに割り付けられており、ＶＡＲ_Ｃの値が、現在１２３４であることがわかる。オブジェクトファイルＣ′にバージョンアップするとき、同名の変数ＶＡＲ_Ｃがアドレス２０００から割り付けられているため、１０００番地からの４バイトを、２０００番地からの４バイトにコピーする。このようにすることで、新しいバージョンのオブジェクトファイルを、ＶＡＲ_Ｃの値が１２３４の状態から開始できるようになる。
【符号の説明】
【００４５】
１００  自動分析装置操作端末
１１０  自動分析装置本体
１２０  通信ネットワーク
１３０  情報処理装置
１４０  ＣＰＵ
１５０  不揮発性メモリ
１６０  メインメモリ
１７０  通信Ｉ／Ｆ
１８０  モータコントローラ
１９０  Ａ／Ｄ変換器
１９５  制御プログラム
２００  リンク情報テーブル
２１０  オブジェクトファイル名称
２２０  定義関数テーブル
２３０  定義変数テーブル
２４０  参照関数テーブル
３００  定義関数名
３１０  実関数アドレス
３２０  仮関数アドレス
４００  定義変数名
４１０  変数アドレス
４２０  変数サイズ
５００  参照関数名
５１０  オフセット
６００  呼び出しカウントテーブル
６１０  オブジェクトファイル名称
６２０  呼び出しカウント
【図１】
2012221133.tif 000003
【図２】
2012221133.tif 000004
【図３】
2012221133.tif 000005
【図４】
2012221133.tif 000006
【図５】
2012221133.tif 000007
【図６】
2012221133.tif 000008
【図７】
2012221133.tif 000009
【図８】
2012221133.tif 000010
【図９】
2012221133.tif 000011
【図１０】
2012221133.tif 000012
【図１１】
2012221133.tif 000013
【図１２】
2012221133.tif 000014