(57)【特許請求の範囲】
【請求項１】
コードスタック管理のためのコンピュータシステムであって、前記システムは、
ソフトウェアアプリケーションを実行するように構成されたプロセッサと、
コードスタックメモリ領域及びデータスタックメモリ領域を含むメモリであって、前記コードスタックメモリ領域は前記データスタックメモリ領域とは分けられている、メモリと、を含み、かつ、
前記データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの前記実行に対応する１つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
前記コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含む、保持することと、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
前記関数の実行を開始することに基づいて、最新の割り当てられたコードスタックエントリを参照するコードスタックポインタ（ＣＳＰ）の現在値を、前記データスタックの前記関数に対するメモリ位置に格納することと、
前記関数の１つ又は複数のネスト化された関数に対するポインタと関連して使用されるトランポリンに対応する１つ又は複数のコードスタックエントリを、前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記ＣＳＰにより参照される、求めることと、
前記関数を終了する前に、前記格納されたＣＳＰ値を前記メモリ位置からロードすることによって、前記ＣＳＰを復旧することと、
を含む方法を実行するように構成される、システム。
【請求項２】
前記データスタックメモリ領域は書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は実行可能である、請求項１に記載のシステム。
【請求項３】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードスタックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、をさらに含む、請求項１に記載のシステム。
【請求項４】
前記方法は、
前記コードスタック内の最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前
記コードスタックに割り当て、前記ＣＳＰを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項１に記載のシステム。
【請求項５】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
１つ又は複数のコードスタックエントリを、前記関数の１つ又は複数のネスト化された関数に対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記ＣＳＰにより参照される、割り当てることと、
前記関数を終了する前に、前記１つ又は複数のコードスタックエントリに対して割り当てられた合計メモリサイズを前記ＣＳＰから除去することによって、前記ＣＳＰを復旧することと、
をさらに含む、請求項１に記載のシステム。
【請求項６】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、前記データスタックの前記関連したスタックフレームを参照する、ポインタと、を含む、請求項１に記載のシステム。
【請求項７】
前記方法は、
前記コードスタックの前記ＣＳＰの値を、現在の関数のコードスタックバリア（ＣＳＢ）として格納することと、
ネスト化された関数に対するポインタと関連して使用されるトランポリンに対する新しいコードスタックエントリを割り当てることと、
前記コードスタックの前記ＣＳＰを、前記新しいコードスタックエントリを参照するように設定することと、
前記ＣＳＰを前記ＣＳＢと等しくなるように設定し、前記現在の関数を終了する前に、前記新しいコードスタックを前記コードスタックから割り当て解除することと、をさらに含む、請求項１に記載のシステム。
【請求項８】
コードスタック管理を実施するためのコンピュータプログラムであって、
コンピュータのプロセッサによりソフトウェアアプリケーションを実行することと、
データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの実行に対応する１つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含み、前記コードスタックメモリ領域は前記データスタックメモリ領域とは分けられている、保持することと、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
前記関数の実行を開始することに基づいて、最新の割り当てられたコードスタックエントリを参照するコードスタックポインタ（ＣＳＰ）の現在値を、前記データスタックの前記関数に対するメモリ位置に格納することと、
前記関数の１つ又は複数のネスト化された関数に対するポインタと関連して使用されるトランポリンに対応する１つ又は複数のエントリを、前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記ＣＳＰにより参照される、求めることと、
前記関数を終了する前に、前記格納されたＣＳＰ値を前記メモリ位置からロードすることによって、前記ＣＳＰを復旧することと、
を含む方法を実施するための、処理回路により実行される命令を含む、コンピュータプログラム。
【請求項９】
前記データスタックメモリ領域は、書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は、実行可能である、請求項８に記載のコンピュータプログラム。
【請求項１０】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードスタックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、
をさらに含む、請求項８に記載のコンピュータプログラム。
【請求項１１】
前記方法は、
前記コードスタックの最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前記コードスタックに割り当て、前記ＣＳＰを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項８に記載のコンピュータプログラム。
【請求項１２】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
１つ又は複数のコードスタックエントリを、前記関数の１つ又は複数のネスト化された関数に対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記ＣＳＰにより参照される、割り当てることと、
前記関数を終了する前に、前記１つ又は複数のコードスタックエントリに対して割り当てられた合計メモリサイズを前記ＣＳＰから減算することによって、前記ＣＳＰを復旧することと、
をさらに含む、請求項８に記載のコンピュータプログラム。
【請求項１３】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、
前記データスタックの前記関連したスタックフレームを参照する、ポインタと、
を含む、請求項８に記載のコンピュータプログラム。
【請求項１４】
コードスタック管理のためのコンピュータ実装方法であって、
コンピュータのプロセッサによりソフトウェアアプリケーションを実行することと、
データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの前記実行に対応する１つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含み、前記コードスタックメモリ領域は前記データスタックメモリ領域とは離されている、保持することと、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
前記関数の実行を開始することに基づいて、最新の割り当てられたコードスタックエントリを参照するコードスタックポインタ（ＣＳＰ）の現在値を、前記データスタックの前記関数に対するメモリ位置に格納することと、
前記関数の１つ又は複数のネスト化された関数に対するポインタと関連して使用されるトランポリンに対応する１つ又は複数のエントリを、前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記ＣＳＰにより参照される、求めることと、
前記関数を終了する前に、前記格納されたＣＳＰ値を前記メモリ位置からロードすることによって、前記ＣＳＰを復旧することと、
を含む方法。
【請求項１５】
前記データスタックメモリ領域は、書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は、実行可能である、請求項１４に記載の方法。
【請求項１６】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードス
タックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、
をさらに含む、請求項１４に記載の方法。
【請求項１７】
前記方法は、
前記コードスタックの最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることと、
前記関連したスタックフレームに対する前記ポインタが、前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前記コードスタックに割り当て、前記ＣＳＰを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項１４に記載の方法。
【請求項１８】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、前記データスタックの前記関連したスタックフレームを参照する、ポインタと、
を含む、請求項１４に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムに関し、より具体的には、コンピュータプログラム実行中のコードスタックの管理に関する。
【背景技術】
【０００２】
コンピュータシステムは、一般的に、コンピュータプログラムと、半導体、トランジスタ、チップ、回路基板、ストレージデバイス、及びプロセッサなどのハードウェアとの組み合わせを含む。ストレージデバイスは、データ及びコンピュータプログラムを格納し、それらはプロセッサにより実行される。
【０００３】
コンピュータプログラムは、複数のピースに分割されることが多く、このピースは互いに呼び出すつまり起動することができる。このピースは、一般的に、方法、関数、モジュール、部分、等級、手順、又はサブルーチンと呼ばれる。第１のメソッド（呼び出し元）が第２のメソッド（呼び出し先）を呼び出すつまり起動すると、呼び出し元のメソッドが実行を停止し、呼び出し先のメソッドがプロセッサの制御を得て実行を開始する。呼び出し先のメソッドが実行を停止すると、呼び出し先のメソッドは、プロセッサの制御を呼び出し元のメソッドに戻し、呼び出し元のメソッドは、呼び出し先のメソッドを起動した呼び出し命令に続く次の命令で実行を再開する。
【０００４】
呼び出し及び戻し技術を容易にするために、コンピュータは、ランタイムスタック、関数スタック、実行スタック、起動スタック、又は単にスタックとしても知られるコールスタックを使用する場合がある。コールスタックは、各々の動作中のメソッドに対するエントリ（フレームとしても知られる）を含む。エントリは、各メソッドの実行についての情報を格納する。情報は、メソッドの識別子、メソッドの戻りアドレス（呼び出し先メソッドが戻った後、次に実行すべき呼び出し元メソッドの命令の位置）、メソッドにより読み出し又は書き込みされたローカル変数の値、メソッドに送信されたパラメータ、算術演算若しくは論理演算のオペランドの評価スタック、メソッドの最新のインスタンスに対するポインタ、エンクローズ方法コンテキスト、及び／又はメソッドの特権つまり権限レベルのいずれか、一部、又は全てを含むことができる。
【０００５】
コールスタックは、後入れ先出し（ＬＩＦＯ）の原理を使用し、これは、コールスタックの一番上に追加された（プッシュされた）最後の（つまり最新の）エントリが、コールスタックの一番上から除去される（ポップされる）、最初の（又は次の）項目であることを意味する。例えば、第１のメソッドによる第２のメソッドの起動に応答して、新しいエントリが作成され、第１のメソッドについてのコンテキストを保存し、第２のメソッドのローカル変数を保持し、コールスタックの一番上にプッシュされる。第２のメソッドが第３のメソッドを呼び出す場合、第２のメソッドについてのコンテキストを保存し、第２のメソッドのローカル変数を保持するための新しいエントリが、コールスタックの上にプッシュされる。ひとたび現在実行中のメソッドが終了すると、その呼び出し元メソッドのエントリが、スタックの一番上からポップし、呼び出し元メソッドの動作環境を復旧するために使用される。多くのメソッドが互いに呼び出し合い、呼び出しは、ネスト化される、又は再帰的ですらあり得るため、コールスタックは、プログラムを実行するにつれて、増大又は縮小する。
【０００６】
コンピュータシステムにおいて、ネスト化された関数（ネスト化された手順又はネスト化されたサブルーチンとも呼ばれる）は、現在の関数（current function）と呼ばれる別の関数に語彙的に封入された関数である。ネスト化された関数は、構造化プログラミングに対して、多くの手法で用いられる。ネスト化に起因して、ネスト化された関数の範囲は、ネスト化された関数の現在の関数の内側にある。これは、ネスト化された関数が、現在の関数の外側からは不可視の、現在の関数のローカル変数及び他のローカル関数、並びにローカル定数及びタイプにアクセスできることを意味する。ネスト化は、理論上、あらゆる深さ水準まで可能であるが、通常、実際のプログラムではほんの一部の水準までしか使用されない。幾つかの実施形態においては、ネスト化された関数のコードは動的に生成され、現在の関数及びそのルーチンの終了まで持続する。かかる動的に生成されたコードの例は、トランポリン及びシグナルハンドラである。オペレーティングシステムは、動的に生成されたコードをコールスタックに割り当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
コードスタック管理のためのコンピュータシステム、コンピュータプログラム及びコンピュータ実装方法を提供する。
【課題を解決するための手段】
【０００８】
実施形態は、コードスタック管理のための方法、システム及びコンピュータプログラム製品を含む。態様は、ソフトウェアアプリケーションを実行するように構成されたプロセッサを含む。別の態様は、データスタックメモリ領域内にデータスタックを保持することを含み、データスタックはソフトウェアアプリケーションの実行に対応する１つ又は複数のデータ変数を含む複数のスタックフレームを含む。別の態様は、コードスタックメモリ領域内にコードスタックを保持することを含み、コードスタックはソフトウェアアプリケーションの実行に対応する実行可能コンピュータコードを含む複数のコードスタックエントリを含む。
【０００９】
実施形態と見なされる主題は、本明細書の結びの部分にある特許請求の範囲において個々に示され、明確に特許請求される。実施形態の前述及び他の特徴及び利点は、添付図面と併用される以下の詳細な説明から明らかである。
【図面の簡単な説明】
【００１０】
【図１】１つの実施形態によるコードスタック管理のためのコンピュータシステムを示す。
【図２】データスタック及びコードスタックの実施形態を示す。
【図３】データスタック及びコードスタックの実施形態を示す。
【図４】データスタック及びコードスタックの実施形態を示す。
【図５】１つの実施形態による、コードスタックとデータスタックとの同期を含む、コードスタック管理のためのプロセスフローを示す。
【図６】各種実施形態によるコードスタック管理のためのプロセスフローを示す。
【図７】各種実施形態によるコードスタック管理のためのプロセスフローを示す。
【図８】データ領域及びコードスタックの１つの実施形態を示す。
【図９】１つの実施形態によるコンピュータプログラム製品を示す。
【発明を実施するための形態】
【００１１】
コードスタック管理の実施形態が提供され、例示的な実施形態が以下に詳細に説明される。動的に生成されたコードをコードスタックに割り当てることが、スタックオーバーフローシナリオ等のセキュリティ攻撃に対してコンピュータシステムをオープンにすることがある。セキュリティを強化するために、データスタック及びコードスタックを含む２つの別個かつ固有のスタックが、コンピュータメモリ内に保持される。データスタックは、書き込み可能、実行不能メモリ領域内に配置し、一方、コードスタックは、実行可能メモリ領域内に配置することができる。幾つかの実施形態において、コードスタックは、コードスタックへの新しいエントリの割り当て時を除いて、書き込み不能にして、さらに、コードスタックへの新しいエントリの割り当て時に、実行不能にすることができる。従って、アプリケーションに対するセキュリティ攻撃は、実行不能データスタック及び別個のコードスタックにより防止される。別個のコードスタック及びデータスタックにより、動的に生成されたコードは、セキュリティを強化しながら、例えばイベントハンドラ及び語彙的ネスト化に対して、トランポリンをサポートすることできる。
【００１２】
トランポリンは、コードスタックに割り当てることができる。トランポリンは、ネスト化された関数のアドレスが使用されると、ランタイムに生成されるコードの小さいピースである。トランポリンの命令は、２つのこと、つまり、定数アドレスの静的チェーンレジスタへのロード、及びネスト化された関数の実アドレスへのジャンプを行う必要がある。これは２つの命令、つまり、ｍｏｖｅ  ｉｍｍｅｄｉａｔｅ（即値移動）及びｊｕｍｐ（ジャンプ）を必要する。２つのアドレスは、ワード長（word-long）即値オペランドとしてトランポリン内に存在する場合がある。各アドレスをレジスタの２つの部分にロードし、各アドレスのピースに、別個の即値オペランドを形成させる必要がある。
【００１３】
トランポリンを初期化するために生成されるコードは、静的チェーン値及び関数アドレスを命令の即値オペランドに格納する必要がある。静的チェーン及び関数エントリアドレスは、コードスタックの外部に位置する別個のデータ領域に格納することができる。データ領域は、任意に、コードスタックフレーム割り当てサイズ及び関連するデータスタックフレームなどのコードスタックエントリの割り当て及び割り当て解除に使用される、コードスタック管理情報を含むこともできる。幾つかの実施形態において、トランポリンは、割り当てられた後は不変であり、別個のデータ領域に書き込むことによって、ネスト化された関数に対するポインタと共に使用されるように構成される。データ領域は、書き込み可能コードを含まず、それにより、書き込み可能、実行可能トランポリンへのコードインジェクションの危険を回避する。
【００１４】
図１は、コードスタック管理用のコンピュータシステム１００の１つの実施形態を示す。コンピュータシステム１００は、コンピュータシステム１００のメモリ１０５内に格納された実行可能コンピュータコードを含むソフトウェアアプリケーション１０４を実行するプロセッサ１０１を含む。アプリケーション１０４の実行中、プロセッサ１０１は、データスタック１０２及びコードスタック１０３を管理する。データスタック１０２は、書き込み可能で実行不能なメモリ領域を含むメモリ１０５のデータスタックメモリ領域１０６内に配置される。コードスタック１０３は、メモリ１０５のコードスタックメモリ領域１０７内に配置される。コードスタックメモリ領域１０７は、実行可能なメモリ領域を含む。データスタックメモリ領域１０６は、コードスタックメモリ領域１０７とは別個かつ固有で、重複しない。幾つかの実施形態において、コードスタック１０３へのエントリの割り当て中を除き、コードスタックメモリ領域１０７を書き込み不能とすることができ、更に別の実施形態においては、コードスタック１０３へのエントリの割り当て中、コードスタックメモリ領域１０７を一時的に実行不能にすることができる。幾つかの実施形態においては、コードスタックメモリ領域１０７は、カーネルなどのコンピュータシステム１００の信頼できるコンポーネント、又は、信頼できるライブラリ、管理されるランタイム環境、又はハイパーバイザシステムを含むがこれらに限定されない、別のシステムコンポーネントのみによって書き込み可能とすることができる。
【００１５】
幾つかの実施形態において、コードスタック１０３へのネスト化された関数に対するエントリの割り当ては、動的に生成されたトランポリンをメモリページに予め取り込むことによって行うことができる。別の実施形態においては、コードスタックメモリ領域１０７を一時的に書き込み可能にすることによって、トランポリンに対応する１つ又は複数のエントリをコードスタック１０３に割り当てることができる。予め取り込まれたトランポリンに対応するコードスタックエントリがコードスタック１０３に割り当てられた後、コードスタックメモリ領域１０７は、実行可能かつ書き込み不能に設定される。コードスタック１０３へのトランポリンに対応するエントリの割り当て中に、コードスタックメモリ領域１０７が実行不能である実施形態においては、現在実行中のアプリケーション１０４のいずれかの他のスレッドが使用するために、回復コードが提供される。静的チェーン及び関数アドレスデータ等の、コードスタック１０３のトランポリンに対応するエントリ用のデータは、データ領域１１３等の、メモリ１０５の別個のデータ領域に格納されるが、これは、表１Ａ〜表１Ｂ及び図８に関して以下にさらに詳細に説明される。
【００１６】
幾つかの実施形態において、読み出し不許可、書き込み不許可及び実行不許可の組み合わせ等の、制限付き許可を有する１つ又は複数のメモリページを、メモリ１０５のコードスタックメモリ領域１０７の直前及び／又は直後に配置して、例えばコードスタックメモリ領域１０７付近に配置されたバッファのオーバーフロー又はアンダーフローによって、何らかの偶発的な参照、オーバーフロー又はアンダーフローが、コードスタックメモリ領域１０７に及ぶのを防止する。コードスタック１０３をさらに保護するために、随意的に、１つ又は複数のガードページを、コードスタックメモリ領域１０７のコードスタック１０３の上及び下に配置してもよい。
【００１７】
各コードスタックエントリは、データスタック１０２内にそれぞれのスタックフレームを有し、コードスタックエントリを割り当てたスタックフレームに対応することができる。スタックフレームは、プロセッサ１０１により自動的に割り当て及び割り当て解除でき、任意の適切な変数を保持できる。コードスタックメモリ領域１０７は、コンピュータシステム１００のメモリマップにおいて、データスタックメモリ領域１０６から比較的離して配置し、コードスタックメモリ領域１０７への偶発的又は悪意のある書き込みを防止できる。
【００１８】
トランポリンコードの一例を、表１Ａに示す。幾つかの実施形態において、表１Ａに示すようなトランポリンコードは、コードスタック１０３の複数のエントリに挿入することができ、コードスタック１０３のこれらエントリの各々は、データ領域１１３等の対応するそれぞれのデータ領域１１３を有し、コードスタック１０３の各トランポリンに対して一意のそれぞれの関数アドレス及び静的チェーンを特定することができる。
【表１】
0006474398.tif 000002
【００１９】
表１Ａのコードを参照すると、実行は、ラベル「ｔｒａｍｐｏｌｉｎｅ＿ｉｎｉｔｉａｌ」により示される位置から、レジスタｒ０に対して呼び出された関数の戻り値を含有するリンクレジスタを読み出すように適合された命令「ｍｆｌｒ  ｒ０」により開始する。命令「ｂｌ．＋４」は、通常は戻りアドレスとして使用される次の命令の値を生成し、現在のアドレス＋４バイトを示す表記「．＋４」で示される次の命令に制御を渡すように適合される。命令「ｍｆｌｒ  ｒ１１」は、このアドレスをリンクレジスタｌｒからレジスタｒ１１にロードし、後でアドレス指定参照として機能させる。命令「ｍｔｌｒ  ｒ０」は、以前にｒ０にロードされた戻りアドレスを、リンクレジスタｌｒに復旧させる。命令「ｌｄ  ｒ１２，８１９２（ｒ１１）」は、レジスタｒ１１をアドレス指定ベースとして用い、８１９２のオフセットを付加して、２＊４ＫＢのオフセット（つまり、このトランポリンに対して実行コードから２ページ）に位置する関連したデータ領域のアドレスを計算し、制御を渡す関数アドレスとして使用するアドレスをロードする。命令「ｌｄ  ｒ１１，８２００（ｒ１１）」は、静的チェーン値として使用される、レジスタｒ１１に関連付けられたデータ領域からの値をロードする。命令「ｍｔｃｔｒ  ｒ１２」は、ネスト化された関数に対応するプログラムコードを含む関数の開始アドレスを、ｃｔｒ（カウントレジスタ）にロードし、命令「ｂｃｔｒ」は、ｃｔｒの値に分岐する、つまり制御をコンパイルされた関数に渡す。
【００２０】
幾つかの実施形態において、コードスタック１０３内に異種コードが使用され、各コードスタックエントリは別個かつ固有のサイズを有する。他の実施形態において、コードスタックエントリは、それぞれ、同種トランポリンを含み、各トランポリンの関連するデータ領域１１３を設定し、トランポリンサイズを追跡する必要性をなくすことによって、トランポリンの構成を行える。幾つかの実施形態において、多数の異なるコードシーケンスが必要とされる場合、各々が異なるコードシーケンスに対応する複数の同種コードスタックをメモリ１０５に保持できる。コードスタック１０３が同種コードスタックを含む実施形態において、新しいトランポリンに対するエントリがコードスタック１０３に割り当てられると、固定コードシーケンスを保持するように初期化されたコードスタックメモリ領域１０７内にトランポリンが既に存在するので、割り当てられたコードスタックエントリへの書き込みを実施する必要はない。既存のトランポリンは、コードスタックエントリと関連したメモリ１０５の、別個のデータセクションのデータ領域１１３を参照する。従って、ネスト化された関数に対する新しい関数ポインタが作成されると、コードスタックエントリの割り当ては、データ領域１１３のトランポリンと関連付けられた、関数アドレス及び静的チェーン等の、データを初期化することを含む。これは、図８に関して以下にさらに詳細に説明する。
【００２１】
幾つかの実施形態において、予め取り込まれたトランポリンのコードスタック１０３は、メモリ１０５の各トランポリンから固定オフセットに位置するデータ領域１１３等のデータ領域と関連付けられる。例えば表１Ａに示すような、幾つかの実施形態において、オフセットは、全てのトランポリンに対して同一であり、コードスタック１０３のコードスタックエントリと関連付けられた各データ領域１１３は、命令アドレス、現在の命令アドレス、及び次の命令のアドレスのうちの１つの値をロードするｂｌ．＋４命令によりロードされたアドレスから８１９２バイトのところから開始する。幾つかの実施形態において、コードスタックエントリと関連付けられたデータ領域１１３は、コードスタックに格納されたトランポリンを参照するネスト化された関数に対する関数ポインタを介して起動されると、ネスト化された関数の実行環境を初期化するのに必要な情報を保持する。幾つかの実施形態において、関数ポインタは、例えば、ｂｌ．＋４によりロードされた値から８２００のオフセット（２つの４ＫＢページ＋８バイトに対応する）のところに格納されたネスト化された関数の静的範囲の動的インスタンスを指し示すネスト化された関数を含む環境を指し示す静的チェーン等の、ネスト化された関数ポインタ環境をロードすることによって作成される。さらに、ネスト化された関数は、環境を設定する関数のエントリアドレスと関連付けられ、エントリポイントは、ｂｌ．＋４によりロードされた値から８１９２のところに（２つの４ＫＢページに対応する）、つまり、静的チェーンに先行する倍長語（double word）に配置される。
【００２２】
幾つかの実施形態において、トランポリンコードと付加的な構成論理を含むデータ領域１１３との関連付けは、トランポリンコードを含むコードスタックエントリから所定の（静的）オフセット距離に固定サイズのデータ領域を割り当てることによって行われる。しかし、コードスタックのサイズがオフセットを上回ると、さらなる拡張は、データ領域１１３を、以前に割り当てられたコードスタックエントリと重複させてしまうので、さらなる拡張の限界に達する。幾つかの実施形態において、この距離は、必要に応じて変更でき、オフセットが変更されると、コードスタックエントリ及びデータ領域の少なくとも一方が移動され、表１Ａに示すように、オフセット８１９２及び８２００に対応する、トランポリンの全てのオフセットを更新する。幾つかの実施形態において、コードを移動すると、コードスタックエントリに格納されたコードに対する全てのポインタへの更新が必要となるので、データ領域１１３は移動できるが、コードスタックエントリは移動されない。
【００２３】
他の実施形態において、コードスタックエントリとデータ領域の間の対応は、固定オフセットを介しては行われず、論理関連付けを介して行われる。例えば、アドレスｃｂ−ｉ＊ｃｓで開始するｉ番目のコードスタックエントリは、ｃｂはコードスタックベースアドレス、つまり、空のコードスタックに対するコードスタックポインタ（ＣＳＰ）の初期値であり、ｉは割り当てられたｉ番目のスタックフレームであり、ｃｓはコードスタックの固定コードの所定のコードサイズであり、データアドレスｄｂ−ｉ＊ｄｓでｉ番目の関連したデータ領域と関連付けられ、ｄｂはデータベースアドレス、つまり、第１のコードスタックエントリと関連した第１のデータ領域１１３の始まりの、終わりの、又は他の対応するアドレスであり、ｉは割り当てられたｉ番目のデータ領域１１３であり、ｄｓはデータ領域１１３の所定のサイズである。ｄｓが比較的小さい場合、データ領域１１３又はコードスタックのコードスタックエントリを移動させる必要が生じる前に、（ｄｂ−ｃｂ）／ｄｂのスタックフレームを割り当てることができる。下の表１Ｂに、トランポリンコードの一例を示すが、ここでは、オフセットは機能的対応を用いて計算され、各オフセットは、各エントリに対して、オフセット＝ｉ＊（ｄｓ＋ｃｓ）＋（ｄｓ−ｃｓ）＋調整値であるように計算される。
【表２】
0006474398.tif 000003
【００２４】
別の実施形態において、コードスタックエントリ及びデータ領域の衝突に起因するデータ領域の移動を回避するために、コードスタックは一方向に、データ領域は別の方向に増大し、例えば、コードスタックエントリは、アドレスが減少する方向（ｃｂ−ｉ＊ｃｓ）に割り当てられ、関連したデータ領域１１３は、アドレスが増大する方向（ｄｂ＋ｉ＊ｄｓ）に割り当てられる。幾つかの実施形態においては、ｄｂ＝ｃｂである。幾つかの実施形態においては、デバッグ及びアンワインド情報等の付加的な環境情報も、各コードスタックエントリと関連したデータ領域１１３に配置して、デバッグ及び例外処理を可能にする。
【００２５】
図２〜図４は、データスタック及びコードスタックの実施形態２００Ａ〜２００Ｃを示す。図２及び図３は、図１のデータスタック１０２に対応するデータスタック２０１と、図１のコードスタック１０３に対応するコードスタック２０３とを示す。データスタック２０１は、複数のスタックフレーム２０２Ａ〜２０２Ｎを含む。スタックフレーム２０２Ａ〜２０２Ｎの各スタックフレームは、アプリケーション１０４の関数に対応する１つ又は複数の変数を保持する。データスタック２０１のスタックフレーム２０２Ａ〜２０２Ｎは、プロセッサ１０１により自動的に管理される、つまり、データスタック２０１のスタックフレーム２０２Ａ〜２０２Ｎは、アプリケーション１０４により実行されるコードに応答して、アプリケーション１０４により、必要に応じて自動的に割り当て及び割り当て解除される。コードスタック２０３は、例えば、トランポリンコード又はＬＩＦＯ方式で管理することができる他の動的に生成されたコードを含む、複数のコードスタックフレーム２０４Ａ〜２０４Ｎを含む。幾つかの実施形態において、コードスタック２０３の各コードスタックエントリは、データスタック２０１の関連したスタックフレームに対するポインタ（例えば、コードスタックエントリに対応するデータ領域１１３内に格納され、そのコードスタックエントリを作成した関数のスタックフレームを示す）を含み、図２に示すように、コードスタックエントリ２０４Ｂは、スタックフレーム２０２Ｂを参照する関連したスタックフレームに対するポインタ２０７Ａを含み、コードスタックエントリ２０４Ｄは、スタックフレーム２０２Ｄを参照する関連したスタックフレームに対するポインタ２０７Ｂを含む。データスタックポインタ２０６は、データスタック２０１の最新のエントリ（例えば、スタックフレーム２０２Ｎ）を参照し、データスタック２０１の管理に使用される。ＣＳＰ２０５は、データスタック２０３の最新のエントリ（例えば、コードスタックエントリ２０４Ｎ）を参照し、コードスタック２０３の管理に使用される。図３は、データスタック２０１の有効スタックフレーム２０２Ｎを指し示さない関連したスタックフレームに対するポインタ２０７Ｃを有するコードスタックエントリ２０４Ｎを含むコードスタック２０３の実施形態２００Ｂを示し、図３は、図５に関して以下にさらに詳細に説明される。図２〜図３は、単に例示のために示されており、データスタック２０１及びコードスタック２０３はそれぞれ、任意の適切な数のエントリを含むことができる。さらに、図２〜図３において、データスタック２０１及びコードスタック２０３は下向きに増大して示されるが、データスタック２０１及びコードスタック２０３は、それぞれ、メモリ１０５において任意の適切な方向に増大できる。
【００２６】
図４は、スタックフレーム２０２Ａ〜２０２Ｎ及びコードスタックエントリ２０４Ａ〜２０４Ｎと関連した情報の実施形態を示す。スタックフレーム２０２Ａ〜２０２Ｎのうちの１つのスタックフレームに対応するスタックフレーム２１０は、複数の例示データ変数ＶＡＲ１〜ＶＡＲ３を含む。これらの変数は、任意のタイプの任意の適切な変数を含み、スタックフレーム２１０には任意の適切な数の変数が存在できる。コードスタックエントリ２０４Ａ〜２０４Ｎの各コードスタックエントリは、図４に示される関連したコードスタックヘッダ２１２を有するコードスタックエントリ２１１を含むことができる。幾つかの実施形態において、コードスタックヘッダ２１２は、コードスタックバリア（ＣＳＢ）２１３を含む。コードスタックヘッダ２１２は、コードスタックエントリ２１１と関連付けられた、スタックフレーム２１０などの関連したスタックフレームに対するポインタ２１５をさらに含む。コードスタックヘッダ２１２は、各種実施形態においては、図４に示すようにコードスタック２０３のコードスタックヘッダのそれぞれのコードスタックエントリ２１１に配置でき、又は、他の実施形態においては、例えばデータ領域１１３など、コードスタック２０３の外部に配置された別個のデータ構造とすることができる。幾つかの実施形態において、ＣＳＢ２１３は、別個のレジスタに又はスタックフレーム２１０に変数として保持することができる。コードスタックエントリ２１１は、コードセクション２１６をさらに含む。コードセクション２１６は実行可能なコンピュータコードを含み、幾つかの実施形態においては、コードセクション２１６は、ネスト化された関数に対する関数ポインタに対応するトランポリンコードを含む。幾つかの実施形態において、トランポリンコードは、静的チェーンをレジスタにロードし、次に、制御を、コードスタック２０３の外部に配置された関数に渡すことによって、静的にネスト化された関数に対する環境を初期化できる。
【００２７】
データスタック２０１のスタックフレーム２０２Ａ〜２０２Ｎは、プロセッサ１０１により自動的に管理する（つまり、割り当て及び割り当て解除する）ことができる。幾つかの実施形態において、コードスタック２０３のコードスタックエントリ２０４Ａ〜２０４Ｎの管理は、図５に示すコードスタック同期用の方法３００に関して以下に説明するように実施できる。新しいコードスタックエントリをコードスタック２０３に割り当てる前に、方法３００を実行して、コードスタック２０３からあらゆる無効エントリを除去できる。最初に、図５のブロック３０１において、最新のコードスタックエントリ（例えば、図３のコードスタックエントリ２０４Ｎ）に対して、関連したスタックフレームに対するポインタ（例えば、図３に示す、割り当て解除された又は無効のスタックフレームを指し示すポインタ２０７Ｃ）が取り出される。コードスタック２０３の最新のコードスタックエントリは、ＣＳＰ２０５により指し示されるコードスタックエントリである。次に、ブロック３０２において、取り出された関連したスタックフレームに対するポインタが、データスタック２０１の有効スタックフレームを指し示すかどうかが判断される。これは、ブロック３０１において取り出された関連したスタックフレームに対するポインタをデータスタックポインタ２０６と比較することによって判断することができる。データスタック２０１及びコードスタック２０３が下向きに増大する実施形態において、関連するスタックフレームに対するポインタが、データスタックポインタ２０６の値より小さい値を有する場合、ブロック３０２において、関連するスタックフレームに対するポインタは、データスタック２０１の有効エントリを指し示さないと判断される。例えば、図３に示すように、コードスタックエントリ２０４Ｎと関連したスタックフレームに対するポインタ２０７Ｃは、データスタック２０１の有効エントリを指し示さないが、これは、関連したスタックフレームに対するポインタ２０７Ｃはデータスタックポインタ２０６の下に配置された（つまり、より小さい）メモリ領域を指し示すからである。ブロック３０２において、関連するスタックフレームに対するポインタが、データスタック２０１の有効スタックフレームを指し示さないと判断されると、フローはブロック３０２からブロック３０３に進み、コードスタックの最新のエントリが、コードスタック２０３から割り当て解除される。これは、ＣＳＰ２０５をコードスタック２０３において１エントリだけ上方へ移動させることによって行うことができる。図３に示すように、例えば、ブロック３０３において、ＣＳＰ２０５は、上方に動かされてコードスタックエントリ２０４Ｍを指し示し、コードスタックエントリ２０４Ｎは割り当て解除される。フローは、ブロック３０３から、ブロック３０１に戻り、方法３００は、ブロック３０２において、コードスタック２０３の最新のコードスタックエントリと関連付けられた関連したスタックフレームに対するポインタがデータスタック２０１の有効スタックフレームを指し示すと判断されるまで繰り返され、判断されると、フローはブロック３０２からブロック３０４に進む。ブロック３０４において、新しいコードスタックエントリがコードスタック２０３に割り当てられる。最後に、ブロック３０５において、ＣＳＰ２０５は、ブロック３０４において割り当てられた新しいコードスタックエントリを指し示すように設定され、方法３００は終了する。
【００２８】
新しいコードスタックエントリの割り当ての例を、表２に関して以下に示し、（図５に関して上述される）データスタックにおける無効エントリを指し示すコードスタックエントリのコードスタックからの割り当て解除の例を、表３に関して以下に示す。
【表３】
0006474398.tif 000004
【表４】
0006474398.tif 000005
【００２９】
表２〜表３に示されるコードは、メモリ領域内に割り当てられ、別個のインデックスｃｓｐ＿ｆｒａｍｅ＿ｉｎｄｅｘに関連して処理される各フレームポインタと関連付けられた固有の追跡構造ｃｓｐ＿ｆｒａｍｅ［ＭＡＸ］を使用し、第１のインデックスは、第１の割り当てられたコードスタックエントリに対応し、第２のインデックスは、第２の割り当てられたコードスタックエントリに対応し、以下同様であり、各種実施形態において、コードスタック管理の実施形態に関連して、他の組織形式を使用してもよい。幾つかの実施形態において、コードスタックエントリサイズは固定され、フレーム情報に関連して格納されない。幾つかの実施形態において、コードスタックエントリ情報は、別個のデータ領域１１３が存在する場合は、コードスタックエントリに関連付けられたデータ領域１１３の一部として、又はこれと関連して格納される。幾つかの実施形態において、コードスタックエントリ情報は、別個のデータ領域１１３が存在しても又は存在しなくても、コードスタックエントリの一部として、又はこれと関連して格納される。
【００３０】
更に別の実施形態において、コードスタック管理は、図６〜図７に関して以下に説明される方法４００〜５００のいずれかによる、コードスタックエントリの割り当て及び割り当て解除によって実施することができる。図６〜図７の方法４００〜５００において、コードスタックエントリを割り当てた関数が存在すると、コードスタックエントリは、コードスタック１０３／２０３から、明示的に除去できる。コードスタックが、ネスト化された関数に対する関数ポインタに対応するトランポリンコードを保持する実施形態において、静的チェーンをレジスタにロードし、次に制御を、コードスタックの外部に配置された関数に渡すことによって、トランポリンコードは、静的にネスト化された関数の環境を初期化できる。ネスト化された関数に対する関数ポインタを作成した現在の関数が終了すると、トランポリンコードは割り当て解除される。
【００３１】
図６〜図７の以下の議論は、コードスタック１０３／２０３及びデータスタック１０１／２０１がメモリ１０５内で下向きに増大すると仮定するが、これは単に例示のためだけである。幾つかの実施形態において、コードスタック１０３／２０３及びデータスタック１０１／２０１は上向きに増大でき、かかる実施形態において、例えば、小なり（less than）（＜）比較を大なり（greater than）（＞）比較と置き換えること、又は減算（−）演算を加算（＋）演算と置き換えるなど、適宜調整を行うことができる。更に別の実施形態において、コードスタック１０３／２０３が上向きに増大しデータスタック１０１／２０１が下向きに増大してもよいし、コードスタック１０３／２０３が下向きに増大し、データスタック１０２／２０１が上向きに増大してもよい。
【００３２】
幾つかの実施形態において、方法４００〜５００の実行中に、コードスタックメモリ領域１０７は、コードスタックエントリがコードスタック１０３／２０３において現在割り当てられている間又は割り当て解除されている間のみ、書き込み可能である。更に別の実施形態において、コードスタックメモリ領域１０７は、例えば、カーネル、信頼できるライブラリ、管理されたランタイム環境、又はハイパーバイザなどの、コンピュータシステム１００のセキュアな信頼できるシステムコンポーネントによってのみ、書き込み可能である。幾つかの実施形態において、コードスタックメモリ領域１０７に対応するメモリページに動的に生成されたトランポリンを予め取り込むことによって、コードをコードスタック１０３／２０３に割り当てることができる。別の実施形態において、動的に生成されたトランポリンに対応するコードが、別個の実行不能、書き込み可能領域に生成され、次に、信頼できるコンポーネントが、コードスタックエントリを、これらのトランポリンに対応するコードスタック１０３／２０３に割り当てることができ、コードスタックエントリは、トランポリンコードを含むことができる。
【００３３】
図６は、コードスタック管理のための方法４００の実施形態を示す。方法４００は、コードスタック２０３内に最新の付加されたエントリ（例えば、コードスタックエントリ２０４Ｎ）及び割り当てサイズ２１４を指し示すＣＳＰ２０５を保持するコンピュータシステム１００の実施形態と関連して実施できる。最初に、ブロック４０１において、ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックエントリを作成できる現在の関数が実行され、ＣＳＰ２０５の現在値が保存される。ＣＳＰ２０５の現在値は、任意の適切なメモリ位置に保存できる。幾つかの実施形態において、現在の関数のＣＳＰをデータスタックに格納することによって、保存を行う。別の実施形態において、例えばコンパイラ又はプログラマーにより、現在の関数のコードの補正値を命令メモリに符号化することによって、保存を行う。次に、ブロック４０２において、ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックエントリが、コードスタック２０３に割り当てられる。これは、コードスタック２０３が下向きに増大する実施形態に対しては、ＣＳＰ２０５を、ＣＳＰ２０５の現在値から新しいコードスタックエントリに対して割り当てられたメモリのサイズを引いたもの、つまりＣＳＰ＝ＣＳＰ−割り当てられているメモリサイズ、と等しくなるように設定することによって行われる。幾つかの実施形態において、割り当てられたメモリサイズのサイズは、表１Ａに示したコードセグメントの例等の、予め取り込まれたコードセグメントのサイズに対応する。幾つかの実施形態において、ネスト化された関数に対するポインタと関連して用いられるトランポリンのコードは、コードスタック１０３／２０３の新しいコードスタックエントリに書き込まれる。コードスタックメモリ領域１０７は、新しいコードスタックエントリの割り当て中、書き込み可能であり、更に別の実施形態において、コードスタックメモリ領域１０７は、いずれの時点でも書き込み不能である。更に別の実施形態において、コードスタックメモリ領域１０７は、新しいコードスタックエントリの割り当て中、実行不能に設定することもできる。幾つかの実施形態において、コードスタックエントリに挿入されるコードは、動的に生成されたトランポリンを含むことができる。予め取り込まれたトランポリンを含む実施形態において、コードスタックメモリ領域１０７は、既に初期化されて、新しいコードスタックエントリに割り当てられるコードを含有し、従って、コードスタックエントリ内に必要なコードを既に含む。予め取り込まれたトランポリンを含む更に別の実施形態において、関連したデータ領域１１３も、コードスタックエントリのメモリ１０５に割り当てられる。コードスタック１０３／２０３に新しいコードスタックエントリを割り当てた後、コードスタックメモリ領域１０７は、実行可能に設定され、幾つかの実施形態においては、書き込み不能に設定される。
【００３４】
ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックにコードスタックエントリを割り当てた後、ネスト化された関数に対する関数ポインタは、現在の関数の実行中に現在の関数により、及び、全ての各サブルーチンにより使用可能である。幾つかの実施形態において、現在の関数は、１つ又は複数のネスト化された関数に対する複数のポインタを作成するために、ブロック４０２を複数回実施することができる。他の実施形態においては、現在の関数は、ランタイムで計算された条件に基づいて、ブロック４０２を実施することができる。例えば、幾つかの実施形態において、ブロック４０２で作成されたトランポリンのアドレスは、関数ポインタに割り当てられる。次に、関数ポインタは、例えば、その関数ポインタを作成した現在の関数から呼び出されたサブルーチンにおいて、使用して、ネスト化された関数に現在の関数の状態を参照させることができる。
【００３５】
次に、ブロック４０３で、現在の関数が終了する。現在の関数のネスト化された関数に属する全てのコードスタックエントリは、コードスタック１０３／２０３から取り除かれる。これは、例えば、ＣＳＰ２０５をブロック４０２で作成されたいずれかのコードスタックエントリの上に移動させるなど、ＣＳＰ２０５をブロック４０１で保存されたＣＳＰ値と等しくなるように設定することによって行われる。幾つかの実施形態において、ＣＳＰ２０５は、ブロック４０１で保存されたメモリ位置から復旧され、幾つかの実施形態において、そのメモリ位置は、データスタックに配置される。他の実施形態において、ＣＳＰ２０５は、例えば、ＣＳＰ２０５の現在値からブロック４０２の１つ又は複数のインスタンスを実行する間に現在の関数により割り当てられた累積的割り当てサイズ２１４を、コードスタックが下向きに増大する実施形態においては加算することにより、コードスタックが上向きに増大する実施形態においては減算することにより、旧ＣＳＰを計算することによって復旧される。幾つかの実施形態においては、命令シーケンスにおいて、調整係数が明示的に実装される。
【００３６】
幾つかの実施形態において、ブロック４０３に関して説明した関数の終了の代わりに、ブロック４０４において、現在の関数の代替的なの終了が行われる。例えば、構造化例外処理、又はｓｅｔｊｕｍｐ（）／ｌｏｎｇｊｕｍｐ（）などによって、１つの関数又は複数の関数を同時に終了することができる。幾つかの実施形態において、少なくとも１つのコードスタックエントリを割り当てた現在の関数が、ｌｏｎｇｊｕｍｐ又は例外処理状況に起因して、かかる複数のレベルにわたる制御伝送の一部として終了される場合、ＣＳＰ２０５は、ｊｕｍｐ又は例外処理状況により標的になったコードスタックエントリを指し示すように設定される。一実施形態において、表４に以下に示すように、ｊｍｐ＿ｂｕｆは、拡張されてＣＳＰを復旧するための値を含む。
【表５】
0006474398.tif 000006
【００３７】
構造化例外ハンドラを含むブロック４０４の別の実施形態において、データスタックのアンワインド中、アンワインド情報は、拡張されてＣＳＰ２０５を復旧し、スタックフレームは、データスタックから連続して取り除かれる。幾つかの実施形態において、スタックのアンワインド中、ＣＳＰは、アンワインドテーブルに保存されたＣＳＰ値の存在を示し、かつＣＳＰの位置（例えば、データスタックフレームにおける位置）を示す情報を含むインジケータに基づいて復旧される。各種実施形態において、ＣＳＰは、汎用レジスタ、アドレスレジスタ、専用レジスタ、又はメモリ位置に保存される。
【００３８】
図７は、コードスタック管理のための方法５００の別の実施形態を示す。方法５００は、ＣＳＰ２０５及びＣＳＢ２１３を保持するコンピュータシステム１００の実施形態と関連して実施される。最初に、ブロック５０１において、現在の関数が実行される。次にブロック５０２において、現在の関数は、現在のＣＳＰ２０５に等しいＣＳＢを格納する。次にブロック５０３において、ネスト化された関数に対する関数ポインタと関連して使用するトランポリンを含むコードスタックエントリが、例えば現在の関数により呼び出されるサブルーチンにおけるコードスタック２０３に割り当てられる。これは、コードスタック２０３が下向きに増大する実施形態に対しては、ＣＳＰ２０５を、ＣＳＰ２０５の現在値から新しいコードスタックエントリに対して割り当てられたメモリのサイズを引いたもの、つまりＣＳＰ＝ＣＳＰ−割り当てられているメモリサイズ、と等しくなるように設定することによって行われる。幾つかの実施形態において、割り当てられたメモリサイズのサイズは、表１Ａに示すコードフラグメント等の、予め割り当てられたコードセグメントのサイズに対応する。ネスト化された関数に対する関数ポインタに対応するトランポリンに対するコードは、コードスタック１０３／２０３の一番下の新しいコードスタックエントリに書き込まれる。コードスタックメモリ領域１０７は、新しいコードスタックエントリの割り当て中、書き込み可能であり、別の実施形態において、コードスタックメモリ領域１０７は、新しいコードスタックエントリの割り当て中、実行不能に設定することもできる。幾つかの実施形態において、コードスタックエントリに挿入されるコードは、動的に生成されるトランポリンを含むことができる。予め取り込まれたトランポリンを含む実施形態において、コードスタックエントリのコードは、前にコードスタックメモリ領域に書き込まれている。予め取り込まれたトランポリンを含む別の実施形態において、関連するデータ領域１１３も、コードスタックエントリのメモリ１０５内に割り当てられる。コードスタック１０３／２０３への新しいコードスタックエントリの割り当て後、コードスタックメモリ領域１０７は実行可能であり、幾つかの実施形態においては書き込み不能である。
【００３９】
コードスタックエントリを、ネスト化された関数に対する関数ポインタとの関連で使用するトランポリンのコードスタックに割り当てた後、ネスト化された関数に対する関数ポインタは、使用可能である。幾つかの実施形態において、現在の関数は、複数のネスト化された関数に対して、ブロック５０３を複数回実施することができる。他の実施形態において、現在の関数は、ランタイムで計算された条件に基づいてブロック４０２を実施することができる。例えば、幾つかの実施形態において、ブロック５０３において作成されたトランポリンのアドレスは、関数ポインタに割り当てられる。次に、関数ポインタは、例えば、その関数ポインタを作成した現在の関数から呼び出されたサブルーチンにおいて、使用して、ネスト化された関数に現在の関数の状態を参照させることができる。
【００４０】
ブロック５０４において、保存された現在の関数のＣＳＢは、ＣＳＰに明示的に復旧され、これにより、例えば現在の関数のサブルーチンにおいて、ブロック５０３の１つ又は複数のインスタンスにより割り当てられたコードスタックエントリが割り当て解除される。ブロック５０４の後、幾つかの実施形態において、現在の関数により、ブロック５０３を１回又は複数回繰り返すことができる。最後に、ブロック５０５において、現在の関数は、いずれのコードスタックエントリも割り当て解除せずに終了する。代わりに、コードスタックエントリは、ブロック５０５においてではなく、ブロック５０４を明示的に実施することにより、現在の関数により割り当て解除される。幾つかの実施形態において、現在の関数は、ブロック５０４においてそれぞれのエントリを割り当て解除せず、代わりに、現在の関数を呼び出す前にブロック５０２を実施し、現在の関数がコードスタックエントリを割り当て解除せずに戻る場合に、呼び出し関数のブロック５０４を実施する。現在の関数の実行中、ブロック５０２を実施してＣＳＢを記録し、ブロック５０４を実施して、ＣＳＢを超える全てのコードスタックエントリを廃棄し、ブロック５０２及び５０４は、現在の関数により必要なように実施される。ＣＳＢは、データスタック、汎用レジスタ、又は専用レジスタ等の、各種位置に格納することができる。
【００４１】
図８は、コードスタックと関連して使用される図１のデータ領域１１３等の、データ領域を含むシステム６００の実施形態を示す。システム６００は、データ領域６０１及びコードスタック６０２を含む。コードスタック６０２は、複数のコードスタックエントリを含み、コードスタック６０２のコードスタックエントリのうちの１つは、トランポリンコード６０３を含む。トランポリンコード６０３は、データ領域６０１の各データ領域６０４を参照する。データ領域６０４は、表１Ａ及び表１Ｂのトランポリンコードの例に関連して示すように、静的チェーン値及び関数エントリアドレスを保持することができる。
また、データ領域６０４は、図４のコードスタックヘッダ２１２に関して示した任意の情報、例えば、トランポリンコード６０３を含むコードスタックエントリを割り当てた関数に対応する関連したデータスタックフレームに対する割り当てサイズ２１５及び／又はポインタ２１５等の、他の情報を保持できる。図８に示すデータ領域６０１は、上向きに増大し、図８に示すコードスタック６０２は、下向きに増大できるが、これは例示のためにのみ示す。
【００４２】
当業者により認識されるように、実施形態の態様は、システム、方法、又はコンピュータプログラム製品として具体化することができる。従って、実施形態の態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態（ファームウェア、常駐ソフトウェア、マイクロコード等を含む）、又はソフトウェアの態様とハードウェアの態様とを組み合わせた実施形態の形を取ることができ、これらは全て、例えば、本明細書において一般的に「回路」、「モジュール」又は「システム」と呼ぶことができる。さらに、本実施形態の態様は、コンピュータ可読プログラムコードが組み込まれた１つ又は複数のコンピュータ可読媒体内に具体化されたコンピュータプログラム製品の形を取ることができる。
【００４３】
実施形態の１つ又は複数の機能は、ソフトウェア、ハードウェア、又はその何らかの組み合わせで実装することができる。さらに、１つ又は複数の機能をエミュレートすることができる。
【００４４】
図９を参照すると、実施形態の１つ又は複数の態様を、例えばコンピュータ可読ストレージ媒体７０１を有する製造物品（例えば、１つ又は複数のコンピュータプログラム製品７００）内に含ませることができる。この媒体は、実施形態の機能を提供し容易にするように、例えばコンピュータ可読プログラムコード（命令）７０２が内部に具体化されている。製造物品は、コンピュータシステムの一部又は別個の製品として含ませることができる。
【００４５】
実施形態は、プロセッサ回路が本発明の要素を実施するのを可能にするためのコンピュータプログラム製品とすることができ、コンピュータプログラム製品は、処理回路により読み取り可能であり、方法を実施するために処理回路により実行される命令を格納するコンピュータ可読ストレージ媒体を含む。コンピュータ可読ストレージ媒体は、プロセッサ回路に方法を実施させるために命令がそこに記録された有形の非一時的（non-transitory）ストレージ媒体である。「コンピュータ可読ストレージ媒体」は、少なくとも、命令が媒体上に記録されると、記録された命令は、記録の時期とは無関係である時にプロセッサ回路により１回又は複数回、後で読み取ることができるので、非一時的なものである。「コンピュータ可読ストレージ媒体」は、電源投入の間のみ記録された情報を保持するデバイス（揮発性デバイス）及び電源投入とは無関係に記録された情報を保持するデバイス（不揮発性デバイス）を含む、非一時的なものである。「非一時的ストレージ媒体」の非網羅的リストの例は、これらに限定されるものではないが、例えば、ＲＡＭのようなメモリ・アレイ、又は命令がそこに記録されたラッチのようなメモリ回路を含む半導体ストレージデバイス；パンチカード、又は命令がそこに記録された溝内の隆起構造のような機械的に符号化されたデバイス；命令がそこに記録されたＣＤ又はＤＶＤのような光学的に読み取り可能なデバイス；及び、命令がそこに記録された磁気テープ若しくは磁気ディスクのような磁気的に符号化されたデバイスを含む。
【００４６】
コンピュータ可読ストレージ媒体の例の非網羅的なリストとして、以下のもの、即ち、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、消去可能なプログラム可能読み出し専用メモリ（ＥＰＲＯＭ又はフラッシュメモリ）、ポータブルコンパクトディスク読み出し専用メモリ（ＣＤ−ＲＯＭ）が挙げられる。プログラムコードは、例えば、インターネット、ローカルエリアネットワーク、広域ネットワーク及び／又は無線ネットワークなどのネットワークを介して、外部コンピュータ又は外部ストレージデバイスから、それぞれのコンピューティング／処理デバイスに配布することができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ及び／又はエッジサーバを含むことができる。各々のコンピューティング／処理デバイス内のネットワークアダプタカード又はネットワークインターフェースカードは、ネットワークからプログラムを受け取り、そのプログラムを転送して、それぞれのコンピューティング／処理デバイス内のコンピュータ可読ストレージデバイス内に格納する。
【００４７】
実施形態の態様に関する動作を実行するためのコンピュータプログラム命令は、例えば、アセンブラコード、マシンコード、マイクロコード、又はＪａｖａ、Ｓｍａｌｌｔａｌｋ、Ｃ＋＋等のようなオブジェクト指向プログラミング言語、及び「Ｃ」プログラミング言語のような従来の手続き型プログラミング言語、又は同様のプログラミング言語を含む、１つ又は複数のプログラミング言語のいずれかの組み合わせで記述されるソース若しくはオブジェクトコードのいずれかとすることができる。プログラムコードは、全体がユーザのコンピュータ上で実行される場合もあり、独立型ソフトウェア・パッケージとして、一部がユーザのコンピュータ上で実行される場合もあり、一部がユーザのコンピュータ上で実行され、一部が遠隔コンピュータ上で実行される場合もあり、又は全体が遠隔コンピュータ若しくはサーバ上で実行される場合もある。後者のシナリオにおいては、遠隔コンピュータは、ローカルエリアネットワーク（ＬＡＮ）若しくは広域ネットワーク（ＷＡＮ）を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続される場合もあり、又は外部コンピュータへの接続がなされる場合もある（例えば、インターネット・サービス・プロバイダを用いるインターネットを通じて）。
【００４８】
実施形態の態様は、本発明の実施形態による方法、装置（システム）及びコンピュータプログラム製品のフローチャート図及び／又はブロック図を参照して以下で説明される。フローチャート図及び／又はブロック図の各ブロック、並びにフローチャート図及び／又はブロック図内のブロックの組み合わせは、コンピュータプログラム命令によって実装できることが理解されるであろう。
【００４９】
これらのコンピュータプログラム命令を、汎用コンピュータ、専用コンピュータ、又は他のプログラム可能データ処理装置のプロセッサに与えてマシンを製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサにより実行される命令が、フローチャート及び／又はブロック図の１つ又は複数のブロックにおいて指定された機能／動作を実装するための手段を生成するようにすることができる。これらのコンピュータプログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイスに特定の方法で機能させるように指示することができるコンピュータ可読媒体内に格納することもできる。
【００５０】
コンピュータプログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上にロードして、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上で、コンピュータ実装プロセスを生成するための一連の動作ステップを実施させて、それにより、コンピュータ又は他のプログラム可能装置上で実行される命令が、フローチャート及び／又はブロック図の１つ又は複数のブロックにおいて指定された機能／動作を実装するためのプロセスを提供するようにもできる。
【００５１】
図中のフローチャート及びブロック図は、種々の実施形態によるシステム、方法及びコンピュータプログラム製品の可能な実装のアーキテクチャ、機能性、及び動作を示す。これに関して、フローチャート又はブロック図中の各ブロックは、指定された論理機能を実施するための１つ又は複数の実行可能命令を含むコードの、モジュール、セグメント、又は部分を表すことができる。さらに、幾つかの代替的な実装において、ブロック内に記述された機能は、図中に示したのとは別の順序で実行できることにも留意されたい。例えば、連続して示される２つのブロックは、実際には、実質的に同時に実行することができ、又はブロックは場合により、関与する機能性に応じて逆の順序で実行することもできる。さらに、ブロック図及び／又はフローチャート図の各ブロック、並びにブロック図及び／又はフローチャート図中のブロックの組み合わせは、指定された機能又は動作を実行する専用ハードウェアをベースとするシステム、又は専用ハードウェアとコンピュータ命令との組み合わせによって実施できることにも留意されたい。
【００５２】
本明細書で用いられる用語は、特定の実施形態を説明するためのものにすぎず、実施形態を限定することを意図したものではない。本明細書で用いられる単数形「１つの（a）」、「１つの（an）」及び「その（the）」という用語は、文脈が特に明示しない限り、複数形も含むことを意図したものである。「含む（comprise）」及び／又は「含んでいる（comprising）」という用語は、本明細書で用いられる場合、記述された特徴、整数、ステップ、操作、要素、及び／又はコンポーネントの存在を指示するが、１つ又は複数の他の特徴、整数、ステップ、操作、要素、コンポーネント、及び／又はその群の存在又は付加を除外するものではないことが、さらに理解されるであろう。
【００５３】
下記の特許請求の範囲における全ての手段又はブロックプラスファンクション要素の対応する構造、材料、動作、及び均等物は、該当する場合には、具体的に請求される他の請求要素と組み合わせて本機能を実施するためのいずれかの構造、材料、又は動作を含むことを意図している。実施形態の説明は、例証及び説明のために提示されたものであり、網羅的であること又は実施形態を開示した形態に限定することを意図したものでは。当業者であれば、実施形態の範囲及び趣旨から逸脱しない、多くの修正及び変形が明らかであろう。実施形態は、原理及び実際の適用を最も良く説明するため、及び、当業者が企図した特定の用途に適した種々の修正を有する実施形態を理解することができるように、選択され記述された。
【符号の説明】
【００５４】
１００：コンピュータシステム
１０１：プロセッサ
１０２、２０１：データスタック
１０３、２０３、６０２：コードスタック
１０４：アプリケーション
１０５：メモリ
１０６：データスタックメモリ領域
１０７：コードスタックメモリ領域
１１３、６０１、６０４：データ領域
２０２Ａ〜２０２Ｎ：スタックフレーム
２０４Ａ〜２０４Ｍ、２０４Ｎ、２１１：コードスタックエントリ
２０５：コードスタックポインタ（ＣＳＰ）
２０６：データスタックポインタ
２０７Ａ〜２０７Ｃ、２１５：スタックフレームに対するポインタ
２１０：スタックフレーム
２１２：コードスタックヘッダ
２１３：コードスタックバリア（ＣＳＢ）
２１４：割り当てサイズ
２１６：コードセクション
３００、４００、５００：方法
６００：システム
６０３：トランポリンコード
【図１】
0006474398.tif 000007
【図２】
0006474398.tif 000008
【図３】
0006474398.tif 000009
【図４】
0006474398.tif 000010
【図５】
0006474398.tif 000011
【図６】
0006474398.tif 000012
【図７】
0006474398.tif 000013
【図８】
0006474398.tif 000014
【図９】
0006474398.tif 000015