(57)【特許請求の範囲】
【請求項１】
モジュール・ローダと固定ロケータとパッチ・セレクタとパッチとを含むオペレーティング・システムを使用して、コンピュータ・プラットフォーム内のプログラム・コード・モジュールをパッチする方法において、
前記モジュール・ローダがメモリ内にモジュールをロードするステップと、
前記固定ロケータが指定の命令コードがあるかどうか確認し、前記モジュール内で指定の命令コードを突き止めるステップと、
前記パッチ・セレクタが前記命令コードと使用可能なパッチとを突き合わせ、前記命令コード用のパッチを選択するステップと、
前記パッチによって前記命令コードを変更するステップとを含む方法。
【請求項２】
各モジュールが変更のための複数の命令コード位置を含む、請求項１に記載の方法。
【請求項３】
前記各命令コード位置が、同じかまたは異なる複数の命令コードを含み、同じかまたは異なる複数のパッチにそれぞれ関連し、前記命令コードと前記パッチとの関係がヘッダで定義される、請求項２に記載の方法。
【請求項４】
前記命令コードが、前記モジュール・ヘッダ内のテーブルを調べることによって、前記モジュール内で検出される、請求項１、２、または３に記載の方法。
【請求項５】
前記プラットフォームが、前記命令コード用の少なくとも１つのパッチを含むオペレーティング・システムを有する、請求項１ないし４のいずれか一項に記載の方法。
【請求項６】
前記パッチが、前記オペレーティング・システム内にプリロードされて、該オペレーティング・システム内にとどまるか、またはアプリケーションの初期設定とともにプリロードすることができる、請求項１ないし５のいずれか一項に記載の方法。
【請求項７】
前記パッチが、要求があり次第、前記アプリケーションと同じソースからロードされる、請求項１ないし５のいずれか一項に記載の方法。
【請求項８】
前記パッチが、そのメモリ位置に直接ロードすることにより、前記命令コードの上に重ねられる、請求項１ないし７のいずれか一項に記載の方法。
【請求項９】
前記パッチがダイナミック・リンク・ライブラリからエクスポートされる、請求項１ないし７のいずれか一項に記載の方法。
【請求項１０】
前記パッチがダイナミック・リンク・ライブラリ・ファイルである、請求項９に記載の方法。
【請求項１１】
モジュール・ローダと固定ロケータとパッチ・セレクタとパッチとを含むオペレーティング・システムを使用して、コンピュータ・プラットフォーム内のプログラム・コード・モジュールをパッチするための装置であって、
メモリと、
前記モジュール・ローダにより前記メモリ内にモジュールをロードする手段と、
前記固定ロケータにより指定の命令コードがあるかどうか確認し、前記モジュール内で所与の命令コードを突き止める手段と、
前記パッチ・セレクタにより前記命令コードと使用可能なパッチとを突き合わせ、前記命令コード用のパッチを選択する手段と、
前記パッチによって前記命令コードを変更する手段と
を含む装置。
【請求項１２】
前記プログラム・コード・モジュールが、コード・セグメントとポインタとを含み、前記ポインタが前記コード・セグメント内の命令コード・フィールドの位置値を有し、前記ポインタが他のモジュールに関連付けられ、それにより、前記コンピュータ・プラットフォーム内にロードされると、前記命令コードを変更する手段が、関連モジュールをパッチすることによって、前記命令コードを変更する、請求項１１に記載の装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータ・アプリケーションの管理に関する。特に、本発明は、複数のプラットフォーム向けに作成されるコンピュータ・アプリケーションの最適化に関する。
【０００２】
【従来の技術】
コンピュータ・プログラムの中には、ハードウェアが異なるかまたはオペレーティング・システムのバージョンが異なる場合に異なる命令シーケンスを必要とするものがある。たとえば、Intelのｘ８６シリーズのプロセッサ上では、プログラムはアトミック方式でメモリ位置を更新する必要がある可能性がある。マシンが単一のマイクロプロセッサを有する場合、命令ｉｎｃ［カウンタ］は、メモリ位置「カウンタ」を示し、検索した値に１を加え、その結果をそのメモリ位置に記憶することになる。これはすべて１つのマシン命令で行われるので、この動作中にそのプログラムを中断することはできず、したがって、プログラム実行の他のスレッドは同時にその位置を更新できないはずである。マルチプロセッサ・マシン上では、第１のプロセッサが読取りを完了した後でしかも書込みを完了する前に、もう１つのプロセッサがメモリ位置を読み取ることもできる。第２のプロセッサがそのメモリ位置の値も増分しようと試みる場合、増分は失われることになる。このような事態を防止するために、Intelの命令セットはロック・プレフィックス（lock prefix）を用意しているが、これは、読取り変更書込み命令（read-modify-write instruction）が完了するまで第２のプロセッサがそのメモリ位置にアクセスするのを防止するものである。ロック・プレフィックス（ロックｉｎｃ［カウンタ］）は単一プロセッサ・マシン上で使用することができるが、プレフィックスの結果としてメモリ・キャッシュ・システムが迂回される可能性があるので、パフォーマンス上の欠点がある。したがって、単一プロセッサ・マシン上にロック・プレフィックスを選択的に含める必要性がある。
【０００３】
以前は、各環境ごとに異なるバージョンのソフトウェアを出荷する必要があった。このため、新しいバージョンまたは修正バージョンを出荷するときにすべての異なる環境向けに構築しなければならないので、出荷されるプログラム・コードのサイズが２倍になり、メンテナンスの複雑さをもたらす可能性がある。
【０００４】
もう１つの欠点は、ランタイム時にそのアプリケーションに対して何らかのパッチを当てなければならないことである。この場合、書込み可能な１つのメモリ内にコードを入れることが必要になり、そのため、プログラム・コードが偶然または故意に破壊される可能性がある。しかし、一部のオペレーティング・システムまたはプロセッサでは、書込み可能コード・メモリを認めていないかまたはそれを複雑なものにする。たとえば、Intelのｘ８６プロセッサは、実行可能かつできる限り読取り可能なコード・セグメントを備えているが、書込み可能なコード・セグメントを備えていない。そのコードをパッチするためには、書込み可能なデータ・セグメントによってコード・セグメントに別名を割り当てる必要があると思われる。
【０００５】
その動作のためにサブルーチンを使用することは可能であるが、これにより、呼出しおよび戻りのオーバヘッド（call and return overhead）が命令に追加される。
【０００６】
【発明が解決しようとする課題】
本発明の目的は、コンピュータ・プラットフォーム内のプログラム・コード・モジュール（ＤＬＬなど）を解明する（resolve）ための装置、プログラム・コード、および方法を提供することである。
【０００７】
【課題を解決するための手段】
コンピュータ・プラットフォーム内のプログラム・コード・モジュールを解明する方法であって、前記方法は、メモリ内にモジュールをロードすること、そのモジュール内で命令コードを突き止めること、その命令コード用のパッチを選択すること、およびそのパッチによって命令コードを変更することを含む。
【０００８】
オペレーティング・システムでは、そのオペレーティング・システムおよびプラットフォーム向けにアプリケーションを最適化するために、ダイナミック・モジュール・ローダを使用してアプリケーション内に命令コードをパッチする。これにより、プラットフォームとオペレーティング・システムの組合せごとに異なるアプリケーションを作成する必要性が低減される。命令コードは、モジュール・ヘッダ固定位置ポインタ（module header fix up location pointer）によって指し示される。上記の解決策により、コードはロード時にしかも有利なことにオペレーティング・システム自体によってパッチされる。アプリケーション・プログラムが実行しなければならないのは、正しい命令シーケンスをエクスポートする適切なＤＬＬがインストールされていることを保証することだけである。追加の利点としては、そのコードが書込み不能のままになり、破壊することができず、呼出し戻りのオーバヘッドは一切発生しない。さらに、実行がより高速になり、単一プロセッサの例では、１つのｎｏｐ命令が唯一のオーバヘッドである。
【０００９】
各モジュールは、変更のための複数の命令コード位置を含むことができる。各固定位置は、同じかまたは異なる複数の命令コードを含むことができ、同じかまたは異なる複数のパッチにそれぞれ関連することができる。命令コードとパッチのこのような関係はヘッダで定義される。
【００１０】
固定命令コードは、モジュール・ヘッダ内のテーブル内の固定参照を調べることによって、モジュール内で突き止めることができる。同じヘッダは、使用すべきパッチの名前を示すことができる。
【００１１】
プラットフォームは、固定命令コード用の少なくとも１つのパッチを含むことができるオペレーティング・システムを有する。パッチは、オペレーティング・システム内にプリロードされ、半永久的にそこにとどまる場合もあれば、アプリケーションの初期設定とともにプリロードされる場合もある。あるいは、パッチは、要求があり次第、アプリケーションと同じソースからロードすることもできる。
【００１２】
パッチは、そのメモリ位置に直接ロードすることにより、固定命令コードの上に重ねることができる。
【００１３】
有利なことに、パッチは、ダイナミック・リンク・ライブラリからエクスポートすることができる。また、パッチは、ダイナミック・リンク・ライブラリ・ファイルにすることができ、まさにＤＬＬのように動作することができる。パッチ内の命令にオーバレイするためのプロセスは既知のダイナミック・リンクの場合と同じであり、オペレーティング・システムの適応処理は一切不要である。
【００１４】
ダイナミック・リンク・ライブラリを処理するための機能を有するオペレーティング・システムは、本発明を可能にするよう変更する必要はない。したがって、本発明の一実施の形態は、ダイナミック・リンクのための能力を有する複数のオペレーティング・システム上で実現することができる。
【００１５】
固定操作命令は、それにより次の操作のためのプレフィックス操作（prefix operation）を重ねるというオプションが可能になるノーオペレーション命令にすることができる。プレフィックス操作を必要としないプラットフォームの場合、ノーオペレーション命令は最小限のオーバヘッドで所定の位置にとどまることになる。このようなシステム用のパッチがロードされた場合、それは、効果を否定するためのノーオペレーション命令を含むことになるだろう。プレフィックスから利益を得ると思われるプラットフォームの場合、パッチはそのプレフィックスを含み、次のコードまたは前のコードに対する破壊なしにそのノーオペレーション命令を置換することになるだろう。
【００１６】
有利なことに、プラットフォームがマルチプロセッサである場合、プレフィックス操作は、変更読取り書込み命令中に他のプロセッサからメモリをロックするためのロック操作になる。これにより、単一プロセッサ・プラットフォームおよび複数プロセッサ・プラットフォームに単一目的コード・アプリケーションを使用できるようになる。
【００１７】
この実施の形態のもう１つの有益な用途は、固定位置が呼出しサブルーチン命令であり、パッチがその呼出しサブルーチン命令を変更する場合である。たとえば、このサブルーチンは、様々なプラットフォームの場合に任意選択である場合もあれば、アプリケーションの開発中および開発後に時折使用されるトレースである場合もある。
【００１８】
この実施の形態の他の有益な用途は、固定位置がある構造内へのオフセットであり、パッチがそのオフセットを変更する場合である。通常、互換性を保持するために、構造サイズはＤＬＬの全バージョンにわたって維持しなければならない。オフセットがダイナミック値としてインポートされる場合、そのオフセットはプログラムとは無関係に変更することができる。
【００１９】
固定位置は、既知のダイナミック・リンク用のアドレスならびに命令コードを指し示すことができる。
【００２０】
コンピュータ・プラットフォームへのプログラム・コード・モジュールを解明するためのオペレーティング・システムであって、前記オペレーティング・システムは、メモリ内にモジュールをロードする手段と、そのモジュール内で所与の命令コードを突き止める手段と、その命令コード用のパッチを選択する手段と、そのパッチによって命令コードを変更する手段を含む。
【００２１】
本発明は、コンピュータ・プラットフォーム内にロードするためのプログラム・モジュールを提供し、前記プログラム・モジュールはコード・セグメントと固定ポインタとを含み、前記ポインタはコード・セグメント内の命令コード・フィールドの位置値を有し、前記ポインタは他のモジュールに関連付けられ、それにより、コンピュータ・プラットフォーム内にロードされると、関連モジュールをパッチすることによって、命令コードが変更される。
【００２２】
コンピュータ・アプリケーションは、ますます以前より多い操作メモリを使用している。この需要の一因となる要因の１つは、１つのアプリケーションを単一の連続コードではなく多くの別々かつ独立したモジュールに分割するオブジェクト指向プログラム技法への移行であった。モジュールはある程度の独立性を備えているので、他のモジュールによって参照された場合のみ、そのモジュールをメモリ内にロードすることができる。モジュールは、参照されると、メモリ内にロードされ、アプリケーションにリンクされる。すなわち、アプリケーションからモジュールへの参照は、プロセッサがアプリケーションからモジュールへならびにその逆にシームレスにジャンプできるように、ハードコードされる。ロードおよびリンクのための既知のモジュールの１つは、ダイナミック・リンク・ライブラリ・ファイル（ＤＬＬ）である。ＤＬＬファイルにリンクされるジャンプまたは呼出し命令は、その命令コード用の命令フィールドと、参照したＤＬＬファイルにリンクされる空のアドレス・フィールドとを有する。ダイナミック・リンク・リゾルバは、確立されたモジュールのヘッダ内の参照のテーブルを調べることにより、確立されたモジュール内のＤＬＬの名前を突き止める。ＤＬＬファイルは特定のメモリ位置にロードされ、リゾルバは、その特定のメモリ位置の絶対アドレスまたは相対アドレスによってその命令のアドレス・フィールドをリンクするかまたは更新する。
【００２３】
本発明は、リンク先となるルーチンのオフセットまたはアドレスではなく、命令シーケンスをパッチするために、オペレーティング・システムのダイナミック・リンク機能を使用する。これは、コンピュータ・プログラムのオペレーティング・システムおよびプロセッサのバージョンが異なる場合にダイナミック・リンクを使用して命令シーケンスをパッチするものである。アプリケーション・プログラムまたはオペレーティング・システムは、入口点アドレスではなく実際の命令シーケンスをエクスポートするダイナミック・リンク・ライブラリを提供することができる。その場合、このようなダイナミック・リンク・ライブラリの様々なバージョンは、それらがルーチンの入口点アドレスである場合と同様に、最高４バイトのデータとして様々な命令シーケンスをエクスポートすることになる。次にこれらは、呼出しルーチンによってインポートされ、実際の命令の命令コードとして扱われる。
【００２４】
【発明の実施の形態】
図１を参照すると、オペレーティング・システム１６がＲＡＭ１４にロードされた後であってアプリケーション１８が完全にロードされる前の一時点におけるディスク・メモリ１２とＲＡＭ１４とを有するプロセッサ（図示せず）を含むコンピュータ・プラットフォーム１０が示されている。ディスク・メモリ１２は、プリロードされたアプリケーションを構成するダイナミック・リンク・ライブラリ・ファイルの形でモジュール２０Ａ、２０Ｂを記憶する。ＲＡＭ１４にロードされると、アプリケーション１８は、モジュール２０Ａ、２０Ｂに対応するコンポーネント２４Ａ、２４Ｂを含む。このコンポーネントはコード３２Ａ、３２Ｂのシーケンスを含み、そのコードは、オペレーティング・システムのタイプ、プラットフォームのタイプ、そのプラットフォームが単一プロセッサであるかマルチプロセッサであるかを含む、様々な要因に応じて変更する必要がある可能性がある。基本的なオペレーティング・システム機能だけでなく、オペレーティング・システムはダイナミック・モジュール・ロード能力をさらに含む。この実施の形態では、ダイナミック・モジュール・ロード能力は、モジュール・ローダ２２と、固定ロケータ２４と、パッチ・セレクタ２６と、コード変更プログラム（code modifier）２８と、パッチ３０Ａ、３０Ｂとを含む。たとえば、プラットフォームは、ＯＳ／２またはWindowsというオペレーティング・システムを有するPentiumベースのプロセッサにすることもできる。しかし、この実施の形態は、ダイナミック・リンク・ロードを有するどのような作業プラットフォームおよびオペレーティング・システム上またはこの実施の形態で説明するようにモジュールを動的にロードするように適合されたオペレーティング・システム上でも実現することができる。
【００２５】
図２を参照すると、モジュール・ローダ２２は、ディスク・メモリ内のモジュール２０Ａを突き止め、それをアプリケーション１８にロードして（ステップ１）アプリケーションのコンポーネント２４Ａを形成する。固定コード・ロケータ２４は、コンポーネント２４Ａを構文解析して３２Ａおよび３２Ｂに示すような固定コードがあるかどうかを確認する（ステップ２）。パッチ・セレクタ２６は、固定コードと３０Ａおよび３０Ｂなどの使用可能なパッチとを突き合わせる（ステップ３）。この場合、パッチ・セレクタ２６は、固定コード３２ＡとＤＬＬパッチ３０Ａとを突き合わせる。コード変更プログラム２８はパッチ３０Ａを使用して固定コード３２Ａを上書きする（ステップ４）。固定コード３２ＢおよびＤＬＬパッチ３０Ｂについて、このステップの繰返しを行う。
【００２６】
この実施の形態では、各モジュールは、一度に１つずつロードされ、ステップ１は、後続ステップが終了した後でモジュール２０Ｂおよびディスク・メモリ１２内の他のモジュールについて繰り返されるが、他の実施の形態では、ステップ２を実行する前にすべてのモジュールを同時にロードすることができる。この実施の形態では、固定コード・ロケータ２４は、一度に１つずつ、プラットフォーム固有部分をサーチし（ステップ２）、ヒットするたびにステップ３に移行する。しかし、他の実施の形態では、ロケータは、ステップ３の前にすべてのプラットフォーム固有部分を同時に突き止め、その部分とコンポーネント内のその位置を示すテーブルを作成することができる。この実施の形態では、１つの固定位置とパッチとの突合せが行われ、次にステップ４でコンポーネントを変更するためにプロセスは移行する。しかし、他の実施の形態では、パッチ・セレクタは、テーブル内のすべての固定位置と対応するパッチとを突き合わせることができる。この実施の形態では、他のモジュールが突き止められる（ステップ２）前に各固定位置が対応するパッチで変更される（ステップ４）。しかし、他の実施の形態では、コード変更プログラムは、テーブル内にリストされた複数のプラットフォームで指定される対応するパッチで変更することができる。
【００２７】
この実施の形態では、実際のロック・プレフィックス命令が他のダイナミック・リンク・ライブラリからインポートされる。
EXTERN LOCKOPC:ABS；これは「LOCKOPC」という記号を外部値を備えた定数として宣言する。
db     LOCKOPC    ；LOCKOPCは外部参照であり、ロード時にｎｏｐまたはロックにパッチされる。「ｄｂ」はLOCKOPCの値であるバイトを定義する。
inc    [counter]  ；増分カウンタ
【００２８】
LOCKOPCは他のダイナミック・リンク・ライブラリで定義される。２つのバージョンが構築され、一方は「ｎｏｐ」命令への解明を行う（図４を参照）単一プロセッサ・マシン用であり、もう一方は「ロック」命令への解明を行う（図５を参照）マルチプロセッサ・マシン用である。
単一プロセッサ・マシンの場合：
LOCKOPC EQU 090h  ；アセンブラの観点から見ると、これは、ノーオペレーション（ｎｏｐ）用の命令コードである１６進の９０としてLOCKOPCを定義する。
PUBLIC LOCKOPC    ；LOCKOPCをソース・ファイルの外側から見えるようにする。
マルチプロセッサ・マシンの場合
LOCK1 EQU 0F0h    ；ロック命令プレフィックス
PUBLIC LOCK1
どちらのバージョンも同じ名前のダイナミック・リンク・ライブラリ内に構築される。次に、単一プロセッサまたはマルチプロセッサのどちらのバージョンが必要であるかに応じて、適切なバージョンがインストールされるかまたはオペレーティング・システムにとって使用可能な状態になる。
【００２９】
アプリケーション・プログラムが実行されると、プログラム・コードがロードされ、他のダイナミック・リンク・ライブラリへの外部参照が解明される。通常、これらは他のダイナミック・リンク・ライブラリ内のルーチンのアドレスへの参照であり、これらのアドレスはプログラム内にパッチされる。たとえば、
EXTRN func1:proc
call  proc
などのコードの場合、「proc」プロシージャは他のファイルで宣言され、それはコンパイルして、ダイナミック・リンク・ライブラリとして構築することができる。このプログラムが実行準備のできたオペレーティング・システムによってロードされると、「proc」などへの外部参照は、「proc」ルーチンを含むダイナミック・リンク・ライブラリをロードし、アプリケーション・プログラム内の「proc」へのすべての参照をダイナミック・リンク・ライブラリ内の「proc」ルーチンのメモリ内アドレスにパッチすることによって解明される。
【００３０】
時には、ＤＬＬから絶対値をインポートすることができる。これらはロードされたＤＬＬ内のアドレスではなく、ＤＬＬ内に含まれる絶対値であり、そのＤＬＬがメモリ内のどこにロードされても一定である。たとえば、ＯＳ／２では、定数DOSHUGESHIFTはDOSCALLS.DLLからエクスポートされる（図３を参照）。
EXTRN DOSHUGESHIFT:abs  ；外部絶対変数DOSHUGESHIFTを宣言する。
mov   ecx, DOSHUGESHIFT ；DOSHUGESHIFTの値をecxレジスタに移動する。
shl   eax, cl           ；clレジスタ内に保持されるカウント（reg ecxの下位８ビット）だけeaxレジスタをシフトする。
【００３１】
この実施の形態では、命令シーケンスがパッチされ、したがって、３２ビット・アドレスをパッチするローダの代わりに、ダイナミック・リンク・ライブラリが（ＤＬＬ内のルーチンのアドレスではなく）絶対値をエクスポートし、ローダはこの絶対値を使用してプログラム・メモリ内の８ビット・バイトをパッチし、それが命令として扱われる。
【００３２】
既知のダイナミック・リンクでは、ＤＬＬ「Ａ」はアプリケーションのロードの一部としてロードされる。そのＤＬＬ内の一部のアドレス参照は完全に解明されるわけではなく、そのＤＬＬ内の再配置テーブルは、コード内の所与の呼出しアドレスを他のＤＬＬ「Ｂ」内に保持されるルーチンの実アドレスで置換する必要があり、ＤＬＬ「Ａ」とＤＬＬ「Ｂ」の両方がアプリケーション用のメモリ内にロードされたときにこのパッチが行われることを指定するものである。次に呼出し命令が解明され、ＤＬＬ「Ｂ」内に保持されるコードへの呼出しを行うことにより、ＤＬＬ「Ｂ」内にあるものとして指定されたサブルーチンへの呼出しが行われる。
【００３３】
所与の既知の状況（図３を参照）では、宛先アドレスをパッチするのではなく、絶対データ値が動的にパッチされる。たとえば、「DOSHUGESHIFT」という記号は、オペレーティング・システムの一部のバージョンでは１２３（１０進数）という値を有し、他のバージョンでは３（１０進数）を有するようなＯＳ／２のカーネルＤＬＬによってエクスポートされる記号である。このカーネルＤＬＬは図３ではＤＬＬ「Ｂ」と呼ぶ。オペレーティング・システムの様々なバージョンについてＤＬＬ「Ｂ」の様々なバージョンが存在し、オペレーティング・システム全体がインストールされると適切なバージョンがインストールされる。ＤＬＬ「Ａ」が「DOSHUGESHIFT」という記号をインポートした場合、ロード時に、オペレーティング・システムのそのバージョン用の正しい値がＤＬＬ「Ａ」用のコード内の命令のデータ・フィールド内にパッチされることになる。
【００３４】
図４および図５に関連して、複数の実施の形態の例について説明する。
【００３５】
本発明の一実施の形態を図４に示す。モジュール２０Ａのコード・セグメントおよびヘッダはメモリ内にロードされる。モジュール２０Ａの再配置テーブルは、モジュール３０Ａ内の「LOCKOPC」という記号の再配置をモジュール２０Ａ用のコード・セグメント内の位置３および６に付加しなければならないことを指定する。ロードされたオペレーティング・システムは、モジュール２０Ｂをロードし、「LOCKOPC」という記号への参照をモジュール内に保持された絶対値に解明する。オペレーティング・システムの図４のバージョンでは、その値は０ｘＦ０である。次にこの絶対値はモジュール２０Ａ内の位置３および６にパッチされ、そこでこの値は「ＩＮＣ」命令および「ＤＥＣ」命令用の命令コード「ＬＯＣＫ」プレフィックスとして機能する。これにより、その命令はマルチプロセッサ・システム上のマルチスレッド化プログラム上で安全に使用できるものになる。「ＬＯＣＫ」プレフィックスは、命令の持続時間中、システム・メモリ・バスがロックされ、したがって、他のいかなるプロセッサも読取り、増分／減分、書込みの間にメモリ位置を更新できないことを保証するものである。
【００３６】
単一プロセッサ・システムでは、「ＬＯＣＫ」プレフィックスは効率の悪いものである。というのは、それがシステム・バスをロックし、メモリ・サブシステム内のデータ・キャッシュを迂回するからである。このプレフィックスを単一プロセッサ・システム上で使用しないことは望ましいことであるが、そのプログラムの２つのバージョンを維持することは複雑なことであり、ランタイム時にコードをパッチすることは、そのコード・セグメントが書込み可能メモリ内にあり、したがって、誤ったプログラムによって占有される可能性があることを意味する。本発明を使用することにより、単一プロセッサ・マシン上には、記号「LOCKOPC」が０ｘ９０という値を有するようにオペレーティング・システムとともにモジュール３０Ａの異なるバージョンがインストールされるはずである（図５を参照）。Intelの２８６、３８６、４８６、Pentium、Pentium II上では、これは「ＮＯＰ」またはノーオペレーション命令である。プロセッサは「ＮＯＰ」命令を実行し、次に別の命令として実際の「ＩＮＣ」命令または「ＤＥＣ」命令を実行する。「ＩＮＣ」または「ＤＥＣ」はロック・プレフィックスを備えていないので、データ・キャッシュを使用して実行することができ、したがって、かなり高速で実行され、その高速化は「ＬＯＣＫ」プレフィックスを備えていないことによって残されたプログラム内の空間を充填するためにのみ必要な「ＮＯＰ」命令を実行する際のコストの低さより重要である。オペレーティング・システムがモジュール３０Ａを供給しない場合、アプリケーション・プログラムは、それが単一プロセッサまたはマルチプロセッサのどちらのシステム上にインストールされたかに応じて、モジュール３０Ａの２つのバージョンのうちの一方をインストールすることができる。
【００３７】
WindowsはMicrosoft Corporationの商標である。PentiumはIntel Corporationの商標である。ＯＳ／２はIBM Corporationの商標である。
【００３８】
ＩＢＭオペレーティング・システム／２のアプリケーション・プログラムの例（その抜粋）を以下に示す。
app1.asm:           ；アプリケーション・ソース・ファイルの名前
EXTERN LOCKOPC:ABS
db    LOCKOPC       ；LOCKOPCは外部参照であり、ロード時にｎｏｐまたはロックにパッチされる。
inc   [counter]
app1.def:           ；モジュール定義ファイル（モジュール２０Ａ用のヘッダを構築する）
NAME app1           ；モジュールの名前
CODE SHARED
DATA MULTIPLE NONSHARED
IMPORTS
LOCK.LOCKOPC
lockuni.asm:        ；単一プロセッサ環境用の第１のＤＬＬ
LOCKOPC EQU 090h    ；ｎｏｐ命令
PUBLIC LOCKOPC      ；アセンブラ・ファイル外で見えるようにする。
lockuni.def
LIBRARY LOCK        ；ＬＯＣＫという名前のＤＬＬを定義する。
CODE SHARED
DATA NONE
EXPORTS
LOCKOPC       ；DLL:LOCKからのエクスポートのためにLOCKOPCという記号を定義する。
lockmulti.asm:      ；マルチプロセッサ環境用の第２のＤＬＬ
LOCKOPC EQU 0F0h    ；ロック命令プレフィックス
PUBLIC LOCK1
lockmulti.asm:
LIBRARY LOCK
CODE SHARED
DATA NONE
EXPORTS
LOCK1
【００３９】
インストール時に、LOCKUNI.DLLまたはLOCKMULTI.DLLがインストールされ、適宜、LOCK.DLLとしてリネームされる。ロック・プレフィックスだけでなく、パッチ可能な他の命令としては、デバッグ用の呼出し命令が考えられる。たとえば、以下の通りである。
call subroutine1
test eax, OFFSET FLAT:subroutine1   ；これはアドレスを保持するが、実際上は５バイト用のノーオペレーションであり、すなわち、いかなるレジスタ値も変更されない。
【００４０】
呼出し命令の０Ａ９ｈを０Ｅ８ｈにパッチすることにより、この呼出し命令はテスト命令に変換され、サブルーチン呼出しを迂回し、いずれのレジスタにも影響せず、フラグに影響するだけである。これは、製品の生産構築ではなく、デバッグ時にトレース機能を選択的に含めるために使用することもできる。
【００４１】
絶対値により有効にパッチ可能な他の命令としては構造へのオフセットを含む。通常、互換性を保持するために、構造サイズはＤＬＬの全バージョンにわたって維持しなければならない。オフセットがダイナミック値としてインポートされる場合、そのオフセットはアプリケーション・プログラムとは無関係に変更することができる。
EXTRN dataoffset3:ABS
mov   eax, [esi + dataitem3]
他のモジュールでは、以下のようになる。
バージョン１
dataitem1 STRUC
item1 DB    ?       ；未知の値（「？」で示す）の構造内のバイト・フィールドを宣言する。
item2 DW    ?       ；ダブル・バイト・フィールドを宣言する。
dataitem3 DD     ?  ；４バイト・フィールドを宣言する。
dataitem1 ENDS
PUBLIC dataitem3
【００４２】
構造定義が以下に示すものに変更された場合、アプリケーション・プログラムは、再コンパイルまたはスタティック・リンクなしで作業し続けることになる。というのは、ロード時にオフセットは正しい値にパッチされるからである。
バージョン２
dataitem1 STRUC
item1 DB    ?
extraitem   DD   ?  ；後続項目が余分なフィールドによって変位される。
item2 DW    ?
dataitem3 DD     ?
dataitem1 ENDS
【００４３】
オペレーティング・システムのローダがパッチ可能なパッチのタイプのサイズに対応して、そのサイズが１バイト、２バイト、または４バイトであれば、命令全体をパッチすることもできる。
EXTRN INCEAX:abs
db    INCEAX
【００４４】
また、INCEAXは、ＮＯＰに対応して００４０ＦＦ９０ｈまたは００４０ＦＦＦ０ｈとして定義することもできる。
INC   DWORD PTR [EAX+0]   ；reg EAX+0が指し示す位置で４バイトを増分する。
または
LOCK INC DWORD PTR [EAX+0]
【００４５】
まとめとして、本発明の構成に関して以下の事項を開示する。
【００４６】
（１）コンピュータ・プラットフォーム内のプログラム・コード・モジュールを解明する方法において、
メモリ内にモジュールをロードするステップと、
前記モジュール内で指定の命令コードを突き止めるステップと、
前記命令コード用のパッチを選択するステップと、
前記パッチによって前記命令コードを変更するステップとを含む方法。
（２）各モジュールが変更のための複数の命令コード位置を含む、上記（１）に記載の方法。
（３）各固定位置が、同じかまたは異なる複数の命令コードを含み、同じかまたは異なる複数のパッチにそれぞれ関連し、前記命令コードと前記パッチのこのような関係がヘッダで定義される、上記（１）または（２）に記載の方法。
（４）前記固定命令コードが、前記モジュール・ヘッダ内のテーブル内の固定参照を調べることによって、前記モジュール内で検出される、上記（１）、（２）、または（３）に記載の方法。
（５）前記プラットフォームが、固定命令コード用の少なくとも１つのパッチを含むオペレーティング・システムを有する、上記（１）ないし（４）のいずれか一項に記載の方法。
（６）前記パッチが、前記オペレーティング・システム内にプリロードされて、そこにとどまるか、または前記アプリケーションの初期設定とともにプリロードすることができる、上記（１）ないし（５）のいずれか一項に記載の方法。
（７）前記パッチが、要求があり次第、前記アプリケーションと同じソースからロードされる、上記（１）ないし（５）のいずれか一項に記載の方法。
（８）前記パッチが、そのメモリ位置に直接ロードすることにより、前記固定命令コードの上に重ねられる、上記（１）ないし（７）のいずれか一項に記載の方法。
（９）前記パッチがダイナミック・リンク・ライブラリからエクスポートされる、上記（１）ないし（７）のいずれか一項に記載の方法。
（１０）前記パッチがダイナミック・リンク・ライブラリ・ファイルである、上記（９）に記載の方法。
（１１）前記固定操作命令がノーオペレーション命令であり、次の操作のためのプレフィックス操作を重ねるというオプションが可能になる、上記（１）ないし（１０）のいずれか一項に記載の方法。
（１２）前記プレフィックス操作が、変更読取り書込み命令中に他のプロセッサからメモリをロックするためのロック操作である、上記（１１）に記載の方法。
（１３）前記固定位置が呼出しサブルーチン命令であり、前記パッチが前記呼出しサブルーチン命令を変更する、上記（１）ないし（１０）のいずれか一項に記載の方法。
（１４）前記固定位置がある構造内へのオフセットであり、前記パッチが前記オフセットを変更する、上記（１）ないし（１０）のいずれか一項に記載の方法。
（１５）コンピュータ・プラットフォームへのプログラム・コード・モジュールを解明するためのオペレーティング・システムにおいて、前記オペレーティング・システムが、
メモリ内にモジュールをロードする手段と、
前記モジュール内で所与の命令コードを突き止める手段と、
前記命令コード用のパッチを選択する手段と、
前記パッチによって前記命令コードを変更する手段とを含むオペレーティング・システム。
（１６）コンピュータ・プラットフォーム内にロードするためのプログラム・モジュールにおいて、前記プログラム・モジュールが、
コード・セグメントと固定ポインタとを含み、
前記ポインタが前記コード・セグメント内の命令コード・フィールドの位置値を有し、前記ポインタが他のモジュールに関連付けられ、
それにより、前記コンピュータ・プラットフォーム内にロードされると、関連モジュールをパッチすることによって、前記命令コードが変更されるプログラム・モジュール。
（１７）コンピュータ・プラットフォーム内にロードするためのアプリケーション・プログラムにおいて、前記アプリケーションが１つまたは複数のプログラム・モジュールを含み、前記モジュールがコード・セグメントと固定ポインタとを含み、
前記ポインタが前記コード・セグメント内の命令コードを指し示し、前記ポインタが関連のプログラム・モジュールを有し、
それにより、前記コンピュータ・プラットフォーム内にロードされると、関連モジュールをパッチすることによって、前記命令コードが変更されるアプリケーション・プログラム。
【図面の簡単な説明】
【図１】本発明の実施の形態が実行されるプラットフォームの概略表現である。
【図２】本発明の実施の形態の方法の一表現である。
【図３】従来技術によって生成されるコード操作の表現である。
【図４】本発明の実施の形態のコード操作の表現である。
【図５】本発明の実施の形態のコード操作の表現である。
【符号の説明】
１０  コンピュータ・プラットフォーム
１２  ディスク・メモリ
１４  ＲＡＭ
１６  オペレーティング・システム
１８  アプリケーション
２０Ａ  モジュール
２０Ｂ  モジュール
２２  モジュール・ローダ
２４  固定ロケータ
２４Ａ  コンポーネント
２４Ｂ  コンポーネント
２６  パッチ・セレクタ
２８  コード変更プログラム
３０Ａ  パッチ
３０Ｂ  パッチ
３２Ａ  コード
３２Ｂ  コード
【図１】
0003962198.tif 000002
【図２】
0003962198.tif 000003
【図３】
0003962198.tif 000004
【図４】
0003962198.tif 000005
【図５】
0003962198.tif 000006