(57)【要約】ＳＭＩを生成した呼出し命令のアドレスを、システム管理モード（ＳＭＭ）中にしか見えないディスパッチ・テーブルによって参照することにより、ＳＭＩに応答して制御を安全にＳＭＭに移すためのシステムおよび方法。ディスパッチ・テーブル中のエントリは、呼出し命令とそのターゲット関数との間のリンクを提供する。ディスパッチ・テーブルを生み出すには、構築中のソフトウェア製品のソース・コード中に、ターゲット関数を指定するマクロを挿入すればよい。コンパイル中に、挿入されたマクロが突き止められ、呼出し命令とターゲット関数をリンクするエントリが生み出される。最終的なソフトウェア製品中の呼出し命令は、ターゲット関数のアドレスの標識を提供しない。
2004501407.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上で実行されているプログラムによってシステム管理割込み（ＳＭＩ）が生成された後に制御を安全にシステム管理モード（ＳＭＭ）に移す方法であって、
アプリケーション・プログラム中で呼出し元からのＳＭＩが生成されたことを検出すること、
呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定すること、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合は、ディスパッチ・テーブル中で呼出し元と関連付けられているターゲット関数にディスパッチすること、および
ターゲット関数を実行することを含む方法。
【請求項２】
ターゲット関数の実行が完了した後でＳＭＭから出ること、および
アプリケーション・プログラムの処理を再開することをさらに含む請求項１に記載の方法。
【請求項３】
検出されたＳＭＩのタイプを識別すること、および
識別されたタイプに基づいて、検出されたＳＭＩをＳＭＭ中にＳＭＩイベント・ハンドラにディスパッチすることをさらに含み、
ＳＭＩイベント・ハンドラが、検出されたＳＭＩがディスパッチ・テーブルに含まれているかどうか判定する請求項１に記載の方法。
【請求項４】
呼出し元がディスパッチ・テーブルに含まれていないと判定された場合はＳＭＭから出ることをさらに含む請求項１に記載の方法。
【請求項５】
ディスパッチ・テーブルがＳＭＭ中にしか見えない請求項１に記載の方法。
【請求項６】
ディスパッチ・テーブルがプログラムのコンパイル中に生み出される請求項１に記載の方法。
【請求項７】
コンピュータ上で実行されているプログラムによってシステム管理割込み（ＳＭＩ）が生成された後に制御を安全にシステム管理モード（ＳＭＭ）に移すためのユーティリティであって、
アプリケーション・プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定するための監視ユニットと、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合に、ディスパッチ・テーブル中で呼出し元と関連付けられているターゲット関数にディスパッチするための移行ユニットと、
ターゲット関数を実行するための処理ユニットとを備えるユーティリティ。
【請求項８】
ターゲット関数の実行が完了した後でＳＭＭから出て、アプリケーション・プログラムの処理を再開するための完了ユニットをさらに備える請求項７に記載のユーティリティ。
【請求項９】
検出されたＳＭＩのタイプを識別するためのタイプ検出ユニットと、
識別されたタイプに基づいて、検出されたＳＭＩをＳＭＭ中にＳＭＩイベント・ハンドラにディスパッチするためのハンドラ・ユニットとをさらに備え、
ＳＭＩイベント・ハンドラが、検出されたＳＭＩがディスパッチ・テーブルに含まれているかどうか判定する請求項７に記載のユーティリティ。
【請求項１０】
呼出し元がディスパッチ・テーブルに含まれていないと判定された場合にＳＭＭから出るための完了ユニットをさらに備える請求項７に記載のユーティリティ。
【請求項１１】
ディスパッチ・テーブルがＳＭＭ中にしか見えない請求項７に記載のユーティリティ。
【請求項１２】
ディスパッチ・テーブルがプログラムのコンパイル中に生み出される請求項７に記載のユーティリティ。
【請求項１３】
通常モードまたはシステム管理モード（ＳＭＭ）で動作するＣＰＵを有するコンピュータ・システムであって、コンピュータ・システム上で実行されているプログラムによってシステム管理割込み（ＳＭＩ）が生成された後に制御を安全にＳＭＭに移すためのデバイスを備え、前記デバイスが、
アプリケーション・プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、
呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定し、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合は、ディスパッチ・テーブル中で呼出し元と関連付けられているターゲット関数にディスパッチし、
ターゲット関数を実行するように構成されたコンピュータ・システム。
【請求項１４】
ターゲット関数の実行が完了した後でＳＭＭから出て、
アプリケーション・プログラムの処理を再開するようにさらに構成された請求項１３に記載のデバイス。
【請求項１５】
検出されたＳＭＩのタイプを識別し、
識別されたタイプに基づいて、検出されたＳＭＩをＳＭＭ中にＳＭＩイベント・ハンドラにディスパッチするようにさらに構成されたデバイスであって、
ＳＭＩイベント・ハンドラが、検出されたＳＭＩがディスパッチ・テーブルに含まれているかどうか判定する請求項１３に記載のデバイス。
【請求項１６】
呼出し元がディスパッチ・テーブルに含まれていないと判定された場合はＳＭＭから出るようにさらに構成された請求項１３に記載のデバイス。
【請求項１７】
ディスパッチ・テーブルがＳＭＭ中にしか見えない請求項１３に記載のデバイス。
【請求項１８】
ディスパッチ・テーブルがプログラムのコンパイル中に生み出される請求項１３に記載のデバイス。
【請求項１９】
コンピュータ・システム上で実行されているプログラムによってシステム管理割込み（ＳＭＩ）が生成された後に制御を安全にシステム管理モード（ＳＭＭ）に移すためのユーティリティを有するコンピュータ可読記憶デバイスであって、前記ユーティリティが、
アプリケーション・プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定するための監視ユニットと、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合に、ディスパッチ・テーブル中で呼出し元と関連付けられているターゲット関数にディスパッチするための移行ユニットと、
ターゲット関数を実行するための処理ユニットとを備える、コンピュータ可読記憶デバイス。
【請求項２０】
ターゲット関数の実行が完了した後でＳＭＭから出て、アプリケーション・プログラムの処理を再開するための完了ユニットをさらに備える請求項１９に記載のユーティリティ。
【請求項２１】
検出されたＳＭＩのタイプを識別するためのタイプ検出ユニットと、
識別されたタイプに基づいて、検出されたＳＭＩをＳＭＭ中にＳＭＩイベント・ハンドラにディスパッチするためのハンドラ・ユニットとをさらに備え、
ＳＭＩイベント・ハンドラが、検出されたＳＭＩがディスパッチ・テーブルに含まれているかどうか判定する請求項１９に記載のユーティリティ。
【請求項２２】
呼出し元がディスパッチ・テーブルに含まれていないと判定された場合にＳＭＭから出るための完了ユニットをさらに備える請求項１９に記載のユーティリティ。
【請求項２３】
ディスパッチ・テーブルがＳＭＭ中にしか見えない請求項１９に記載のユーティリティ。
【請求項２４】
ディスパッチ・テーブルがプログラムのコンパイル中に生み出される請求項１９に記載のユーティリティ。
【請求項２５】
ソース・コードの形で利用可能なプログラムによって生成されたシステム管理割込み（ＳＭＩ）呼出しを妥当性検査できるプログラム・システムを開発する方法であって、
ソース・コードをコンパイルすること、
ＳＭＩ呼出しの位置およびそのターゲットを識別する少なくとも１つの所定の標識をソース・コード中で識別すること、
所定の標識に関連する情報に基づいてディスパッチ・テーブルを生み出すことであって、ディスパッチ・テーブル中の各エントリが、プログラム中でＳＭＩを生成する呼出し元を、システム管理モード（ＳＭＭ）中に実行されるターゲット関数と関連付けるものであること、および、
ディスパッチ・テーブルを、ＳＭＭ中にディスパッチャからアクセス可能な場所に記憶することを含む方法。
【請求項２６】
所定の標識が、どのターゲット関数にディスパッチするかを識別する請求項２５に記載の方法。
【請求項２７】
ディスパッチ・テーブル中の呼出し元をアドレスで識別すること、および
ディスパッチ・テーブル中のエントリを呼出し元のアドレスに従ってソートすることをさらに含む請求項２５に記載の方法。
【請求項２８】
コンパイルしたＳＭＭコードをディスパッチ・テーブルによって共にリンクすることをさらに含む請求項２５に記載の方法。
【請求項２９】
プログラムを実行すること、
プログラム中で呼出し元からのＳＭＩが生成されたことを検出すること、
呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定すること、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合は、ディスパッチ・テーブル中で呼出し元に関連付けられているターゲット関数にディスパッチすること、および
ターゲット関数を実行することをさらに含む請求項２８に記載の方法。
【請求項３０】
ソース・コードの形で利用可能なプログラムによって生成されたシステム管理割込み（ＳＭＩ）呼出しを妥当性検査できるプログラム・システムを開発するためのユーティリティであって、
ソース・コードをコンパイルし、ＳＭＩ呼出しの位置およびそのターゲットを識別する少なくとも１つの所定の標識をソース・コード中で識別するためのコンパイラと、
所定の標識に関連する情報に基づいてディスパッチ・テーブルを生み出すテーブル・ユニットあって、ディスパッチ・テーブル中の各エントリが、プログラム中でＳＭＩを生成する呼出し元を、システム管理モード（ＳＭＭ）中に実行されるターゲット関数と関連付けるテーブル・ユニットと、
ディスパッチ・テーブルを、ＳＭＭ中にディスパッチャからアクセス可能な場所に記憶するためのリンカとを備えるユーティリティ。
【請求項３１】
所定の標識が、どのターゲット関数にディスパッチするかを識別する請求項３０に記載のユーティリティ。
【請求項３２】
ディスパッチ・テーブル中の呼出し元をアドレスで識別するための識別ユニットと、
ディスパッチ・テーブル中のエントリを呼出し元のアドレスに従ってソートするためのソーティング・ユニットとをさらに備える請求項３０に記載のユーティリティ。
【請求項３３】
リンカが、コンパイルされたＳＭＭコードをディスパッチ・テーブルによって共にリンクする請求項３０に記載のユーティリティ。
【請求項３４】
プログラムを実行するための処理ユニットと、
プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定するための監視ユニットと、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合に、ディスパッチ・テーブル中で呼出し元に関連付けられているターゲット関数にディスパッチするための移行ユニットとをさらに備え、
処理ユニットがターゲット関数を実行する請求項３３に記載のユーティリティ。
【請求項３５】
ソース・コードの形で利用可能なプログラムによって生成されたシステム管理割込み（ＳＭＩ）呼出しを妥当性検査できるプログラム・システムを開発するためのデバイスを備えるコンピュータ・システムであって、前記デバイスが、
ソース・コードをコンパイルし、
ＳＭＩ呼出しの位置およびそのターゲットを識別する少なくとも１つの所定の標識をソース・コード中で識別し、
所定の標識に関連する情報に基づいてディスパッチ・テーブルを生み出すように構成され、ディスパッチ・テーブル中の各エントリが、プログラム中でＳＭＩを生成する呼出し元を、システム管理モード（ＳＭＭ）中に実行されるターゲット関数と関連付け、前記デバイスがさらに、
ディスパッチ・テーブルを、ＳＭＭ中にディスパッチャからアクセス可能な場所に記憶するように構成された、コンピュータ・システム。
【請求項３６】
所定の標識が、どのターゲット関数にディスパッチするかを識別する請求項３５に記載の方法。
【請求項３７】
ディスパッチ・テーブル中の呼出し元をアドレスで識別し、
ディスパッチ・テーブル中のエントリを呼出し元のアドレスに従ってソートするようにさらに構成された請求項３５に記載の方法。
【請求項３８】
コンパイルしたＳＭＭコードをディスパッチ・テーブルによって共にリンクするようにさらに構成された請求項３５に記載の方法。
【請求項３９】
プログラムを実行し、
プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、
呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定し、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合は、ディスパッチ・テーブル中で呼出し元に関連付けられているターゲット関数にディスパッチし、
ターゲット関数を実行するようにさらに構成された請求項３８に記載の方法。
【請求項４０】
ソース・コードの形で利用可能なプログラムによって生成されたシステム管理割込み（ＳＭＩ）呼出しを妥当性検査できるプログラム・システムを開発するためのユーティリティを有するコンピュータ可読記憶デバイスであって、前記ユーティリティが、
ソース・コードをコンパイルし、ＳＭＩ呼出しの位置およびそのターゲットを識別する少なくとも１つの所定の標識をソース・コード中で識別するためのコンパイラと、
所定の標識に関連する情報に基づいてディスパッチ・テーブルを生み出すテーブル・ユニットあって、ディスパッチ・テーブル中の各エントリが、プログラム中でＳＭＩを生成する呼出し元を、システム管理モード（ＳＭＭ）中に実行されるターゲット関数と関連付けるテーブル・ユニットと、
ディスパッチ・テーブルを、ＳＭＭ中にディスパッチャからアクセス可能な場所に記憶するためのリンカとを備える、コンピュータ可読記憶デバイス。
【請求項４１】
所定の標識が、どのターゲット関数にディスパッチするかを識別する請求項４０に記載のユーティリティ。
【請求項４２】
ディスパッチ・テーブル中の呼出し元をアドレスで識別するための識別ユニットと、
ディスパッチ・テーブル中のエントリを呼出し元のアドレスに従ってソートするためのソーティング・ユニットとをさらに備える請求項４０に記載のユーティリティ。
【請求項４３】
リンカが、コンパイルされたＳＭＭコードをディスパッチ・テーブルによって共にリンクする請求項４０に記載のユーティリティ。
【請求項４４】
プログラムを実行するための処理ユニットと、
プログラム中で呼出し元からのＳＭＩが生成されたことを検出し、呼出し元がディスパッチ・テーブルに含まれているかどうかをＳＭＭ中に判定するための監視ユニットと、
呼出し元がディスパッチ・テーブルに含まれていると判定された場合に、ディスパッチ・テーブル中で呼出し元に関連付けられているターゲット関数にディスパッチするための移行ユニットとをさらに備え、
処理ユニットがターゲット関数を実行する請求項４３に記載の方法。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は一般に、システム管理モード（ＳＭＭ：ｓｙｓｔｅｍ ｍａｎａｇｅｍｅｎｔ ｍｏｄｅ）のオペレーションに関し、より詳細には、ソフトウェア・システム管理割込み（ＳＭＩ：ｓｙｓｔｅｍ ｍａｎａｇｅｍｅｎｔ ｉｎｔｅｒｒｕｐｔ）を処理するために制御を安全に通常オペレーション・モードからＳＭＭに移すシステムおよび方法に関する。
【０００２】
（発明の背景）
８０×８６ベースのシステムでは、実モード、保護モード、および仮想モードを含めたいくつかの通常のオペレーティング・モードがある。これらのモードでのオペレーション中は、システムは制御をシステム管理モード（ＳＭＭ）に移すことが可能である。ＳＭＭは、システム管理割込み（ＳＭＩ）と呼ばれる特別な割込みに応答して入るものである。ＳＭＩが生成されることによってシステムはＳＭＭに入り、ＳＭＭ中でしか見えない別の位置からコードの実行を開始する。ＳＭＭにある間にＣＰＵによって実行されるこのコードは、システム管理ＲＡＭ（ＳＭＲＡＭ：ｓｙｓｔｅｍ ｍａｎａｇｅｍｅｎｔ ＲＡＭ）中に位置する。ＳＭＭに入ると、現在の実行時コンテキストおよびＣＰＵレジスタはすべて、ＣＰＵセーブ状態表と呼ばれる特別な領域に記憶される。このＣＰＵセーブ状態表は、ＳＭＭにある間はＣＰＵからアクセス可能である。セーブ状態表は、システムＣＰＵ自体によって、またはＳＭＭに入るとすぐに実行されるコードによって埋められる。
【０００３】
システム中のＣＰＵは、ＳＭＩ＃と通常呼ばれるピンがアサートされたときにＳＭＭに入る。このピンは普通、ＳＭＩコントローラなどシステム中の単一チップの制御下にあり、ハードウェアまたはソフトウェアによって開始される様々なイベントに応答してアサートされる。例えば、ハードウェアＳＭＩは、システムがそのハード・ドライブに何回アクセスするかなど、ハードウェア・アクティビティをプロファイルするのに使用することができる。その他のハードウェア・イベントは、タイマ終了、温度測定値、入力信号トグル、または特定ピン上の電圧が高くなることに対応する場合がある。ソフトウェアＳＭＩは、例えば、電力管理を制御したり、ファームウェア中にどれだけコードを配置できるかに関する空間制限に対処したりするのに使用することができる。ソフトウェアＳＭＩを生成するための代表的なイベントには、入出力ポートへの書込みや、特定のメモリ位置への書込みが含まれる。システムは普通、ＳＭＩを処理してＳＭＩソースのタイプに基づいて処理ルーチンにディスパッチするためのソフトウェアを備える。
【０００４】
システム内には、単一の「ソフトウェア」ＳＭＩイベント・ソースを使用してＳＭＭ内のあり得る複数の関数にディスパッチするための機構を備えることが有用である。一般にこの目的には、単一のＳＭＩイベント・ソースを、ターゲット関数を指定するいくつかの手段と共に使用する。通常、ターゲット関数は、その実行アドレスが汎用レジスタにロードされることによって指定される。ＳＭＩが検出されると、ＳＭＩを処理するためのコードが、汎用レジスタ中の値を使用してターゲット関数を呼び出す。汎用レジスタの値は、ＳＭＩの時点におけるＣＰＵレジスタの内容を含む領域であるＣＰＵセーブ状態表から読み取る。
【０００５】
マルチプロセッサ・システム中で実行するときは、どのプロセッサがＳＭＩを生成したか決定することが可能である。この決定を行うには、ＣＰＵセーブ状態領域にみられる、ＳＭＩがアサートされた時点における各ＣＰＵの命令ポインタを、ソフトウェアＳＭＩを生成できるファームウェア中の既知の実行アドレスの表と比較する。合致があれば、そのＣＰＵがＳＭＩを生成したことが示される。次いで、ターゲット関数を指定する汎用レジスタの内容について、識別されたプロセッサのＣＰＵセーブ状態領域を調べる。
【０００６】
汎用レジスタ中の値が承認済みのターゲット関数を指すことを、妥当性検査することも可能である。セキュリティ・テーブルが、承認済みターゲット関数のリストを追加する。次いで、汎用レジスタの内容をテーブル中のすべてのエントリと比較する。エントリが見つかった場合は、そのターゲット関数を呼び出す。エントリが見つからなかった場合は、システムはＳＭＭを出る。これは、システムにいくらかのセキュリティをもたらすものの、ターゲット関数を妥当性検査するだけであり、呼出し元、すなわちソフトウェアＳＭＩを生成したコードを妥当性検査するものではない。
【０００７】
これらのＳＭＩ処理システムには、いくつかの欠点がある。第一に、汎用レジスタを使用してターゲット関数アドレスを保持しなければならないので、このレジスタは他のパラメータを渡すのに使用することができず、その結果、より長く難しいコードを書くことになる。また、セキュリティは、承認済みターゲット関数を未承認の時に呼び出すことによってすり抜けることができる。また、呼出しアドレスが検証されないので、ターゲット関数への承認済みエントリ・ポイントを決定する強引な方法を用いる「クラッキング」アプリケーションを書くことも容易である。もう１つの欠点は、ターゲット・アドレスを検証する現在の実装形態はターゲット・テーブルをソートせず、したがってより時間がかかることである。最後に、これらの実装形態は中央化された承認済み関数リストを使用するが、これはしばしば、目下の製品に厳密に必要な関数よりも多くの関数が「承認済」としてリストされることを意味する。
【０００８】
（発明の概要）
簡単に言うと、本発明によれば、コンピュータ上で実行されているプログラム中でシステム管理割込み（ＳＭＩ）が生成された後に制御をシステム管理モード（ＳＭＭ）に安全に移す方法において、プログラム中で呼出し元からのＳＭＩが生成されたことを検出する。次いで、呼出し元がディスパッチ・テーブルに含まれるかどうかをＳＭＭ中で決定する。呼出し元がディスパッチ・テーブルに含まれると判断される場合は、ディスパッチ・テーブル中で呼出し元に関連付けられているターゲット関数にプログラム制御をディスパッチする。次いでターゲット関数を実行する。
【０００９】
本発明の他の態様では、ソース・コードの形で利用可能なプログラムによって生成されるシステム管理割込み（ＳＭＩ）呼出しを妥当性検査できるプログラム・システムを開発する方法において、ソース・コードをコンパイルする。コンパイル中に、ＳＭＩ呼出しの位置およびそのターゲットを識別する少なくとも１つの所定の標識をソース・コード中で識別する。所定の標識に関連する情報に基づいてディスパッチ・テーブルを生み出すが、ディスパッチ・テーブル中の各エントリは、プログラム中でＳＭＩを生成する呼出し元を、システム管理モード（ＳＭＭ）中に実行されることになるターゲット関数と関連付ける。ディスパッチ・テーブルは、ＳＭＭ中にディスパッチャからアクセス可能な場所に記憶する。
【００１０】
（好ましい実施形態の詳細な説明）
本発明を具体的な実施形態のコンテキストで述べるが、本発明はこのように限定されるものではない。
【００１１】
図１に、ＳＭＩ処理プロセスの流れ図を示す。図１に示すように、ＳＭＩ処理プロセスはまず、現在実行中のアプリケーション・プログラムがＳＭＩイベントを生成したことを検出する（ステップ１１０）。ＳＭＩの生成元である現在実行中のアプリケーション・プログラム中の命令を、呼出し元と呼ぶ。この時点で、ＳＭＩを生成したアプリケーション・プログラムを実行しているＣＰＵの現在の実行時コンテキストおよびＣＰＵレジスタをＣＰＵセーブ状態表に記憶する。ＣＰＵセーブ状態表に記憶された情報は、ＳＭＩの処理時に必要ならＳＭＭからアクセス可能である。
【００１２】
次いでＳＭＩ処理プロセスは、ＳＭＩイベントのタイプを識別する（ステップ１２０）。例えばＳＭＩは、ソフトウェアタイプまたはハードウェアタイプのＳＭＩである場合もあり、当技術分野で知られている他の何らかのタイプのＳＭＩである場合もある。識別したＳＭＩタイプに基づいて、ＳＭＭは、ＳＭＩを適切なＳＭＩイベント・ハンドラにディスパッチする（ステップ１３０）。一般にＳＭＭは、生成される場合のある種々のＳＭＩタイプそれぞれに対するＳＭＩイベント・ハンドラを含む。
【００１３】
次いでＳＭＩイベント・ハンドラは、生成されたＳＭＩの処理を開始する（ステップ１４０）。ＳＭＩがソフトウェアタイプのＳＭＩである場合は、ＳＭＩの処理は、生成されたＳＭＩに関連するターゲット関数にディスパッチすることを含む（ステップ１５０）。一般に、ハードウェアタイプのＳＭＩの処理は、ターゲット関数へのディスパッチを含まない。ソフトウェアＳＭＩを処理する際にディスパッチされるターゲット関数は、アプリケーション・プログラム中のサブルーチン呼出しまたは関数呼出しに類似する。ただし、ＳＭＭ中にディスパッチされるターゲット関数は、ＳＭＭ内だけでしか見えず、他のどんなオペレーショナル・モードのＣＰＵからもアクセス不可能である。
【００１４】
ＳＭＩが生成されるシステムがマルチプロセッサ・システムである場合は、ＳＭＩイベント・ハンドラはまた、ＳＭＩ生成元であるＣＰＵにどのＣＰＵセーブ状態表が関連するか決定するために、インストール済みＣＰＵのうちの１つに対応するコード・セグメント（ＣＳ）および命令ポインタ（ＩＰ）を求めてインストール済みＣＰＵをサーチする。実行されるターゲット関数がＣＰＵのセーブ状態表からの情報を必要とする場合、どのＣＰＵのセーブ状態表を参照するかを知る必要があることがある。
【００１５】
ターゲット関数の実行が完了した後、ＳＭＩ処理プロセスはＳＭＭを出て、前に実行されていたアプリケーション・プログラムに制御を戻す（ステップ１６０）。さらに、ＣＰＵのセーブ状態表中の情報を復元する。
【００１６】
図２は、本発明による、ＳＭＩの呼出し元を妥当性検査するためのディスパッチ・テーブルを生み出すための、ソフトウェア・プログラム開発プロセスの流れ図である。ディスパッチ・テーブルは、承認済みの呼出し元を特定のターゲット関数とリンクするものだが、このディスパッチ・テーブルを生み出すには、アプリケーション・プログラムを生成するためのソース・コードを修正して、ソフトウェアＳＭＩが生成されることを示す標識を含める（ステップ２１０）。この標識は、例えば、ソフトウェアＳＭＩを明示的に生成するマクロやコードとして実装することができる。標識のパラメータが、ソフトウェアＳＭＩの生成に応答して呼び出されるターゲット関数を指定する。例えばマクロとして実装されるときは、この標識は、呼び出されるターゲット関数のアドレスを呼出し元のアドレスと共に特別なコード・セグメントに追加するマクロ・コードとすることができる。この場合、ソース・コード中の、ソフトウェアＳＭＩの生成に関する標識が現れるポイントが、前掲の考察における「呼出し元」に対応する。
【００１７】
このソース・コードがアプリケーション・プログラムやＲＯＭ  ＢＩＯＳコンポーネントなどの最終的なソフトウェア製品に構築される準備ができると、最初にソース・コードをコンパイルする（ステップ２２０）。ソース・コードのコンパイル中に、コンパイラは、ソフトウェアＳＭＩの生成に関する標識をそれぞれ突き止める（ステップ２３０）。突き止めた各標識につき、コンパイラは、ソフトウェアＳＭＩを生成する命令を標識の位置に生成する（ステップ２４０）。システム中で使用される特定のチップセットに応じて、コンパイラによって生成される命令は「ｏｕｔ」命令である場合がある。生成された命令のアドレスは、ソフトウェアＳＭＩを生成する呼出し元に関する識別として働く。生成された命令のアドレスと一緒にターゲット関数のアドレスが、コンパイラによって、他のＳＭＩソフトウェア割込み呼出しに対する他の類似の呼出し元とターゲット関数アドレスの対と共に、特別なセグメント中に配置される。ただし、生成された命令自体は、ＳＭＩを処理するための実行されるターゲット関数の標識もそのアドレスも提供しない。ターゲット関数の識別の標識をプログラム・コード中に残さないことにより、呼出し元から特定のターゲット関数へのリンクはＳＭＭにあるときだけしか見えず、したがって、最終的なソフトウェア製品のコードを見ている者は、ソフトウェアＳＭＩを生成するｏｕｔ命令によって呼び出されるターゲット関数を見ることはない。
【００１８】
突き止めた各標識につき「ｏｕｔ」命令を生成することに加えて、コンパイラは、特別なセグメント・データから、各呼出し元を標識中で指定される対応ターゲット関数とリンクするテーブル・エントリも生み出す（ステップ２５０）。呼出し元およびそれに関連するターゲット関数を識別するために、各エントリには、呼出し元のアドレスおよびターゲット関数のアドレスが備わることが好ましい。ソフトウェアＳＭＩの生成と同様、ディスパッチ・テーブルについての各エントリの生成も、マクロを使用して行うことができる。次いで、生み出した各テーブル・エントリを、例えばコンパイラ、リンカ、または特別なポストリンカによってディスパッチ・テーブル中に配置し、ＳＭＭコード中に記憶する（ステップ２６０）。最後のステップで、コンパイル中に生み出したオブジェクト・コードを共にリンクして、最終的なソフトウェア製品を生み出す（ステップ２７０）。
【００１９】
生み出したテーブル・エントリからディスパッチ・テーブルを生み出すとき、ディスパッチ・テーブルの構成を最適化することが可能である。具体的には、ユーティリティを使用して、呼出し元をそれらのアドレスでソートすることができ、また重複エントリがあれば除去することができる。ＳＭＩイベント・ハンドラは線形サーチの代わりにバイナリサーチを用いることができるので、エントリをソートすることにより、最終的なソフトウェア製品の実行中に生成されるソフトウェアＳＭＩの処理を加速することができる。さらに、重複エントリを除去することにより、ディスパッチ・テーブル中のエントリの数が削減され、それにより、ＳＭＩイベント・ハンドラの処理するエントリがより少なくなるのでその処理が加速される。また、重複エントリを除去すると、ディスパッチ・テーブルに必要なＲＯＭ内などの記憶空間の量も削減される。
【００２０】
コンパイル、リンク、セグメントの使用、およびソートに関するこれ以上の詳細については、参照により本明細書に組み込む、１９９９年９月２４日出願のＣｏｈｅｎ他の「Ａ  Ｓｏｆｔｗａｒｅ  Ｄｅｖｅｌｏｐｍｅｎｔ  Ｓｙｓｔｅｍ  ｔｈａｔ  Ｐｒｅｓｅｎｔｓ  ａ  Ｌｏｇｉｃａｌ  Ｖｉｅｗ  ｏｆ  Ｐｒｏｊｅｃｔ  Ｃｏｍｐｏｎｅｎｔｓ，Ｆａｃｉｌｉｔａｔｅｓ  Ｔｈｅｉｒ  Ｓｅｌｅｃｔｉｏｎ，ａｎｄ  Ｓｉｇｎａｌｓ  Ｍｉｓｓｉｎｇ  Ｌｉｎｋｓ  Ｐｒｉｏｒ  ｔｏ  Ｃｏｍｐｉｌａｔｉｏｎ」という名称の出願第０９／４０４２９８号を参照されたい。
【００２１】
図３は、本発明による、ソフトウェアＳＭＩを処理するために制御を安全にＳＭＭに移すプロセスの流れ図である。図１と同様、このプロセスの最初のステップは、ソフトウェアＳＭＩの生成を検出することである（ステップ３１０）。検出したソフトウェアＳＭＩは、次いで、ソフトウェアＳＭＩを処理するＳＭＩイベント・ハンドラにディスパッチする（ステップ３２０）。ＳＭＩイベント・ハンドラは、検出されたソフトウェアＳＭＩを生成した呼出し元の適切な識別、好ましくは呼出し元のアドレスを使用して、ディスパッチ・テーブル中をサーチし、呼出し元がディスパッチ・テーブル中にあるかどうか決定する（ステップ３３０）。前述のようにディスパッチ・テーブルがソートされている場合、ＳＭＩイベント・ハンドラはバイナリサーチを行って、呼出し元がディスパッチ・テーブル中にあるかどうか決定することができる。呼出し元がディスパッチ・テーブル中にない場合は、システムはＳＭＭから出て、ＣＰＵセーブ状態表から情報を復元し、命令がＳＭＩを生成した時点のアプリケーション・プログラムに制御を返す（ステップ３７０）。
【００２２】
呼出し元がディスパッチ・テーブル中にある場合は、ＳＭＩイベント・ハンドラは、ディスパッチ・テーブル中で呼出し元とリンクされているターゲット関数を識別する（ステップ３４０）。呼出し元の識別と同様、ターゲット関数もアドレスで識別されるのが好ましい。ターゲット関数を識別した後、ＳＭＩイベント・ハンドラは、プログラム制御をターゲット関数にディスパッチする（ステップ３５０）。次いでターゲット関数が実行される（ステップ３６０）。ターゲット関数の実行が完了すると、システムはＳＭＭから出て、ＣＰＵセーブ状態表から情報を復元し、命令がＳＭＩを生成した時点のアプリケーション・プログラムに制御を返す（ステップ３７０）。
【００２３】
呼出し元と実行されるターゲット関数との間の唯一のリンクがディスパッチ・テーブル中にあり、かつディスパッチ・テーブルはＳＭＭコード中に位置するので、呼出し元から特定のターゲット関数へのリンクは、ＳＭＭにあるときだけしか見えない。この結果、最終的なソフトウェア製品を見ている者は、指定されるターゲット関数を見ることはなく、ソフトウェアＳＭＩの生成しかしない「ｏｕｔ」命令を見るだけである。したがって、ディスパッチ・テーブル内で見つかるアドレスから実行される有効な呼出し元だけが、プログラム制御を実際にターゲット関数にディスパッチするＳＭＩを生成することができる。ほとんどのソフトウェアＳＭＩは、比較的アクセスが難しいシャドウＲＡＭに記憶されたＲＯＭコード・イメージから生成されるので、ハッキング・ユーティリティがこのコードに対して書き込むのはよりずっと難しく、したがってＳＭＭへの制御移行はさらに安全になる。
【００２４】
図４は、本発明のソフトウェアＳＭＩ処理プロセスを実施するコンピュータ・システムのブロック図である。図４に示すように、コンピュータ４００は、ＣＰＵ４０４、メイン・メモリ４０６、ＲＯＭ４０８、記憶デバイス４１０、および通信インタフェース４１８を備え、これらはすべてバス４０２を介して結合されている。ＣＰＵ４０４は、単一のマイクロプロセッサとして、またはマルチプロセッシング・システムの場合は複数のプロセッサとして実装することができる。メイン・メモリ４０６は、ＲＡＭおよびより小さいサイズのキャッシュによって実装するのが好ましい。ＲＯＭ４０８は、例えばＥＰＲＯＭやＮＶＲＡＭとして実装できる不揮発性記憶デバイスである。記憶デバイス４１０は、ハード・ディスク・ドライブまたは他の任意のタイプの不揮発性書込み可能記憶装置とすることができる。本発明のソフトウェアＳＭＩ処理プロセスを実施するためのプログラミングまたはコードは、ＲＯＭ４０８と記憶デバイス４１０のどちらかに記憶するのが好ましい。
【００２５】
このシステムはＳＭＭ  ＲＡＭ４０７を含むが、これは通常、メイン・メモリＲＡＭ４０６の一部である。ＳＭＭ  ＲＡＭ４０７は、通常はアクセス不可能である。例えばこれは、外部ビデオ・メモリと同じアドレスを占有する場合がある。通常、ＳＭＭプログラムは、システム初期化中にＲＯＭ４０８からＳＭＭ  ＲＡＭ４０７に転送される。
【００２６】
コンピュータ４００の外部には、表示装置４１２、入力デバイス４１４、およびカーソル制御デバイス４１６があり、これらもまたバス４０２に結合されている。表示装置４１４は、ＣＲＴまたはＬＣＤ表示デバイスとして実装することができる。入力デバイス４１４は好ましくはキーボードであり、カーソル制御デバイス４１６はマウス、トラックボール、または他のポインティング・デバイスとして実装することができる。
【００２７】
通信インタフェース４１８は、ネットワーク・リンク４２０を介したローカル・ネットワーク４２２への両方向データ通信連結装置を形成する。例えば、通信インタフェース４１８が統合サービス・ディジタル網（ＩＳＤＮ）カードまたはモデムである場合は、通信インタフェース４１８は、対応するタイプの電話回線へのデータ通信接続を提供する。通信インタフェース４１８がローカル・エリア・ネットワーク（ＬＡＮ）カードである場合は、通信インタフェース４１８は、適合するＬＡＮへのデータ通信接続を提供する。無線リンクもまた可能である。このような実装形態のどれにおいても、通信インタフェース４１８は、種々のタイプの情報を表すディジタル・データ・ストリームを搬送する電気信号、電磁信号、または光信号を送受信する。
【００２８】
ネットワーク・リンク４２０は、通常、１つまたは複数のネットワークを介した他のデータ・デバイスへのデータ通信を提供する。例えばネットワーク・リンク４２０は、ローカル・ネットワーク４２２を介して、ホスト・コンピュータ４２４への接続、またはインターネット・サービス・プロバイダ（ＩＳＰ）４２６によって操作されるデータ装置への接続を提供することができる。ＩＳＰ４２６は、インターネット４２８を介したデータ通信サービスを提供する。ローカル・ネットワーク４２２とインターネット４２８は両方とも、ディジタル・データ・ストリームを搬送する電気信号、電磁信号、または光信号を使用する。コンピュータ４００との間でディジタル・データを搬送する、様々なネットワークを通る信号と、ネットワーク・リンク４２０上にあり、通信インタフェース４１８を通る信号とは、情報を運ぶ搬送波の例示的な形である。
【００２９】
コンピュータ４００は、ネットワーク、ネットワーク・リンク４２０、および通信インタフェース４１８を介して、メッセージを送信し、プログラム・コードを含めたデータを受信することができる。インターネットの例では、サーバ４３０が、インターネット４２８、ＩＳＰ４２６、ローカル・ネットワーク４２２、および通信インタフェース４１８を介して、アプリケーション・プログラム用に要求されたコードを送信することができる。本発明によれば、ダウンロードされるこのようなアプリケーションの１つは、本明細書に述べたソフトウェアＳＭＩ処理プロセスである。
【００３０】
受信したコードは、受信したときにＣＰＵ４０４によって実行するか、記憶デバイス４１０に記憶するか、後で実行するために他の何らかの不揮発性記憶域に記憶することができる。このようにして、コンピュータ４００は、搬送波の形でアプリケーション・コードを得ることができる。
【００３１】
本発明は、平面オリジナルを走査するものとして記述および例示したが、これはクリティカルではない。実際、３次元画像を走査するためにこれらの技術をいくつ用いることができるかは、当業者なら容易に理解するであろう。しかし、好ましい実施形態は、当該の画像が紙、透明画、写真などの媒体上に形成され、走査デバイスが媒体と接触しているものである。
【図面の簡単な説明】
【図１】
ＳＭＩ処理プロセスの流れ図である。
【図２】
本発明による、ＳＭＩの呼出し元を妥当性検査するためのディスパッチ・テーブルを生み出すプロセスの流れ図である。
【図３】
本発明による、ソフトウェアＳＭＩに対して制御を安全にＳＭＭに移すプロセスの流れ図である。
【図４】
本発明による、ＳＭＩ処理プロセスを実施するためのコンピュータのブロック図である。
【図１】
2004501407.tif 000003
【図２】
2004501407.tif 000004
【図３】
2004501407.tif 000005
【図４】
2004501407.tif 000006
【国際公開パンフレット】
2004501407.tif 000007
2004501407.tif 000008
2004501407.tif 000009
2004501407.tif 000010
2004501407.tif 000011
2004501407.tif 000012
2004501407.tif 000013
2004501407.tif 000014
2004501407.tif 000015
2004501407.tif 000016
2004501407.tif 000017
2004501407.tif 000018
2004501407.tif 000019
2004501407.tif 000020
2004501407.tif 000021
2004501407.tif 000022
2004501407.tif 000023
2004501407.tif 000024
2004501407.tif 000025
2004501407.tif 000026
2004501407.tif 000027
2004501407.tif 000028
【国際公開パンフレット（コレクトバージョン）】
2004501407.tif 000029
2004501407.tif 000030
【国際調査報告】
2004501407.tif 000031
2004501407.tif 000032
2004501407.tif 000033