特表2016-541047(P2016-541047A)IP Force 特許公報掲載プロジェクト 2015.5.11 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ インターナショナル・ビジネス・マシーンズ・コーポレーションの特許一覧
<>
  • 特表2016541047-コードスタック管理 図000008
  • 特表2016541047-コードスタック管理 図000009
  • 特表2016541047-コードスタック管理 図000010
  • 特表2016541047-コードスタック管理 図000011
  • 特表2016541047-コードスタック管理 図000012
  • 特表2016541047-コードスタック管理 図000013
  • 特表2016541047-コードスタック管理 図000014
  • 特表2016541047-コードスタック管理 図000015
  • 特表2016541047-コードスタック管理 図000016
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】特表2016-541047(P2016-541047A)
(43)【公表日】2016年12月28日
(54)【発明の名称】コードスタック管理
(51)【国際特許分類】
   G06F 21/52 20130101AFI20161205BHJP
   G06F 12/00 20060101ALI20161205BHJP
【FI】
   G06F21/52
   G06F12/00 594
【審査請求】未請求
【予備審査請求】未請求
【全頁数】27
(21)【出願番号】特願2016-526359(P2016-526359)
(86)(22)【出願日】2014年9月28日
(85)【翻訳文提出日】2016年4月26日
(86)【国際出願番号】CN2014087688
(87)【国際公開番号】WO2015062386
(87)【国際公開日】20150507
(31)【優先権主張番号】14/067,053
(32)【優先日】2013年10月30日
(33)【優先権主張国】US
(81)【指定国】 AP(BW,GH,GM,KE,LR,LS,MW,MZ,NA,RW,SD,SL,ST,SZ,TZ,UG,ZM,ZW),EA(AM,AZ,BY,KG,KZ,RU,TJ,TM),EP(AL,AT,BE,BG,CH,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IS,IT,LT,LU,LV,MC,MK,MT,NL,NO,PL,PT,RO,RS,SE,SI,SK,SM,TR),OA(BF,BJ,CF,CG,CI,CM,GA,GN,GQ,GW,KM,ML,MR,NE,SN,TD,TG),AE,AG,AL,AM,AO,AT,AU,AZ,BA,BB,BG,BH,BN,BR,BW,BY,BZ,CA,CH,CL,CN,CO,CR,CU,CZ,DE,DK,DM,DO,DZ,EC,EE,EG,ES,FI,GB,GD,GE,GH,GM,GT,HN,HR,HU,ID,IL,IN,IR,IS,JP,KE,KG,KN,KP,KR,KZ,LA,LC,LK,LR,LS,LU,LY,MA,MD,ME,MG,MK,MN,MW,MX,MY,MZ,NA,NG,NI,NO,NZ,OM,PA,PE,PG,PH,PL,PT,QA,RO,RS,RU,RW,SA,SC,SD,SE,SG,SK,SL,SM,ST,SV,SY,TH,TJ,TM,TN,TR,TT,TZ,UA,UG,US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
2.SMALLTALK
(71)【出願人】
【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MACHINES CORPORATION
(74)【代理人】
【識別番号】100108501
【弁理士】
【氏名又は名称】上野 剛史
(74)【代理人】
【識別番号】100112690
【弁理士】
【氏名又は名称】太佐 種一
(72)【発明者】
【氏名】ガシュウィンド、マイケル、ケイ
【テーマコード(参考)】
5B060
【Fターム(参考)】
5B060AC06
(57)【要約】
【課題】 コードスタック管理のためのコンピュータシステム、コンピュータプログラム及びコンピュータ実装方法を提供する。
【解決手段】 実施形態は、コードスタック管理に関連する。1つの態様は、ソフトウェアアプリケーションを実行するように構成されたプロセッサを含む。別の態様は、コードスタックメモリ領域及びデータスタックメモリ領域を含み、コードスタックメモリ領域は、データスタックメモリ領域とは分けられている。別の態様は、データスタックメモリ領域内にデータスタックを保持することを含み、データスタックはソフトウェアアプリケーションの実行に対応する1つ又は複数のデータ変数を含む複数のスタック・フレームを含む。別の態様は、コードスタックメモリ領域内にコードスタックを保持することを含み、コードスタックは、ソフトウェアアプリケーションの実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含む。
【選択図】 図2
【特許請求の範囲】
【請求項1】
コードスタック管理のためのコンピュータシステムであって、前記システムは、
ソフトウェアアプリケーションを実行するように構成されたプロセッサと、
コードスタックメモリ領域及びデータスタックメモリ領域を含むメモリであって、前記コードスタックメモリ領域は前記データスタックメモリ領域とは分けられている、メモリと、
を含み、かつ、
前記データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの前記実行に対応する1つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
前記コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含む、保持することと、
を含む方法を実行するように構成される、システム。
【請求項2】
前記データスタックメモリ領域は書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は実行可能である、請求項1に記載のシステム。
【請求項3】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードスタックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、
をさらに含む、請求項1に記載のシステム。
【請求項4】
前記方法は、
前記コードスタック内の最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることであって、最新の割り当てられたコードスタックエントリは前記コードスタックのコードスタックポインタ(CSP)により参照される、求めることと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前記コードスタックに割り当て、前記CSPを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項1に記載のシステム。
【請求項5】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
前記関数の実行を開始することに基づいて、前記コードスタックのCSPの現在値を、前記データスタックの前記関数に対するメモリ位置に格納することと、
1つ又は複数のエントリを、前記関数の1つ又は複数のネスト化された関数に対するポインタと関連して使用されるトランポリンに対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記CSPにより参照される、求めることと、
前記関数を終了する前に、前記格納されたCSP値を前記メモリ位置からロードすることによって、前記CSPを復旧することと、
をさらに含む、請求項1に記載のシステム。
【請求項6】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
1つ又は複数のコードスタックエントリを、前記関数の1つ又は複数のネスト化された関数に対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記CSPにより参照される、割り当てることと、
前記関数を終了する前に、前記1つ又は複数のコードスタックエントリに対して割り当てられた合計メモリサイズを前記CSPから除去することによって、前記CSPを復旧することと、
をさらに含む、請求項1に記載のシステム。
【請求項7】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、前記データスタックの前記関連したスタックフレームを参照する、ポインタと、
を含む、請求項1に記載のシステム。
【請求項8】
前記方法は、
前記コードスタックのCSPの値を、現在の関数のコードスタックバリア(CSB)として格納することと、
ネスト化された関数に対するポインタと関連して使用されるトランポリンに対する新しいコードスタックエントリを割り当てることと、
前記コードスタックのCSPを、前記新しいコードスタックエントリを参照するように設定することと、
前記CSPを前記CSBと等しくなるように設定し、前記現在の関数を終了する前に、前記新しいコードスタックを前記コードスタックから割り当て解除することと、
をさらに含む、請求項1に記載のシステム。
【請求項9】
コードスタック管理を実施するためのコンピュータプログラムであって、
コンピュータのプロセッサによりソフトウェアアプリケーションを実行することと、
前記データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの前記実行に対応する1つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
前記コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含み、前記コードスタックメモリ領域は前記データスタックメモリ領域とは分けられている、保持することと、
を含む方法を実施するための、処理回路により実行される命令を含む、コンピュータプログラム。
【請求項10】
前記データスタックメモリ領域は、書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は、実行可能である、請求項9に記載のコンピュータプログラム。
【請求項11】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードスタックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、
をさらに含む、請求項9に記載のコンピュータプログラム。
【請求項12】
前記方法は、
前記コードスタックの最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることであって、最新の割り当てられたコードスタックエントリは前記コードスタックのコードスタックポインタ(CSP)により参照される、求めることと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前記コードスタックに割り当て、前記CSPを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項9に記載のコンピュータプログラム。
【請求項13】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
前記関数の実行を開始することに基づいて、前記コードスタックのCSPの現在値を、前記データスタックの前記関数に対するメモリ位置に格納することと、
1つ又は複数のエントリを、前記関数の1つ又は複数のネスト化された関数に対するポインタと関連して使用されるトランポリンに対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記CSPにより参照される、求めることと、
前記関数を終了する前に、前記格納されたCSP値を前記メモリ位置からロードすることによって、前記CSPを復旧することと、
をさらに含む、請求項9に記載のコンピュータプログラム。
【請求項14】
前記方法は、
前記ソフトウェアアプリケーションの関数の実行を開始することと、
1つ又は複数のコードスタックエントリを、前記関数の1つ又は複数のネスト化された関数に対応する前記コードスタックに割り当てることであって、最新の割り当てられたコードスタックエントリは前記CSPにより参照される、割り当てることと、
前記関数を終了する前に、前記1つ又は複数のコードスタックエントリに対して割り当てられた合計メモリサイズを前記CSPから減算することによって、前記CSPを復旧することと、
をさらに含む、請求項9に記載のコンピュータプログラム。
【請求項15】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、前記データスタックの前記関連したスタックフレームを参照する、ポインタと、
を含む、請求項9に記載のコンピュータプログラム。
【請求項16】
コードスタック管理のためのコンピュータ実装方法であって、
コンピュータのプロセッサによりソフトウェアアプリケーションを実行することと、
前記データスタックメモリ領域内にデータスタックを保持することであって、前記データスタックは前記ソフトウェアアプリケーションの前記実行に対応する1つ又は複数のデータ変数を含む複数のスタックフレームを含む、保持することと、
前記コードスタックメモリ領域内にコードスタックを保持することであって、前記コードスタックは前記ソフトウェアアプリケーションの前記実行に対応する実行可能なコンピュータコードを含む複数のコードスタックエントリを含み、前記コードスタックメモリ領域は前記データスタックメモリ領域とは離されている、保持することと、
を含む方法。
【請求項17】
前記データスタックメモリ領域は、書き込み可能かつ実行不能であり、前記コードスタックメモリ領域は、実行可能である、請求項16に記載の方法。
【請求項18】
前記方法は、
新しいコードスタックエントリを前記コードスタックに割り当てる前に、前記コードスタックメモリ領域を書き込み可能かつ実行不能に設定することと、
前記新しいコードスタックエントリを前記コードスタックに割り当てた後に、前記コードスタックメモリ領域を実行可能かつ書き込み不能に設定することと、
をさらに含む、請求項16に記載の方法。
【請求項19】
前記方法は、
前記コードスタックの最新のコードスタックエントリの関連したスタックフレームに対するポインタの値を求めることであって、最新の割り当てられたコードスタックエントリは前記コードスタックのコードスタックポインタ(CSP)により参照される、求めることと、
前記関連したスタックフレームに対する前記ポインタが、前記データスタックの有効スタックフレームを参照するかどうかを判断することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照しないと判断することに基づいて、前記最新のコードスタックエントリを前記コードスタックから割り当て解除することと、
前記関連したスタックフレームに対する前記ポインタが前記データスタックの有効スタックフレームを参照すると判断することに基づいて、新しいコードスタックエントリを前記コードスタックに割り当て、前記CSPを、前記新しいコードスタックエントリを参照するように設定することと、
をさらに含む、請求項16に記載の方法。
【請求項20】
コードスタックエントリは、
前記ソフトウェアアプリケーションのネスト化された関数に対するポインタと関連して使用される動的に生成されたトランポリンに対応するコードと、
前記コードスタックエントリと関連したスタックフレームに対するポインタであって、前記データスタックの前記関連したスタックフレームを参照する、ポインタと、
を含む、請求項16に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータシステムに関し、より具体的には、コンピュータプログラム実行中のコードスタックの管理に関する。
【背景技術】
【0002】
コンピュータシステムは、一般的に、コンピュータプログラムと、半導体、トランジスタ、チップ、回路基板、ストレージデバイス、及びプロセッサなどのハードウェアとの組み合わせを含む。ストレージデバイスは、データ及びコンピュータプログラムを格納し、それらはプロセッサにより実行される。
【0003】
コンピュータプログラムは、複数のピースに分割されることが多く、このピースは互いに呼び出すつまり起動することができる。このピースは、一般的に、方法、関数、モジュール、部分、等級、手順、又はサブルーチンと呼ばれる。第1のメソッド(呼び出し元)が第2のメソッド(呼び出し先)を呼び出すつまり起動すると、呼び出し元のメソッドが実行を停止し、呼び出し先のメソッドがプロセッサの制御を得て実行を開始する。呼び出し先のメソッドが実行を停止すると、呼び出し先のメソッドは、プロセッサの制御を呼び出し元のメソッドに戻し、呼び出し元のメソッドは、呼び出し先のメソッドを起動した呼び出し命令に続く次の命令で実行を再開する。
【0004】
呼び出し及び戻し技術を容易にするために、コンピュータは、ランタイムスタック、関数スタック、実行スタック、起動スタック、又は単にスタックとしても知られるコールスタックを使用する場合がある。コールスタックは、各々の動作中のメソッドに対するエントリ(フレームとしても知られる)を含む。エントリは、各メソッドの実行についての情報を格納する。情報は、メソッドの識別子、メソッドの戻りアドレス(呼び出し先メソッドが戻った後、次に実行すべき呼び出し元メソッドの命令の位置)、メソッドにより読み出し又は書き込みされたローカル変数の値、メソッドに送信されたパラメータ、算術演算若しくは論理演算のオペランドの評価スタック、メソッドの最新のインスタンスに対するポインタ、エンクローズ方法コンテキスト、及び/又はメソッドの特権つまり権限レベルのいずれか、一部、又は全てを含むことができる。
【0005】
コールスタックは、後入れ先出し(LIFO)の原理を使用し、これは、コールスタックの一番上に追加された(プッシュされた)最後の(つまり最新の)エントリが、コールスタックの一番上から除去される(ポップされる)、最初の(又は次の)項目であることを意味する。例えば、第1のメソッドによる第2のメソッドの起動に応答して、新しいエントリが作成され、第1のメソッドについてのコンテキストを保存し、第2のメソッドのローカル変数を保持し、コールスタックの一番上にプッシュされる。第2のメソッドが第3のメソッドを呼び出す場合、第2のメソッドについてのコンテキストを保存し、第2のメソッドのローカル変数を保持するための新しいエントリが、コールスタックの上にプッシュされる。ひとたび現在実行中のメソッドが終了すると、その呼び出し元メソッドのエントリが、スタックの一番上からポップし、呼び出し元メソッドの動作環境を復旧するために使用される。多くのメソッドが互いに呼び出し合い、呼び出しは、ネスト化される、又は再帰的ですらあり得るため、コールスタックは、プログラムを実行するにつれて、増大又は縮小する。
【0006】
コンピュータシステムにおいて、ネスト化された関数(ネスト化された手順又はネスト化されたサブルーチンとも呼ばれる)は、現在の関数(current function)と呼ばれる別の関数に語彙的に封入された関数である。ネスト化された関数は、構造化プログラミングに対して、多くの手法で用いられる。ネスト化に起因して、ネスト化された関数の範囲は、ネスト化された関数の現在の関数の内側にある。これは、ネスト化された関数が、現在の関数の外側からは不可視の、現在の関数のローカル変数及び他のローカル関数、並びにローカル定数及びタイプにアクセスできることを意味する。ネスト化は、理論上、あらゆる深さ水準まで可能であるが、通常、実際のプログラムではほんの一部の水準までしか使用されない。幾つかの実施形態においては、ネスト化された関数のコードは動的に生成され、現在の関数及びそのルーチンの終了まで持続する。かかる動的に生成されたコードの例は、トランポリン及びシグナルハンドラである。オペレーティングシステムは、動的に生成されたコードをコールスタックに割り当てることができる。
【発明の概要】
【発明が解決しようとする課題】
【0007】
コードスタック管理のためのコンピュータシステム、コンピュータプログラム及びコンピュータ実装方法を提供する。
【課題を解決するための手段】
【0008】
実施形態は、コードスタック管理のための方法、システム及びコンピュータプログラム製品を含む。態様は、ソフトウェアアプリケーションを実行するように構成されたプロセッサを含む。別の態様は、データスタックメモリ領域内にデータスタックを保持することを含み、データスタックはソフトウェアアプリケーションの実行に対応する1つ又は複数のデータ変数を含む複数のスタックフレームを含む。別の態様は、コードスタックメモリ領域内にコードスタックを保持することを含み、コードスタックはソフトウェアアプリケーションの実行に対応する実行可能コンピュータコードを含む複数のコードスタックエントリを含む。
【0009】
実施形態と見なされる主題は、本明細書の結びの部分にある特許請求の範囲において個々に示され、明確に特許請求される。実施形態の前述及び他の特徴及び利点は、添付図面と併用される以下の詳細な説明から明らかである。
【図面の簡単な説明】
【0010】
図1】1つの実施形態によるコードスタック管理のためのコンピュータシステムを示す。
図2】データスタック及びコードスタックの実施形態を示す。
図3】データスタック及びコードスタックの実施形態を示す。
図4】データスタック及びコードスタックの実施形態を示す。
図5】1つの実施形態による、コードスタックとデータスタックとの同期を含む、コードスタック管理のためのプロセスフローを示す。
図6】各種実施形態によるコードスタック管理のためのプロセスフローを示す。
図7】各種実施形態によるコードスタック管理のためのプロセスフローを示す。
図8】データ領域及びコードスタックの1つの実施形態を示す。
図9】1つの実施形態によるコンピュータプログラム製品を示す。
【発明を実施するための形態】
【0011】
コードスタック管理の実施形態が提供され、例示的な実施形態が以下に詳細に説明される。動的に生成されたコードをコードスタックに割り当てることが、スタックオーバーフローシナリオ等のセキュリティ攻撃に対してコンピュータシステムをオープンにすることがある。セキュリティを強化するために、データスタック及びコードスタックを含む2つの別個かつ固有のスタックが、コンピュータメモリ内に保持される。データスタックは、書き込み可能、実行不能メモリ領域内に配置し、一方、コードスタックは、実行可能メモリ領域内に配置することができる。幾つかの実施形態において、コードスタックは、コードスタックへの新しいエントリの割り当て時を除いて、書き込み不能にして、さらに、コードスタックへの新しいエントリの割り当て時に、実行不能にすることができる。従って、アプリケーションに対するセキュリティ攻撃は、実行不能データスタック及び別個のコードスタックにより防止される。別個のコードスタック及びデータスタックにより、動的に生成されたコードは、セキュリティを強化しながら、例えばイベントハンドラ及び語彙的ネスト化に対して、トランポリンをサポートすることできる。
【0012】
トランポリンは、コードスタックに割り当てることができる。トランポリンは、ネスト化された関数のアドレスが使用されると、ランタイムに生成されるコードの小さいピースである。トランポリンの命令は、2つのこと、つまり、定数アドレスの静的チェーンレジスタへのロード、及びネスト化された関数の実アドレスへのジャンプを行う必要がある。これは2つの命令、つまり、move immediate(即値移動)及びjump(ジャンプ)を必要する。2つのアドレスは、ワード長(word-long)即値オペランドとしてトランポリン内に存在する場合がある。各アドレスをレジスタの2つの部分にロードし、各アドレスのピースに、別個の即値オペランドを形成させる必要がある。
【0013】
トランポリンを初期化するために生成されるコードは、静的チェーン値及び関数アドレスを命令の即値オペランドに格納する必要がある。静的チェーン及び関数エントリアドレスは、コードスタックの外部に位置する別個のデータ領域に格納することができる。データ領域は、任意に、コードスタックフレーム割り当てサイズ及び関連するデータスタックフレームなどのコードスタックエントリの割り当て及び割り当て解除に使用される、コードスタック管理情報を含むこともできる。幾つかの実施形態において、トランポリンは、割り当てられた後は不変であり、別個のデータ領域に書き込むことによって、ネスト化された関数に対するポインタと共に使用されるように構成される。データ領域は、書き込み可能コードを含まず、それにより、書き込み可能、実行可能トランポリンへのコードインジェクションの危険を回避する。
【0014】
図1は、コードスタック管理用のコンピュータシステム100の1つの実施形態を示す。コンピュータシステム100は、コンピュータシステム100のメモリ105内に格納された実行可能コンピュータコードを含むソフトウェアアプリケーション104を実行するプロセッサ101を含む。アプリケーション104の実行中、プロセッサ101は、データスタック102及びコードスタック103を管理する。データスタック102は、書き込み可能で実行不能なメモリ領域を含むメモリ105のデータスタックメモリ領域106内に配置される。コードスタック103は、メモリ105のコードスタックメモリ領域107内に配置される。コードスタックメモリ領域107は、実行可能なメモリ領域を含む。データスタックメモリ領域106は、コードスタックメモリ領域107とは別個かつ固有で、重複しない。幾つかの実施形態において、コードスタック103へのエントリの割り当て中を除き、コードスタックメモリ領域107を書き込み不能とすることができ、更に別の実施形態においては、コードスタック103へのエントリの割り当て中、コードスタックメモリ領域107を一時的に実行不能にすることができる。幾つかの実施形態においては、コードスタックメモリ領域107は、カーネルなどのコンピュータシステム100の信頼できるコンポーネント、又は、信頼できるライブラリ、管理されるランタイム環境、又はハイパーバイザシステムを含むがこれらに限定されない、別のシステムコンポーネントのみによって書き込み可能とすることができる。
【0015】
幾つかの実施形態において、コードスタック103へのネスト化された関数に対するエントリの割り当ては、動的に生成されたトランポリンをメモリページに予め取り込むことによって行うことができる。別の実施形態においては、コードスタックメモリ領域107を一時的に書き込み可能にすることによって、トランポリンに対応する1つ又は複数のエントリをコードスタック103に割り当てることができる。予め取り込まれたトランポリンに対応するコードスタックエントリがコードスタック103に割り当てられた後、コードスタックメモリ領域107は、実行可能かつ書き込み不能に設定される。コードスタック103へのトランポリンに対応するエントリの割り当て中に、コードスタックメモリ領域107が実行不能である実施形態においては、現在実行中のアプリケーション104のいずれかの他のスレッドが使用するために、回復コードが提供される。静的チェーン及び関数アドレスデータ等の、コードスタック103のトランポリンに対応するエントリ用のデータは、データ領域113等の、メモリ105の別個のデータ領域に格納されるが、これは、表1A〜表1B及び図8に関して以下にさらに詳細に説明される。
【0016】
幾つかの実施形態において、読み出し不許可、書き込み不許可及び実行不許可の組み合わせ等の、制限付き許可を有する1つ又は複数のメモリページを、メモリ105のコードスタックメモリ領域107の直前及び/又は直後に配置して、例えばコードスタックメモリ領域107付近に配置されたバッファのオーバーフロー又はアンダーフローによって、何らかの偶発的な参照、オーバーフロー又はアンダーフローが、コードスタックメモリ領域107に及ぶのを防止する。コードスタック103をさらに保護するために、随意的に、1つ又は複数のガードページを、コードスタックメモリ領域107のコードスタック103の上及び下に配置してもよい。
【0017】
各コードスタックエントリは、データスタック102内にそれぞれのスタックフレームを有し、コードスタックエントリを割り当てたスタックフレームに対応することができる。スタックフレームは、プロセッサ101により自動的に割り当て及び割り当て解除でき、任意の適切な変数を保持できる。コードスタックメモリ領域107は、コンピュータシステム100のメモリマップにおいて、データスタックメモリ領域106から比較的離して配置し、コードスタックメモリ領域107への偶発的又は悪意のある書き込みを防止できる。
【0018】
トランポリンコードの一例を、表1Aに示す。幾つかの実施形態において、表1Aに示すようなトランポリンコードは、コードスタック103の複数のエントリに挿入することができ、コードスタック103のこれらエントリの各々は、データ領域113等の対応するそれぞれのデータ領域113を有し、コードスタック103の各トランポリンに対して一意のそれぞれの関数アドレス及び静的チェーンを特定することができる。
【表1】
【0019】
表1Aのコードを参照すると、実行は、ラベル「trampoline_initial」により示される位置から、レジスタr0に対して呼び出された関数の戻り値を含有するリンクレジスタを読み出すように適合された命令「mflr r0」により開始する。命令「bl.+4」は、通常は戻りアドレスとして使用される次の命令の値を生成し、現在のアドレス+4バイトを示す表記「.+4」で示される次の命令に制御を渡すように適合される。命令「mflr r11」は、このアドレスをリンクレジスタlrからレジスタr11にロードし、後でアドレス指定参照として機能させる。命令「mtlr r0」は、以前にr0にロードされた戻りアドレスを、リンクレジスタlrに復旧させる。命令「ld r12,8192(r11)」は、レジスタr11をアドレス指定ベースとして用い、8192のオフセットを付加して、2*4KBのオフセット(つまり、このトランポリンに対して実行コードから2ページ)に位置する関連したデータ領域のアドレスを計算し、制御を渡す関数アドレスとして使用するアドレスをロードする。命令「ld r11,8200(r11)」は、静的チェーン値として使用される、レジスタr11に関連付けられたデータ領域からの値をロードする。命令「mtctr r12」は、ネスト化された関数に対応するプログラムコードを含む関数の開始アドレスを、ctr(カウントレジスタ)にロードし、命令「bctr」は、ctrの値に分岐する、つまり制御をコンパイルされた関数に渡す。
【0020】
幾つかの実施形態において、コードスタック103内に異種コードが使用され、各コードスタックエントリは別個かつ固有のサイズを有する。他の実施形態において、コードスタックエントリは、それぞれ、同種トランポリンを含み、各トランポリンの関連するデータ領域113を設定し、トランポリンサイズを追跡する必要性をなくすことによって、トランポリンの構成を行える。幾つかの実施形態において、多数の異なるコードシーケンスが必要とされる場合、各々が異なるコードシーケンスに対応する複数の同種コードスタックをメモリ105に保持できる。コードスタック103が同種コードスタックを含む実施形態において、新しいトランポリンに対するエントリがコードスタック103に割り当てられると、固定コードシーケンスを保持するように初期化されたコードスタックメモリ領域107内にトランポリンが既に存在するので、割り当てられたコードスタックエントリへの書き込みを実施する必要はない。既存のトランポリンは、コードスタックエントリと関連したメモリ105の、別個のデータセクションのデータ領域113を参照する。従って、ネスト化された関数に対する新しい関数ポインタが作成されると、コードスタックエントリの割り当ては、データ領域113のトランポリンと関連付けられた、関数アドレス及び静的チェーン等の、データを初期化することを含む。これは、図8に関して以下にさらに詳細に説明する。
【0021】
幾つかの実施形態において、予め取り込まれたトランポリンのコードスタック103は、メモリ105の各トランポリンから固定オフセットに位置するデータ領域113等のデータ領域と関連付けられる。例えば表1Aに示すような、幾つかの実施形態において、オフセットは、全てのトランポリンに対して同一であり、コードスタック103のコードスタックエントリと関連付けられた各データ領域113は、命令アドレス、現在の命令アドレス、及び次の命令のアドレスのうちの1つの値をロードするbl.+4命令によりロードされたアドレスから8192バイトのところから開始する。幾つかの実施形態において、コードスタックエントリと関連付けられたデータ領域113は、コードスタックに格納されたトランポリンを参照するネスト化された関数に対する関数ポインタを介して起動されると、ネスト化された関数の実行環境を初期化するのに必要な情報を保持する。幾つかの実施形態において、関数ポインタは、例えば、bl.+4によりロードされた値から8200のオフセット(2つの4KBページ+8バイトに対応する)のところに格納されたネスト化された関数の静的範囲の動的インスタンスを指し示すネスト化された関数を含む環境を指し示す静的チェーン等の、ネスト化された関数ポインタ環境をロードすることによって作成される。さらに、ネスト化された関数は、環境を設定する関数のエントリアドレスと関連付けられ、エントリポイントは、bl.+4によりロードされた値から8192のところに(2つの4KBページに対応する)、つまり、静的チェーンに先行する倍長語(double word)に配置される。
【0022】
幾つかの実施形態において、トランポリンコードと付加的な構成論理を含むデータ領域113との関連付けは、トランポリンコードを含むコードスタックエントリから所定の(静的)オフセット距離に固定サイズのデータ領域を割り当てることによって行われる。しかし、コードスタックのサイズがオフセットを上回ると、さらなる拡張は、データ領域113を、以前に割り当てられたコードスタックエントリと重複させてしまうので、さらなる拡張の限界に達する。幾つかの実施形態において、この距離は、必要に応じて変更でき、オフセットが変更されると、コードスタックエントリ及びデータ領域の少なくとも一方が移動され、表1Aに示すように、オフセット8192及び8200に対応する、トランポリンの全てのオフセットを更新する。幾つかの実施形態において、コードを移動すると、コードスタックエントリに格納されたコードに対する全てのポインタへの更新が必要となるので、データ領域113は移動できるが、コードスタックエントリは移動されない。
【0023】
他の実施形態において、コードスタックエントリとデータ領域の間の対応は、固定オフセットを介しては行われず、論理関連付けを介して行われる。例えば、アドレスcb−i*csで開始するi番目のコードスタックエントリは、cbはコードスタックベースアドレス、つまり、空のコードスタックに対するコードスタックポインタ(CSP)の初期値であり、iは割り当てられたi番目のスタックフレームであり、csはコードスタックの固定コードの所定のコードサイズであり、データアドレスdb−i*dsでi番目の関連したデータ領域と関連付けられ、dbはデータベースアドレス、つまり、第1のコードスタックエントリと関連した第1のデータ領域113の始まりの、終わりの、又は他の対応するアドレスであり、iは割り当てられたi番目のデータ領域113であり、dsはデータ領域113の所定のサイズである。dsが比較的小さい場合、データ領域113又はコードスタックのコードスタックエントリを移動させる必要が生じる前に、(db−cb)/dbのスタックフレームを割り当てることができる。下の表1Bに、トランポリンコードの一例を示すが、ここでは、オフセットは機能的対応を用いて計算され、各オフセットは、各エントリに対して、オフセット=i*(ds+cs)+(ds−cs)+調整値であるように計算される。
【表2】
【0024】
別の実施形態において、コードスタックエントリ及びデータ領域の衝突に起因するデータ領域の移動を回避するために、コードスタックは一方向に、データ領域は別の方向に増大し、例えば、コードスタックエントリは、アドレスが減少する方向(cb−i*cs)に割り当てられ、関連したデータ領域113は、アドレスが増大する方向(db+i*ds)に割り当てられる。幾つかの実施形態においては、db=cbである。幾つかの実施形態においては、デバッグ及びアンワインド情報等の付加的な環境情報も、各コードスタックエントリと関連したデータ領域113に配置して、デバッグ及び例外処理を可能にする。
【0025】
図2図4は、データスタック及びコードスタックの実施形態200A〜200Cを示す。図2及び図3は、図1のデータスタック102に対応するデータスタック201と、図1のコードスタック103に対応するコードスタック203とを示す。データスタック201は、複数のスタックフレーム202A〜202Nを含む。スタックフレーム202A〜202Nの各スタックフレームは、アプリケーション104の関数に対応する1つ又は複数の変数を保持する。データスタック201のスタックフレーム202A〜202Nは、プロセッサ101により自動的に管理される、つまり、データスタック201のスタックフレーム202A〜202Nは、アプリケーション104により実行されるコードに応答して、アプリケーション104により、必要に応じて自動的に割り当て及び割り当て解除される。コードスタック203は、例えば、トランポリンコード又はLIFO方式で管理することができる他の動的に生成されたコードを含む、複数のコードスタックフレーム204A〜204Nを含む。幾つかの実施形態において、コードスタック203の各コードスタックエントリは、データスタック201の関連したスタックフレームに対するポインタ(例えば、コードスタックエントリに対応するデータ領域113内に格納され、そのコードスタックエントリを作成した関数のスタックフレームを示す)を含み、図2に示すように、コードスタックエントリ204Bは、スタックフレーム202Bを参照する関連したスタックフレームに対するポインタ207Aを含み、コードスタックエントリ204Dは、スタックフレーム202Dを参照する関連したスタックフレームに対するポインタ207Bを含む。データスタックポインタ206は、データスタック201の最新のエントリ(例えば、スタックフレーム202N)を参照し、データスタック201の管理に使用される。CSP205は、データスタック203の最新のエントリ(例えば、コードスタックエントリ204N)を参照し、コードスタック203の管理に使用される。図3は、データスタック201の有効スタックフレーム202Nを指し示さない関連したスタックフレームに対するポインタ207Cを有するコードスタックエントリ204Nを含むコードスタック203の実施形態200Bを示し、図3は、図5に関して以下にさらに詳細に説明される。図2図3は、単に例示のために示されており、データスタック201及びコードスタック203はそれぞれ、任意の適切な数のエントリを含むことができる。さらに、図2図3において、データスタック201及びコードスタック203は下向きに増大して示されるが、データスタック201及びコードスタック203は、それぞれ、メモリ105において任意の適切な方向に増大できる。
【0026】
図4は、スタックフレーム202A〜202N及びコードスタックエントリ204A〜204Nと関連した情報の実施形態を示す。スタックフレーム202A〜202Nのうちの1つのスタックフレームに対応するスタックフレーム210は、複数の例示データ変数VAR1〜VAR3を含む。これらの変数は、任意のタイプの任意の適切な変数を含み、スタックフレーム210には任意の適切な数の変数が存在できる。コードスタックエントリ204A〜204Nの各コードスタックエントリは、図4に示される関連したコードスタックヘッダ212を有するコードスタックエントリ211を含むことができる。幾つかの実施形態において、コードスタックヘッダ212は、コードスタックバリア(CSB)213を含む。コードスタックヘッダ212は、コードスタックエントリ211と関連付けられた、スタックフレーム210などの関連したスタックフレームに対するポインタ215をさらに含む。コードスタックヘッダ212は、各種実施形態においては、図4に示すようにコードスタック203のコードスタックヘッダのそれぞれのコードスタックエントリ211に配置でき、又は、他の実施形態においては、例えばデータ領域113など、コードスタック203の外部に配置された別個のデータ構造とすることができる。幾つかの実施形態において、CSB213は、別個のレジスタに又はスタックフレーム210に変数として保持することができる。コードスタックエントリ211は、コードセクション216をさらに含む。コードセクション216は実行可能なコンピュータコードを含み、幾つかの実施形態においては、コードセクション216は、ネスト化された関数に対する関数ポインタに対応するトランポリンコードを含む。幾つかの実施形態において、トランポリンコードは、静的チェーンをレジスタにロードし、次に、制御を、コードスタック203の外部に配置された関数に渡すことによって、静的にネスト化された関数に対する環境を初期化できる。
【0027】
データスタック201のスタックフレーム202A〜202Nは、プロセッサ101により自動的に管理する(つまり、割り当て及び割り当て解除する)ことができる。幾つかの実施形態において、コードスタック203のコードスタックエントリ204A〜204Nの管理は、図5に示すコードスタック同期用の方法300に関して以下に説明するように実施できる。新しいコードスタックエントリをコードスタック203に割り当てる前に、方法300を実行して、コードスタック203からあらゆる無効エントリを除去できる。最初に、図5のブロック301において、最新のコードスタックエントリ(例えば、図3のコードスタックエントリ204N)に対して、関連したスタックフレームに対するポインタ(例えば、図3に示す、割り当て解除された又は無効のスタックフレームを指し示すポインタ207C)が取り出される。コードスタック203の最新のコードスタックエントリは、CSP205により指し示されるコードスタックエントリである。次に、ブロック302において、取り出された関連したスタックフレームに対するポインタが、データスタック201の有効スタックフレームを指し示すかどうかが判断される。これは、ブロック301において取り出された関連したスタックフレームに対するポインタをデータスタックポインタ206と比較することによって判断することができる。データスタック201及びコードスタック203が下向きに増大する実施形態において、関連するスタックフレームに対するポインタが、データスタックポインタ206の値より小さい値を有する場合、ブロック302において、関連するスタックフレームに対するポインタは、データスタック201の有効エントリを指し示さないと判断される。例えば、図3に示すように、コードスタックエントリ204Nと関連したスタックフレームに対するポインタ207Cは、データスタック201の有効エントリを指し示さないが、これは、関連したスタックフレームに対するポインタ207Cはデータスタックポインタ206の下に配置された(つまり、より小さい)メモリ領域を指し示すからである。ブロック302において、関連するスタックフレームに対するポインタが、データスタック201の有効スタックフレームを指し示さないと判断されると、フローはブロック302からブロック303に進み、コードスタックの最新のエントリが、コードスタック203から割り当て解除される。これは、CSP205をコードスタック203において1エントリだけ上方へ移動させることによって行うことができる。図3に示すように、例えば、ブロック303において、CSP205は、上方に動かされてコードスタックエントリ204Mを指し示し、コードスタックエントリ204Nは割り当て解除される。フローは、ブロック303から、ブロック301に戻り、方法300は、ブロック302において、コードスタック203の最新のコードスタックエントリと関連付けられた関連したスタックフレームに対するポインタがデータスタック201の有効スタックフレームを指し示すと判断されるまで繰り返され、判断されると、フローはブロック302からブロック304に進む。ブロック304において、新しいコードスタックエントリがコードスタック203に割り当てられる。最後に、ブロック305において、CSP205は、ブロック304において割り当てられた新しいコードスタックエントリを指し示すように設定され、方法300は終了する。
【0028】
新しいコードスタックエントリの割り当ての例を、表2に関して以下に示し、(図5に関して上述される)データスタックにおける無効エントリを指し示すコードスタックエントリのコードスタックからの割り当て解除の例を、表3に関して以下に示す。
【表3】

【表4】
【0029】
表2〜表3に示されるコードは、メモリ領域内に割り当てられ、別個のインデックスcsp_frame_indexに関連して処理される各フレームポインタと関連付けられた固有の追跡構造csp_frame[MAX]を使用し、第1のインデックスは、第1の割り当てられたコードスタックエントリに対応し、第2のインデックスは、第2の割り当てられたコードスタックエントリに対応し、以下同様であり、各種実施形態において、コードスタック管理の実施形態に関連して、他の組織形式を使用してもよい。幾つかの実施形態において、コードスタックエントリサイズは固定され、フレーム情報に関連して格納されない。幾つかの実施形態において、コードスタックエントリ情報は、別個のデータ領域113が存在する場合は、コードスタックエントリに関連付けられたデータ領域113の一部として、又はこれと関連して格納される。幾つかの実施形態において、コードスタックエントリ情報は、別個のデータ領域113が存在しても又は存在しなくても、コードスタックエントリの一部として、又はこれと関連して格納される。
【0030】
更に別の実施形態において、コードスタック管理は、図6図7に関して以下に説明される方法400〜500のいずれかによる、コードスタックエントリの割り当て及び割り当て解除によって実施することができる。図6図7の方法400〜500において、コードスタックエントリを割り当てた関数が存在すると、コードスタックエントリは、コードスタック103/203から、明示的に除去できる。コードスタックが、ネスト化された関数に対する関数ポインタに対応するトランポリンコードを保持する実施形態において、静的チェーンをレジスタにロードし、次に制御を、コードスタックの外部に配置された関数に渡すことによって、トランポリンコードは、静的にネスト化された関数の環境を初期化できる。ネスト化された関数に対する関数ポインタを作成した現在の関数が終了すると、トランポリンコードは割り当て解除される。
【0031】
図6図7の以下の議論は、コードスタック103/203及びデータスタック101/201がメモリ105内で下向きに増大すると仮定するが、これは単に例示のためだけである。幾つかの実施形態において、コードスタック103/203及びデータスタック101/201は上向きに増大でき、かかる実施形態において、例えば、小なり(less than)(<)比較を大なり(greater than)(>)比較と置き換えること、又は減算(−)演算を加算(+)演算と置き換えるなど、適宜調整を行うことができる。更に別の実施形態において、コードスタック103/203が上向きに増大しデータスタック101/201が下向きに増大してもよいし、コードスタック103/203が下向きに増大し、データスタック102/201が上向きに増大してもよい。
【0032】
幾つかの実施形態において、方法400〜500の実行中に、コードスタックメモリ領域107は、コードスタックエントリがコードスタック103/203において現在割り当てられている間又は割り当て解除されている間のみ、書き込み可能である。更に別の実施形態において、コードスタックメモリ領域107は、例えば、カーネル、信頼できるライブラリ、管理されたランタイム環境、又はハイパーバイザなどの、コンピュータシステム100のセキュアな信頼できるシステムコンポーネントによってのみ、書き込み可能である。幾つかの実施形態において、コードスタックメモリ領域107に対応するメモリページに動的に生成されたトランポリンを予め取り込むことによって、コードをコードスタック103/203に割り当てることができる。別の実施形態において、動的に生成されたトランポリンに対応するコードが、別個の実行不能、書き込み可能領域に生成され、次に、信頼できるコンポーネントが、コードスタックエントリを、これらのトランポリンに対応するコードスタック103/203に割り当てることができ、コードスタックエントリは、トランポリンコードを含むことができる。
【0033】
図6は、コードスタック管理のための方法400の実施形態を示す。方法400は、コードスタック203内に最新の付加されたエントリ(例えば、コードスタックエントリ204N)及び割り当てサイズ214を指し示すCSP205を保持するコンピュータシステム100の実施形態と関連して実施できる。最初に、ブロック401において、ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックエントリを作成できる現在の関数が実行され、CSP205の現在値が保存される。CSP205の現在値は、任意の適切なメモリ位置に保存できる。幾つかの実施形態において、現在の関数のCSPをデータスタックに格納することによって、保存を行う。別の実施形態において、例えばコンパイラ又はプログラマーにより、現在の関数のコードの補正値を命令メモリに符号化することによって、保存を行う。次に、ブロック402において、ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックエントリが、コードスタック203に割り当てられる。これは、コードスタック203が下向きに増大する実施形態に対しては、CSP205を、CSP205の現在値から新しいコードスタックエントリに対して割り当てられたメモリのサイズを引いたもの、つまりCSP=CSP−割り当てられているメモリサイズ、と等しくなるように設定することによって行われる。幾つかの実施形態において、割り当てられたメモリサイズのサイズは、表1Aに示したコードセグメントの例等の、予め取り込まれたコードセグメントのサイズに対応する。幾つかの実施形態において、ネスト化された関数に対するポインタと関連して用いられるトランポリンのコードは、コードスタック103/203の新しいコードスタックエントリに書き込まれる。コードスタックメモリ領域107は、新しいコードスタックエントリの割り当て中、書き込み可能であり、更に別の実施形態において、コードスタックメモリ領域107は、いずれの時点でも書き込み不能である。更に別の実施形態において、コードスタックメモリ領域107は、新しいコードスタックエントリの割り当て中、実行不能に設定することもできる。幾つかの実施形態において、コードスタックエントリに挿入されるコードは、動的に生成されたトランポリンを含むことができる。予め取り込まれたトランポリンを含む実施形態において、コードスタックメモリ領域107は、既に初期化されて、新しいコードスタックエントリに割り当てられるコードを含有し、従って、コードスタックエントリ内に必要なコードを既に含む。予め取り込まれたトランポリンを含む更に別の実施形態において、関連したデータ領域113も、コードスタックエントリのメモリ105に割り当てられる。コードスタック103/203に新しいコードスタックエントリを割り当てた後、コードスタックメモリ領域107は、実行可能に設定され、幾つかの実施形態においては、書き込み不能に設定される。
【0034】
ネスト化された関数に対する関数ポインタと関連して用いられるコードスタックにコードスタックエントリを割り当てた後、ネスト化された関数に対する関数ポインタは、現在の関数の実行中に現在の関数により、及び、全ての各サブルーチンにより使用可能である。幾つかの実施形態において、現在の関数は、1つ又は複数のネスト化された関数に対する複数のポインタを作成するために、ブロック402を複数回実施することができる。他の実施形態においては、現在の関数は、ランタイムで計算された条件に基づいて、ブロック402を実施することができる。例えば、幾つかの実施形態において、ブロック402で作成されたトランポリンのアドレスは、関数ポインタに割り当てられる。次に、関数ポインタは、例えば、その関数ポインタを作成した現在の関数から呼び出されたサブルーチンにおいて、使用して、ネスト化された関数に現在の関数の状態を参照させることができる。
【0035】
次に、ブロック403で、現在の関数が終了する。現在の関数のネスト化された関数に属する全てのコードスタックエントリは、コードスタック103/203から取り除かれる。これは、例えば、CSP205をブロック402で作成されたいずれかのコードスタックエントリの上に移動させるなど、CSP205をブロック401で保存されたCSP値と等しくなるように設定することによって行われる。幾つかの実施形態において、CSP205は、ブロック401で保存されたメモリ位置から復旧され、幾つかの実施形態において、そのメモリ位置は、データスタックに配置される。他の実施形態において、CSP205は、例えば、CSP205の現在値からブロック402の1つ又は複数のインスタンスを実行する間に現在の関数により割り当てられた累積的割り当てサイズ214を、コードスタックが下向きに増大する実施形態においては加算することにより、コードスタックが上向きに増大する実施形態においては減算することにより、旧CSPを計算することによって復旧される。幾つかの実施形態においては、命令シーケンスにおいて、調整係数が明示的に実装される。
【0036】
幾つかの実施形態において、ブロック403に関して説明した関数の終了の代わりに、ブロック404において、現在の関数の代替的なの終了が行われる。例えば、構造化例外処理、又はsetjump()/longjump()などによって、1つの関数又は複数の関数を同時に終了することができる。幾つかの実施形態において、少なくとも1つのコードスタックエントリを割り当てた現在の関数が、longjump又は例外処理状況に起因して、かかる複数のレベルにわたる制御伝送の一部として終了される場合、CSP205は、jump又は例外処理状況により標的になったコードスタックエントリを指し示すように設定される。一実施形態において、表4に以下に示すように、jmp_bufは、拡張されてCSPを復旧するための値を含む。
【表5】
【0037】
構造化例外ハンドラを含むブロック404の別の実施形態において、データスタックのアンワインド中、アンワインド情報は、拡張されてCSP205を復旧し、スタックフレームは、データスタックから連続して取り除かれる。幾つかの実施形態において、スタックのアンワインド中、CSPは、アンワインドテーブルに保存されたCSP値の存在を示し、かつCSPの位置(例えば、データスタックフレームにおける位置)を示す情報を含むインジケータに基づいて復旧される。各種実施形態において、CSPは、汎用レジスタ、アドレスレジスタ、専用レジスタ、又はメモリ位置に保存される。
【0038】
図7は、コードスタック管理のための方法500の別の実施形態を示す。方法500は、CSP205及びCSB213を保持するコンピュータシステム100の実施形態と関連して実施される。最初に、ブロック501において、現在の関数が実行される。次にブロック502において、現在の関数は、現在のCSP205に等しいCSBを格納する。次にブロック503において、ネスト化された関数に対する関数ポインタと関連して使用するトランポリンを含むコードスタックエントリが、例えば現在の関数により呼び出されるサブルーチンにおけるコードスタック203に割り当てられる。これは、コードスタック203が下向きに増大する実施形態に対しては、CSP205を、CSP205の現在値から新しいコードスタックエントリに対して割り当てられたメモリのサイズを引いたもの、つまりCSP=CSP−割り当てられているメモリサイズ、と等しくなるように設定することによって行われる。幾つかの実施形態において、割り当てられたメモリサイズのサイズは、表1Aに示すコードフラグメント等の、予め割り当てられたコードセグメントのサイズに対応する。ネスト化された関数に対する関数ポインタに対応するトランポリンに対するコードは、コードスタック103/203の一番下の新しいコードスタックエントリに書き込まれる。コードスタックメモリ領域107は、新しいコードスタックエントリの割り当て中、書き込み可能であり、別の実施形態において、コードスタックメモリ領域107は、新しいコードスタックエントリの割り当て中、実行不能に設定することもできる。幾つかの実施形態において、コードスタックエントリに挿入されるコードは、動的に生成されるトランポリンを含むことができる。予め取り込まれたトランポリンを含む実施形態において、コードスタックエントリのコードは、前にコードスタックメモリ領域に書き込まれている。予め取り込まれたトランポリンを含む別の実施形態において、関連するデータ領域113も、コードスタックエントリのメモリ105内に割り当てられる。コードスタック103/203への新しいコードスタックエントリの割り当て後、コードスタックメモリ領域107は実行可能であり、幾つかの実施形態においては書き込み不能である。
【0039】
コードスタックエントリを、ネスト化された関数に対する関数ポインタとの関連で使用するトランポリンのコードスタックに割り当てた後、ネスト化された関数に対する関数ポインタは、使用可能である。幾つかの実施形態において、現在の関数は、複数のネスト化された関数に対して、ブロック503を複数回実施することができる。他の実施形態において、現在の関数は、ランタイムで計算された条件に基づいてブロック402を実施することができる。例えば、幾つかの実施形態において、ブロック503において作成されたトランポリンのアドレスは、関数ポインタに割り当てられる。次に、関数ポインタは、例えば、その関数ポインタを作成した現在の関数から呼び出されたサブルーチンにおいて、使用して、ネスト化された関数に現在の関数の状態を参照させることができる。
【0040】
ブロック504において、保存された現在の関数のCSBは、CSPに明示的に復旧され、これにより、例えば現在の関数のサブルーチンにおいて、ブロック503の1つ又は複数のインスタンスにより割り当てられたコードスタックエントリが割り当て解除される。ブロック504の後、幾つかの実施形態において、現在の関数により、ブロック503を1回又は複数回繰り返すことができる。最後に、ブロック505において、現在の関数は、いずれのコードスタックエントリも割り当て解除せずに終了する。代わりに、コードスタックエントリは、ブロック505においてではなく、ブロック504を明示的に実施することにより、現在の関数により割り当て解除される。幾つかの実施形態において、現在の関数は、ブロック504においてそれぞれのエントリを割り当て解除せず、代わりに、現在の関数を呼び出す前にブロック502を実施し、現在の関数がコードスタックエントリを割り当て解除せずに戻る場合に、呼び出し関数のブロック504を実施する。現在の関数の実行中、ブロック502を実施してCSBを記録し、ブロック504を実施して、CSBを超える全てのコードスタックエントリを廃棄し、ブロック502及び504は、現在の関数により必要なように実施される。CSBは、データスタック、汎用レジスタ、又は専用レジスタ等の、各種位置に格納することができる。
【0041】
図8は、コードスタックと関連して使用される図1のデータ領域113等の、データ領域を含むシステム600の実施形態を示す。システム600は、データ領域601及びコードスタック602を含む。コードスタック602は、複数のコードスタックエントリを含み、コードスタック602のコードスタックエントリのうちの1つは、トランポリンコード603を含む。トランポリンコード603は、データ領域601の各データ領域604を参照する。データ領域604は、表1A及び表1Bのトランポリンコードの例に関連して示すように、静的チェーン値及び関数エントリアドレスを保持することができる。
また、データ領域604は、図4のコードスタックヘッダ212に関して示した任意の情報、例えば、トランポリンコード603を含むコードスタックエントリを割り当てた関数に対応する関連したデータスタックフレームに対する割り当てサイズ215及び/又はポインタ215等の、他の情報を保持できる。図8に示すデータ領域601は、上向きに増大し、図8に示すコードスタック602は、下向きに増大できるが、これは例示のためにのみ示す。
【0042】
当業者により認識されるように、実施形態の態様は、システム、方法、又はコンピュータプログラム製品として具体化することができる。従って、実施形態の態様は、完全にハードウェアの実施形態、完全にソフトウェアの実施形態(ファームウェア、常駐ソフトウェア、マイクロコード等を含む)、又はソフトウェアの態様とハードウェアの態様とを組み合わせた実施形態の形を取ることができ、これらは全て、例えば、本明細書において一般的に「回路」、「モジュール」又は「システム」と呼ぶことができる。さらに、本実施形態の態様は、コンピュータ可読プログラムコードが組み込まれた1つ又は複数のコンピュータ可読媒体内に具体化されたコンピュータプログラム製品の形を取ることができる。
【0043】
実施形態の1つ又は複数の機能は、ソフトウェア、ハードウェア、又はその何らかの組み合わせで実装することができる。さらに、1つ又は複数の機能をエミュレートすることができる。
【0044】
図9を参照すると、実施形態の1つ又は複数の態様を、例えばコンピュータ可読ストレージ媒体701を有する製造物品(例えば、1つ又は複数のコンピュータプログラム製品700)内に含ませることができる。この媒体は、実施形態の機能を提供し容易にするように、例えばコンピュータ可読プログラムコード(命令)702が内部に具体化されている。製造物品は、コンピュータシステムの一部又は別個の製品として含ませることができる。
【0045】
実施形態は、プロセッサ回路が本発明の要素を実施するのを可能にするためのコンピュータプログラム製品とすることができ、コンピュータプログラム製品は、処理回路により読み取り可能であり、方法を実施するために処理回路により実行される命令を格納するコンピュータ可読ストレージ媒体を含む。コンピュータ可読ストレージ媒体は、プロセッサ回路に方法を実施させるために命令がそこに記録された有形の非一時的(non-transitory)ストレージ媒体である。「コンピュータ可読ストレージ媒体」は、少なくとも、命令が媒体上に記録されると、記録された命令は、記録の時期とは無関係である時にプロセッサ回路により1回又は複数回、後で読み取ることができるので、非一時的なものである。「コンピュータ可読ストレージ媒体」は、電源投入の間のみ記録された情報を保持するデバイス(揮発性デバイス)及び電源投入とは無関係に記録された情報を保持するデバイス(不揮発性デバイス)を含む、非一時的なものである。「非一時的ストレージ媒体」の非網羅的リストの例は、これらに限定されるものではないが、例えば、RAMのようなメモリ・アレイ、又は命令がそこに記録されたラッチのようなメモリ回路を含む半導体ストレージデバイス;パンチカード、又は命令がそこに記録された溝内の隆起構造のような機械的に符号化されたデバイス;命令がそこに記録されたCD又はDVDのような光学的に読み取り可能なデバイス;及び、命令がそこに記録された磁気テープ若しくは磁気ディスクのような磁気的に符号化されたデバイスを含む。
【0046】
コンピュータ可読ストレージ媒体の例の非網羅的なリストとして、以下のもの、即ち、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読み出し専用メモリ(ROM)、消去可能なプログラム可能読み出し専用メモリ(EPROM又はフラッシュメモリ)、ポータブルコンパクトディスク読み出し専用メモリ(CD−ROM)が挙げられる。プログラムコードは、例えば、インターネット、ローカルエリアネットワーク、広域ネットワーク及び/又は無線ネットワークなどのネットワークを介して、外部コンピュータ又は外部ストレージデバイスから、それぞれのコンピューティング/処理デバイスに配布することができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ及び/又はエッジサーバを含むことができる。各々のコンピューティング/処理デバイス内のネットワークアダプタカード又はネットワークインターフェースカードは、ネットワークからプログラムを受け取り、そのプログラムを転送して、それぞれのコンピューティング/処理デバイス内のコンピュータ可読ストレージデバイス内に格納する。
【0047】
実施形態の態様に関する動作を実行するためのコンピュータプログラム命令は、例えば、アセンブラコード、マシンコード、マイクロコード、又はJava、Smalltalk、C++等のようなオブジェクト指向プログラミング言語、及び「C」プログラミング言語のような従来の手続き型プログラミング言語、又は同様のプログラミング言語を含む、1つ又は複数のプログラミング言語のいずれかの組み合わせで記述されるソース若しくはオブジェクトコードのいずれかとすることができる。プログラムコードは、全体がユーザのコンピュータ上で実行される場合もあり、独立型ソフトウェア・パッケージとして、一部がユーザのコンピュータ上で実行される場合もあり、一部がユーザのコンピュータ上で実行され、一部が遠隔コンピュータ上で実行される場合もあり、又は全体が遠隔コンピュータ若しくはサーバ上で実行される場合もある。後者のシナリオにおいては、遠隔コンピュータは、ローカルエリアネットワーク(LAN)若しくは広域ネットワーク(WAN)を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続される場合もあり、又は外部コンピュータへの接続がなされる場合もある(例えば、インターネット・サービス・プロバイダを用いるインターネットを通じて)。
【0048】
実施形態の態様は、本発明の実施形態による方法、装置(システム)及びコンピュータプログラム製品のフローチャート図及び/又はブロック図を参照して以下で説明される。フローチャート図及び/又はブロック図の各ブロック、並びにフローチャート図及び/又はブロック図内のブロックの組み合わせは、コンピュータプログラム命令によって実装できることが理解されるであろう。
【0049】
これらのコンピュータプログラム命令を、汎用コンピュータ、専用コンピュータ、又は他のプログラム可能データ処理装置のプロセッサに与えてマシンを製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサにより実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実装するための手段を生成するようにすることができる。これらのコンピュータプログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイスに特定の方法で機能させるように指示することができるコンピュータ可読媒体内に格納することもできる。
【0050】
コンピュータプログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上にロードして、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上で、コンピュータ実装プロセスを生成するための一連の動作ステップを実施させて、それにより、コンピュータ又は他のプログラム可能装置上で実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実装するためのプロセスを提供するようにもできる。
【0051】
図中のフローチャート及びブロック図は、種々の実施形態によるシステム、方法及びコンピュータプログラム製品の可能な実装のアーキテクチャ、機能性、及び動作を示す。これに関して、フローチャート又はブロック図中の各ブロックは、指定された論理機能を実施するための1つ又は複数の実行可能命令を含むコードの、モジュール、セグメント、又は部分を表すことができる。さらに、幾つかの代替的な実装において、ブロック内に記述された機能は、図中に示したのとは別の順序で実行できることにも留意されたい。例えば、連続して示される2つのブロックは、実際には、実質的に同時に実行することができ、又はブロックは場合により、関与する機能性に応じて逆の順序で実行することもできる。さらに、ブロック図及び/又はフローチャート図の各ブロック、並びにブロック図及び/又はフローチャート図中のブロックの組み合わせは、指定された機能又は動作を実行する専用ハードウェアをベースとするシステム、又は専用ハードウェアとコンピュータ命令との組み合わせによって実施できることにも留意されたい。
【0052】
本明細書で用いられる用語は、特定の実施形態を説明するためのものにすぎず、実施形態を限定することを意図したものではない。本明細書で用いられる単数形「1つの(a)」、「1つの(an)」及び「その(the)」という用語は、文脈が特に明示しない限り、複数形も含むことを意図したものである。「含む(comprise)」及び/又は「含んでいる(comprising)」という用語は、本明細書で用いられる場合、記述された特徴、整数、ステップ、操作、要素、及び/又はコンポーネントの存在を指示するが、1つ又は複数の他の特徴、整数、ステップ、操作、要素、コンポーネント、及び/又はその群の存在又は付加を除外するものではないことが、さらに理解されるであろう。
【0053】
下記の特許請求の範囲における全ての手段又はブロックプラスファンクション要素の対応する構造、材料、動作、及び均等物は、該当する場合には、具体的に請求される他の請求要素と組み合わせて本機能を実施するためのいずれかの構造、材料、又は動作を含むことを意図している。実施形態の説明は、例証及び説明のために提示されたものであり、網羅的であること又は実施形態を開示した形態に限定することを意図したものでは。当業者であれば、実施形態の範囲及び趣旨から逸脱しない、多くの修正及び変形が明らかであろう。実施形態は、原理及び実際の適用を最も良く説明するため、及び、当業者が企図した特定の用途に適した種々の修正を有する実施形態を理解することができるように、選択され記述された。
【符号の説明】
【0054】
100:コンピュータシステム
101:プロセッサ
102、201:データスタック
103、203、602:コードスタック
104:アプリケーション
105:メモリ
106:データスタックメモリ領域
107:コードスタックメモリ領域
113、601、604:データ領域
202A〜202N:スタックフレーム
204A〜204M、204N、211:コードスタックエントリ
205:コードスタックポインタ(CSP)
206:データスタックポインタ
207A〜207C、215:スタックフレームに対するポインタ
210:スタックフレーム
212:コードスタックヘッダ
213:コードスタックバリア(CSB)
214:割り当てサイズ
216:コードセクション
300、400、500:方法
600:システム
603:トランポリンコード
図1
図2
図3
図4
図5
図6
図7
図8
図9
【国際調査報告】