JP2022065654A - 無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品(無効なメモリ参照に対する保護) - Google Patents

無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品(無効なメモリ参照に対する保護) Download PDF

Info

Publication number
JP2022065654A
JP2022065654A JP2021168826A JP2021168826A JP2022065654A JP 2022065654 A JP2022065654 A JP 2022065654A JP 2021168826 A JP2021168826 A JP 2021168826A JP 2021168826 A JP2021168826 A JP 2021168826A JP 2022065654 A JP2022065654 A JP 2022065654A
Authority
JP
Japan
Prior art keywords
memory
address
computer
boundary
index
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2021168826A
Other languages
English (en)
Inventor
ボイヴィー、エイチ、リチャード
H Boivie Richard
チェン、トン
Dong Chen
ブユクトスノグル、アルパー
Buyuktosunoglu Alper
サイレシャワ、グルラジ
Saileshwar Gururaj
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JP2022065654A publication Critical patent/JP2022065654A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2365Ensuring data consistency and integrity
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/0727Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a storage system, e.g. in a DASD or network based storage system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2282Tablespace storage structures; Management thereof

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)
  • Storage Device Security (AREA)
  • Memory System (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Techniques For Improving Reliability Of Storages (AREA)
  • Hardware Redundancy (AREA)

Abstract

【課題】本発明は、無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品を提供する。【解決手段】一例として、システムは、非一時的なコンピュータ可読媒体に記憶されたコンピュータ実行可能コンポーネントを実行するプロセッサを含むことができる。コンピュータ実行可能コンポーネントは、エントリコンポーネントと、転用コンポーネントとを含む。エントリコンポーネントは、オブジェクトがメモリに割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てることができる。転用コンポーネントは、オブジェクトアドレスの未使用ビットを転用して、テーブルのエントリへのインデックスを格納することができる。【選択図】図6

Description

本開示は、コンピュータ装置に関し、より具体的には、ヒープオブジェクト(heap-objects)に関するハードウェアベースのメモリエラー軽減(memory-error mitigation)を容易にする技術に関する。
従来、ヒープオブジェクトに固有のエラーを検出または防止するための手法が数多く提案されている。
本発明は、無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品を提供する。
本発明の1つ以上の実施形態に対する基本的な理解のために、以下に本発明の概要を示す。本概要は、重要な要素や不可欠な要素を特定したり、特定の実施形態の範囲または特許請求の範囲を限定したりすることを意図したものではない。本概要は専ら、後述する詳細な説明の前置きとして、本発明の概念を簡略化して提示することを目的とする。本明細書に記載の1つ以上の実施形態において、ヒープオブジェクトに関するハードウェアベースのメモリエラー軽減を容易にする、システム、装置、コンピュータ実装方法、もしくはコンピュータプログラム製品またはそれらの組み合わせが説明される。
一の実施形態によれば、システムが提供される。システムは、非一時的なコンピュータ可読媒体に記憶されたコンピュータ実行可能コンポーネントを実行するプロセッサを含む。コンピュータ実行可能コンポーネントは、エントリコンポーネントと転用コンポーネントとを含む。エントリコンポーネントは、オブジェクトがメモリに割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てることができる。転用コンポーネントは、オブジェクトアドレスの未使用ビットを転用して、テーブルのエントリへのインデックスを格納することができる。
他の実施形態によれば、コンピュータ実装方法が提供される。方法は、オブジェクトがメモリに割り当てられた際に、プロセッサにより、境界情報を格納するためのテーブルにエントリを割り当てることを含むことができる。方法はさらに、プロセッサにより、オブジェクトアドレスの未使用ビットを転用して、テーブルのエントリへのインデックスを格納することを含むことができる。
さらに他の実施形態によれば、コンピュータプログラム製品が提供される。コンピュータプログラム製品は、プログラム命令が実装されたコンピュータ可読記憶媒体を含むことができる。プログラム命令はプロセッサによって実行可能であり、プロセッサに動作を実行させることができる。動作は、オブジェクトが割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てることを含む。動作はさらに、オブジェクトアドレスの未使用ビットを転用して、テーブルのエントリへのインデックスを格納することを含む。
図1は、本明細書に記載の1つ以上の実施形態に係る、それぞれの境界メタデータ(bounds-metadata)の場所に基く、境界チェック(bounds-checking)型手法のグループ分けを例示する図である。 図2は、本明細書に記載の1つ以上の実施形態に係る、ヒープオブジェクトに関するハードウェアベースのメモリエラー軽減を容易にすることが可能なシステムを例示するブロック図である。 図3は、本明細書に記載の1つ以上の実施形態に係る、オブジェクトポインタの未使用ビット(unused bits)を再利用して、ヒープオブジェクトの空間的・時間的安全性(spatial and temporal safety)を確保する手法の概要を概念的に例示する図である。 図4は、本明細書に記載の1つ以上の実施形態に係る、プログラム実行時のポインタの寿命(life-cycle)の概要を概念的に例示する図である。 図5は、本明細書に記載の1つ以上の実施形態に係る、境界チェックフレームワークの構成レイアウトを例示する図である。 図6は、本明細書に記載の1つ以上の実施形態に係る、BIテーブル(BITable)を例示する図である。 図7は、本明細書に記載の1つ以上の実施形態に係る、プログラムの64ビット仮想アドレス空間(64-bit Virtual-Address space)のレイアウトを例示する図である。 図8は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックを実装するためのハードウェア構成を例示する図である。 図9は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックに伴う速度低下(slowdown)のシナリオを例示する図である。 図10は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックフレームワークの下で境界外アクセス(out-of-bounds accesses)が検出された関数を例示するグラフである。 図11は、本明細書に記載の1つ以上の実施形態に係る、境界外の原因となったSPEC-CPU2017アプリケーションにおける命令を例示するグラフである。 図12は、本明細書に記載の1つ以上の実施形態に係る、BIテーブル管理のためのソフトウェアインスツルメンテーション(software instrumentation)による性能への影響を例示するグラフである。 図13は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックによる性能への影響を例示するグラフである。 図14は、本明細書に記載の1つ以上の実施形態に係る、BIキャッシュミス(BICache miss)を含む命令1000個あたりのロードを例示するグラフである。 図15は、本明細書に記載の1つ以上の実施形態に係る、BIキャッシュミスを含むロードの割合を例示するグラフである。 図16は、本明細書に記載の1つ以上の実施形態に係る、異なるBIキャッシュサイズごとの、境界チェックに伴う平均速度低下を例示するグラフである。 図17は、本明細書に記載の1つ以上の実施形態に係る、異なるBIキャッシュサイズごとの、BIキャッシュミス率(BICache miss-rates)を例示するグラフである。 図18は、本明細書に記載の1つ以上の実施形態に係る、境界チェックに関連するメモリ帯域幅のオーバーヘッド(memory bandwidth overhead)を例示するグラフである。 図19は、本明細書に記載の1つ以上の実施形態に係る、BIテーブルに関連するメモリ帯域幅のオーバーヘッドを例示するグラフである。 図20Aは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Bは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Cは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Dは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Eは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Fは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図20Gは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フローを例示する図である。 図21Aは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て関数(memory allocation function)を処理するための動作フローを例示する図である。 図21Bは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て関数を処理するための動作フローを例示する図である。 図21Cは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て関数を処理するための動作フローを例示する図である。 図21Dは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て関数を処理するための動作フローを例示する図である。 図21Eは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て関数を処理するための動作フローを例示する図である。 図22Aは、本明細書に記載の1つ以上の実施形態に係る、ロード命令(load instruction)を処理するための動作フローを例示する図である。 図22Bは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Cは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Dは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Eは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Fは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Gは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Hは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Iは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Jは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図22Kは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フローを例示する図である。 図23は、本明細書に記載の1つ以上の実施形態に係る、ポインタを例示する図である。 図24は、本明細書に記載の1つ以上の実施形態に係る、ポインタを例示する図である。 図25は、図24のポインタに対して実行される加算演算(addition operation)を例示する図である。 図26は、本明細書に記載の1つ以上の実施形態に係る、ヒープオブジェクトに関するハードウェアベースのメモリエラー軽減を容易にすることが可能なコンピュータ実装方法を例示するフローチャートである。 図27は、本明細書に記載の1つ以上の実施形態を容易にすることが可能な動作環境を例示するブロック図である。
以下の詳細な説明は例示に過ぎず、実施形態もしくはその適用物もしくは用途、またはその両方を制限することを意図するものではない。さらに、上述の「背景技術」もしくは「発明の概要」、または「発明を実施するための形態」に示される、いずれの明示的または黙示的な情報によっても拘束されるものではない。
以下、添付図面を参照して各実施形態について説明する。図中、同様の要素については同様の符号にて示す。以下の説明において、各実施形態のより完全な理解を目的として、多くの具体的詳細を示して説明する。ただし、種々の場合において、各実施形態はこれらの具体的詳細を含まずに実施可能である。
CやC++のようなメモリ安全でない言語(memory-unsafe languages)で書かれたアプリケーションは、ユーザーコードを用いて明示的にメモリを管理するため、バッファオーバーフロー(buffer-overflows)や解放済みメモリ使用(use-after-free)などのメモリの安全性に関わるエラーが発生しやすい。これらのエラーは従来、モリスワーム(Morris worm)やハートブリード(Heartbleed)などの有名な攻撃を含め、数多くの攻撃に悪用されてきた。さらに、これらのエラーは、米国の非営利団体であるMITRE社によって、最も危険なソフトウェアバグの一つとして位置付けされている。あるテクノロジー企業が最近行った調査によると、当該企業の製品ソフトウェア(production-software)において確認された共通脆弱性識別子(CVE:Common Vulnerabilities and Exposures)の約70%は、依然としてこれらのエラーが原因であることが明らかになった。特に、ヒープ破損(heap corruption)、境界外アクセス(out-of-bounds accesses)、解放済みメモリ使用を含む、ヒープオブジェクトに固有のエラーが、2019年のCVEのほぼ50%を占めている。
現在までに、これらのエラーを検出または防止するための手法が数多く提案されており、それらはブラックリスト型とホワイトリスト型の手法に大別される。ブラックリスト型のアプローチは、(一部の)安全でない場所へのアクセスを(例えば、オブジェクトの周囲にトリップワイヤを挿入するなどして)防止するもので、性能面での過大なオーバーヘッドや、プログラムソースコードを侵襲的に変更しなければならないなどの導入障壁が、一般的に少ない。しかし、ブラックリスト型のアプローチでは完全なカバーができないため、一部のエラーが検出されずに残ってしまい、自由に悪用されてしまう。これに対して、ホワイトリスト型のアプローチは、承認(例えば、すべてのポインタの逆参照(dereferences)がオブジェクト境界(object-bounds)内にあることを検証する境界チェックメカニズム)に基づいて安全なプログラム動作を実施し、メモリの空間的・時間的安全性(spatial and temporal memory-safety)のより正確な確保を可能にする。しかし、ホワイトリスト型のアプローチは多くの場合、大きな速度低下(slowdown)を伴い、24%~116%の速度低下が発生し得る。さらに、ホワイトリスト型のアプローチは、ソースコードやバイナリレイアウトに破壊的な変更(disruptive changes)を必要とすることが多く、その採用を難しくしている。メモリの安全性を強化するための実用的な手法としては、ホワイトリスト型のアプローチの性能や互換性に関する欠点を無くしつつ、その強固なセキュリティを利用することが理想である。
上述したように、C/C++で書かれたアプリケーションでは、安全性のチェックなしにポインタの操作が許可されているため、ポインタが無効なメモリ領域を逆参照するメモリエラーが発生しやすい。空間的エラー(境界外アクセス)は、未検証(unvalidated)の入力を用いたポインタ演算(pointer-arithmetic)により、バッファポインタがバッファ境界(buffer-bounds)を超えてメモリにアクセスすることで発生する可能性がある。同様に、時間的エラー(例えば、解放済みメモリ使用)は、ダングリングポインタ(メモリが再使用された解放済みのオブジェクトを指すポインタ)を使用した読み出しまたは書き込みから発生する可能性がある。これらのエラーによるメモリリークやメモリ破損を悪用して、データの機密性を侵害したり、権限昇格(privilege escalation)を試みたり、システム整合性を破壊したりするなどの攻撃が行われている。メモリの安全性を強化し、メモリエラーを防止することで、製品ソフトウェアに対するこのような攻撃の防止を図ることができる。メモリの安全性の強化およびメモリエラーの防止のために、種々の手法が実施可能である。
かかる手法には、トリップワイヤ、ランダム化、タグ付きメモリのいずれかを用いて、オブジェクト境界を越えるメモリアクセスを確率的に検出可能な確率的手法(probabilistic techniques)が含まれる。トリップワイヤを利用した手法の一例として、Google LLC(カリフォルニア州マウンテンビュー)が提供するアドレスサニタイザ(ASAN:AddressSanitizer)が挙げられる。トリップワイヤを利用した手法は一般的に、オブジェクトの周囲にレッドゾーン(red-zones)またはトリップワイヤを挿入して、オブジェクトの境界を少しだけ超えるような一般的な空間的バグ(spatial bugs)を検出する。ランダム化を利用した手法の一例として、DieHardが挙げられる。ランダム化を利用した手法は一般的に、メモリアロケータ(memory-allocator)のサポートによりメモリレイアウトをランダム化して、バグの検出を容易にする。ハードウェアベースのメモリタギング手法の一例として、Arm Limited社(英国ケンブリッジ)が提供するMTE(Memory Tagging Extension)が挙げられる。ハードウェアベースのメモリタギング手法は一般的に、オブジェクトとポインタのペアにランダムな4ビットのタグ(「色」)を割り当て、「色」の不一致に基づいて、確率的にバグを検出することを容易にする。確率的手法は、速度低下や互換性の問題を最小限に抑えることができるため、比較的容易に採用できるが、その設計上、エラー検出を完全にカバーできない場合がある。
また、かかる技術には、オブジェクトのベースおよび境界を追跡し、すべてのオブジェクトアクセスに対して境界チェックを実施することで、安全なプログラム動作を正確に実施可能な、境界チェック型手法も含まれる。図1に示すように、境界チェック型手法100は、それぞれの境界メタデータの場所に基づいてグループ分けすることができる。例えば、境界チェック型手法100は、隣接境界グループ(adjacent bounds group)110を含む。隣接境界グループ110は、CCuredやCycloneのようなファットポインタ(fat-pointer)を利用した手法を含む。ファットポインタを利用した手法では、ベースと境界のメタデータを、実際のポインタ値と並んで別個のワードに格納することができる。このようにベースと境界のメタデータを格納することにより、実際のポインタが逆参照された際に、境界チェックの実行を容易にして空間的エラーを検出することができる。同様に、ファットポインタを利用した手法の一部の例では、ポインタを256ビットの「能力(capabilities)」に置き換えることができる。能力には、アドレス、境界情報、許可ビット(permission bits)やその他のメタデータを含むことができ、境界チェックと共に、きめ細かなコンパートメント化(fine-grain compartmentalization)の実行を図ることができる。しかしながら、境界チェック型手法のうち隣接境界グループ110は通常、ソースコードの変更を必要とし、また、バイナリレイアウトの変更を必要とするため、ライブラリコードとの互換性に影響を与える。
境界チェック型手法の他の例は、ローファットポインタ(Low-Fat-pointer)を用いた手法であるインライン境界グループ(inline bounds group)120である。ローファットポインタを用いた手法では、バイナリレイアウトに影響を与えることなく、ポインタ内にオブジェクト境界をインラインでエンコードすることができる。ローファットポインタを用いた手法の一例として、コンパクトな浮動小数点フォーマット(floating-point format)を使用して、オブジェクトのベースアドレスおよび境界アドレス(の最下位ビット(least significant bits))を、64ビットポインタの上位18ビットに格納することができる。ローファットポインタを用いた手法の他の例として、サイズ調整された(size-aligned)ベースアドレスにおけるメモリのサイズ別のパーティション(size-specific partitions)にオブジェクトを割り当て、ポインタ値にベースと境界を暗黙的にエンコードすることができる。これらのローファットポインタを用いた手法の例では、ポインタがインライン境界(inline-bounds)を越えることがないように、(ハードウェア内で、またはコンパイラ/インスツルメンテーション(instrumentation)によって挿入された明示的な命令を介して)ポインタ演算を追跡することができる。しかしながら、境界チェック型手法のうちインライン境界グループ120は通常、ダングリングポインタ内の境界を利用する挿入されたチェック(inserted check)が、ポインタの参照先メモリが再使用された後でも依然として合格となるため、時間的な安全性を確保できない。
境界チェック型手法の他の例は、分離境界グループ(disjoint bounds group)130である。分離境界グループ130における境界チェック型手法は、境界メタデータを(ポインタごとまたはオブジェクトごとに)シャドウメモリ内の分離テーブル(disjoint table)に格納することができ、バイナリレイアウトに対する変更を回避することができる。境界テーブルは通常、ポインタ値を使用して、線形テーブルルックアップ(linear table lookup)として、またはマルチレベルトライルックアップ(multi-level trie lookup)を使用してインデックスされる。このような境界チェック型手法は、ポインタの逆参照またはすべてのポインタ演算に対して、(ソフトウェアによって挿入されるか、またはハードウェアによって暗黙的に挿入される)テーブルルックアップを用いた境界チェックを実行することで、空間的エラー(一部の設計においては、時間的エラーも)を検出することができる。分離境界グループ130のうち、純粋にソフトウェアベースの手法は、ポインタ演算時やテーブルルックアップ用に境界メタデータを伝達(propagate)するための追加命令を必要とするため、大きな性能オーバーヘッド(例えば、平均で50%~112%)が発生する可能性がある。また、分離境界グループ130のうち、ハードウェアベースの手法は、マイクロコードまたは専用ハードウェアを使用して境界を伝達し、チェックを実行することにより、ソフトウェアベースの手法と比較してオーバーヘッドを小さくすることができる。しかしながら、このようなハードウェアベースの手法は、境界メタデータにアクセスするためにポインタ値を使用して高コスト(expensive)のテーブルルックアップを行うため、中程度または大きな速度低下が継続して発生する可能性がある。
上述した種々のメモリ保護手法とは異なり、本開示の実装態様は、オブジェクト境界を正確に実施して空間的エラーを防止可能なハードウェアベースの境界チェッカーを用いる。このハードウェアベースの境界チェックフレームワークの実施形態によれば、ダングリングポインタの境界を効率的に無効化して、時間的エラーを検出することが容易になる。実用上、このハードウェアベースの境界チェックフレームワークの実施形態は、性能オーバーヘッドを低減し、またバイナリレイアウトの変更を回避できることが望ましい。そのために、本開示の実装態様は、ポインタを一意のインライン識別子(unique inline identifier)と関連付けることが可能な境界メタデータ設計を含み、当該識別子は、分離境界テーブルへのインデックスに使用することができる。本開示の1つ以上の実装態様は、境界チェック型手法として、インラインインデックス・分離境界グループ(inline index, disjoint bounds group)140を含む。
図2は、本明細書に記載の1つ以上の実施形態に係る、ヒープオブジェクトに関するメモリエラー軽減を容易にすることが可能なシステム200を例示するブロック図である。システム200は、コンピュータ実行可能コンポーネントを記憶するための非一時的なコンピュータ可読記憶媒体(記憶媒体)210と、1つ以上の通信バス230を介して記憶媒体210に動作可能に接続され、記憶媒体210に記憶されたコンピュータ実行可能コンポーネントを実行するための1つ以上のプロセッサ220と、を含む。図2に示すように、コンピュータ実行可能コンポーネントは、エントリコンポーネント(entry component)240と、転用コンポーネント(re-purpose component)250とを含む。
エントリコンポーネント240は、オブジェクトがメモリに割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てることができる。転用コンポーネント250は、オブジェクトアドレスの未使用ビット(unused bits)を転用(re-purpose)して、テーブルのエントリへのインデックスを格納することができる。一の実施形態において、転用コンポーネント250は、オブジェクトアドレスの未使用ビットを再利用して、アクセス可能なメモリアドレスの範囲を追跡することができる。
一の実施形態において、記憶装置210に記憶されたコンピュータ実行可能コンポーネントはさらに、チェックコンポーネント(check component)260を含むことができる。チェックコンポーネント260は、アドレス内のインデックスビット(index bits)を使用して境界情報にアクセスすることにより、ロード命令およびストア命令に対する境界チェックをハードウェアで実行することができる。一の実施形態において、チェックコンポーネント260は、配列の境界(array bounds)をチェックすることができる。一の実施形態において、チェックコンポーネント260は、配列参照(array reference)が境界内(in-bounds)か境界外かを判定し、境界外の配列参照の発生を軽減(mitigate)することができる。
一の実施形態において、記憶装置210に記憶されたコンピュータ実行可能コンポーネントはさらに、伝達コンポーネント(propagation component)270を含むことができる。伝達コンポーネント270は、後続のオブジェクトアドレスが割り当てステートメント(assignment statements)またはポインタ演算を介して導出される際に、インデックスを自動的に伝達することができる。一の実施形態において、伝達コンポーネント270は、オブジェクトアドレスが割り当てステートメントにコピーされる際に、未使用ビットで追加の情報(extra information)を伝達することができる。一の実施形態において、伝達コンポーネント270は、オブジェクトアドレスが関数呼び出し(function call)の引数として渡される際に、未使用ビットで追加の情報を伝達することができる。一の実施形態において、伝達コンポーネント270は、オブジェクトアドレスがアドレスの計算に使用される際に、未使用ビットで追加の情報を伝達することができる。本実施形態が利用するコンピュータ実行可能コンポーネントの機能については、以下でさらに詳しく説明する。
ハードウェアで境界チェックを行うための低コストかつ低侵襲型フレームワークを、以下に開示する。本開示の手法は、ヒープオブジェクトに関するメモリの安全性を低コストでありながら正確に確保するための、ハードウェア対応の(hardware-enabled)ポインタ境界チェックフレームワークを用いる。一の実施形態において、ヒープオブジェクトに関する本開示の境界チェックフレームワークは、LLVMインスツルメンテーション(LLVM-instrumentation)を用いて、プログラム中のmalloc/free呼び出しを、境界情報を維持するためのカスタムライブラリ関数(custom library-functions)に置き換えることで実装することができる。
以下でさらに詳しく説明するように、本開示の手法を実装することにより、ポインタ逆参照に対するオブジェクト境界の正確な実施を通じてヒープオブジェクトのメモリエラーを軽減し、境界外アクセスや解放済みメモリ使用のエラーを防止することが容易になる。本開示の手法は、性能に対する影響を最小限にしつつ、オブジェクト境界の正確な実施を容易にする。さらに、本開示の手法は、ソースコードまたはバイナリレイアウトに変更を加えることなく実装することができる。本開示の手法の実施形態によれば、垂直統合型(vertically integrated)のハードウェア/ソフトウェア(HW/SW)エコシステムにおいて、ハードウェアによる境界チェックを再検討(re-think)することにより、ヒープオブジェクトのメモリエラーを軽減することができる。その際、C/C++メモリ割り当て関数、命令セットアーキテクチャ(ISA)、およびハードウェアに対する変更は最小限に抑えられる。
本開示の手法の一態様は、ポインタ内の「未使用ビット」を転用して、当該ポインタを介して正当に(legitimately)アクセス可能なアドレスの範囲をチェックまたは追跡する。64ビットアーキテクチャでは、オブジェクトポインタは通常、48ビット以下の情報を持つ仮想アドレスを格納するため、ポインタ内に未使用ビットが存在する。本開示の手法は、これらの未使用ビットを活用して、(a)オブジェクトが割り当てられる際に、境界情報を格納するための境界テーブルにエントリを割り当て、(b)オブジェクトポインタの未使用ビット(例えば、上位ビット)を転用して、境界テーブルのエントリへのインデックスを格納する、(c)後続のアドレスが割り当てステートメントまたはポインタ演算を介して導出される際に、インデックスを自動的に伝達する、もしくは、(d)アドレス内のインデックスビットを使用して適切な境界情報にアクセスすることにより、ロード命令およびストア命令に対する境界チェックをハードウェアで実行する、または、これら(a)~(d)の組み合わせを実行する。
本開示の手法はこれらの未使用ビットを活用することにより、ヒープオブジェクトの空間的・時間的安全性の確保を容易にし、ヒープの境界外の読み出し・書き込みや、解放済みメモリ使用などのエラーを防止することができる。ヒープエラーの軽減に加えて、本開示の手法の1つ以上の実施形態は一般に、グローバルオブジェクトおよびスタックオブジェクト(globals and stack-objects)のメモリ安全性の確保にも適用可能である。かかるエラーは、テクノロジー企業の調査に関して先に述べたCVEのほぼ50%を占め、さらに、Google LLC(カリフォルニア州マウンテンビュー)が提供するOSS-Fuzzサービスで検出されたメモリ安全性のバグのほぼ60%を占めているため、防止することが望ましい。
図3は、本明細書に記載の1つ以上の実施形態に係る、オブジェクトポインタの未使用ビット(例えば、上位ビット)を再利用して、ヒープオブジェクトの空間的・時間的安全性を確保する手法の概要を概念的に例示する図である。図3に示すように、本開示の手法は概して、オブジェクトポインタの未使用ビット(例えば、上位ビット)を転用して、当該オブジェクトポインタに対応する境界メタデータを含む境界情報テーブル(BIテーブル(BITable))内のエントリへのインデックスを格納する。一の実施形態において、BIテーブルは、プロセスごと(per-process)のBIテーブルである。1つ以上の実施形態において、本開示の手法は、Cライブラリのメモリ割り当て関数をインターセプトして、mallocでBIテーブルにエントリを割り当て、freeで当該エントリを無効にする。図3に示すように、BIテーブルは、ヒープ上の各オブジェクトの境界メタデータのチェックや追跡を容易にすることができる。かかるメタデータは、ハードウェアでのロード/ストア実行時の境界チェック動作を通じて、ポインタ逆参照に対する境界チェックを実行するのに使用可能である。本開示の手法は、オブジェクトポインタの未使用ビット(例えば、上位ビット)に格納された境界テーブルエントリへのインデックスを用いて、オブジェクトのライフタイム(lifetime)中における境界外アクセスを検出する。図3に示すように、本開示の手法はさらに、オブジェクトの解放後、無効な境界テーブルエントリを指すダングリングポインタ内のインデックスを用いて、解放済みメモリ使用エラーを検出する。
注目すべき点として、本開示の手法は、ファットポインタを用いた従来のアプローチとは異なり、バイナリレイアウトに対する変更を容易に回避することができる。さらに、本開示の手法は、あるポインタが別のポインタに割り当てられたり、関数呼び出しで渡されたり、配列のインデックス作成やポインタ演算において別のアドレスを計算するために使用されたりする際に、インデックス伝達のためのオーバーヘッド(プログラムのセマンティクス(program semantics)によって「自動的に」発生する可能性がある)が発生しない。これに対して、既存の手法では、ポインタメタデータを伝達させるために追加の命令やマイクロオペレーション(micro-ops)が必要になる可能性がある。一の実施形態において、インデックスの伝達は、「追加の」命令をフェッチしたり実行したりすることなく、「自動的」に行われる。
さらに、少なくとも次の2つの理由から、実際の境界チェックによる性能への影響は最小限に抑えることができる。第一に、所与のバッファに関連付けられたすべてのアドレスは同一のインデックスを持つことができるので、アドレスのインデックスビットと境界情報は、多くの場合、オンチップの境界情報(BI)キャッシュ(on-chip BI cache)で利用可能である。実装例のシミュレーションでは、8KBのオンチップBIキャッシュを使用した場合、境界情報のヒット率が98%超となった。第二に、ロード操作またはストア操作(load or store operation)に対する境界チェックは、当該ロード操作またはストア操作のアドレス変換(address translation)と並行して行うことができる。そしてこれは多くの場合、ロード命令またはストア命令に余分な遅延を追加することなく行うことができる。最後に、(インデックスによって特定可能な)境界情報の場所はポインタ値とは無関係であるため、本開示の手法によれば、解放済みメモリが再使用された後でも、ダングリングポインタの無効な境界ステータス(invalid-bounds status)を維持することができる。さらに、本開示の手法は、境界メタデータの場所がポインタ値とリンクしていることが多い既存のハードウェアベースの境界チェック手法とは異なり、追加のコストを必要とすることなく時間的安全性を確保することができる。
一の実施形態において、ヒープオブジェクトに関する本開示の境界チェックフレームワークは、1つ以上の仮定(assumptions)を含む脅威モデル(threat model)を含むことができる。仮定は例えば、プログラムには、境界外アクセス、解放済みメモリ使用、二重解放(double-free)、無効解放(invalid-free)などのヒープメモリの安全性に関するバグが存在する可能性がある、というものである。また、仮定は例えば、このようなメモリバグを悪用しようと、攻撃者(adversary)によって未検証の入力(unverified inputs)がプログラムに渡される可能性がある、というものである。また、仮定は例えば、攻撃者は、ユーザプログラムコードを変更してバグを導入したり、境界メタデータに直接アクセスしたり改ざんしたりすることはできない、というものである。また、仮定は例えば、境界メタデータを管理するために本開示のフレームワークが使用可能なメモリアロケータ関数(memory-allocator functions)は、バグが存在せず信頼できる、というものである。
本開示の境界チェックフレームワークの一態様は、プログラムの仮想アドレス空間内のBIテーブルに、オブジェクトの境界メタデータをそのライフタイムにわたって格納する。一の実施形態において、BIテーブルは、プロセスごとのBIテーブルである。本開示の境界チェックフレームワークの他の態様は、プログラム実行時に(at runtime)、すべてのオブジェクトアクセスに対してハードウェアベースの境界チェックを行う。
図4は、本明細書に記載の1つ以上の実施形態に係る、プログラム実行時のポインタの寿命(life-cycle)の概要を概念的に例示する図である。図4に示すように、オブジェクトの作成時に、BIテーブルにエントリ(BIエントリ(BIEntry))を作成することができる。BIエントリは、オブジェクトのベースアドレスとサイズの格納に使用可能である。他の実施形態において、BIエントリは、オブジェクトの上境界と下境界(upper and lower bounds)に対するアドレスの格納に使用可能である。BIテーブル内の対応するエントリへのインデックスは、ポインタの未使用ビット内に埋め込むことができる。本明細書において「インデックスビット」という用語は、BIテーブル内の対応するエントリへのインデックスが埋め込まれる、ポインタの未使用ビットを意味する。実装を簡単にするため、以下の説明では、ポインタの上位24ビット(top 24-bits)がインデックスビットとして使用可能であるものとして説明する。ただし、本開示の実施形態のインデックスビットは、ポインタの連続(contiguous)ビットまたは上位24ビットに限定されない。一の実施形態において、インデックスビットは不連続(non-contiguous)である。一の実施形態において、ポインタの1つ以上のビットが、当該ポインタのインデックスビットに先行する。さらに、図4に示すように、ハードウェアは、上位ビット内のインデックスを用いて対応するBIエントリにアクセスすることができ、ポインタが逆参照された際に、境界チェックを実行して境界外アクセスを検出することができる。さらに、図4に示すように、オブジェクト解放時には、対応するBIエントリを無効化することができる。対応するBIエントリを無効化することで、これら解放済みオブジェクトを指すダングリングポインタが後に使用された場合に、時間的エラーの検出が容易になる。
図5は、本明細書に記載の1つ以上の実施形態に係る、境界チェックフレームワークの構成レイアウト500を例示する図である。図5に示すように、ソフトウェア要素によってBIテーブルを管理することができる。例えば、malloc関数やfree関数のフックを用いて、これらの関数の呼び出しをインターセプトし、関連するBIテーブルの動作(BIエントリの割り当てや無効化など)を実行することができる。このようなフックは、プログラムのコンパイル時にリンカによって追加可能な共有ライブラリ(shared-library)で定義することができる。さらに、このようなフックは、ソースコードの変更を必要としたり、バイナリレイアウトの変更に伴う互換性の問題が発生したりすることなく、プログラムのコンパイル時に追加することができる。さらに、図5に示すように、このバイナリ(binary)が動作するハードウェア要素は、すべてのロード命令もしくはストア命令またはその両方に対して境界チェックを透過的に(transparently)実行し、メモリ安全性違反(memory safety violations)を検出することができる。また、ロード命令もしくはストア命令またはその両方の実行をハードウェアで変更することにより、BIテーブルにアクセスして境界チェック用の境界メタデータを取得するようにすることもできる。また、境界情報キャッシュ(BIキャッシュ)を追加することにより、メモリ内のBIテーブルへのアクセスによる速度低下を制限することができる。
図6は、本明細書に記載の1つ以上の実施形態に係る、BIテーブル600を例示する図である。上述したように、BIテーブル600はプログラムの仮想アドレス空間内に保持することができる。BIテーブル600は、プログラム内の各ヒープオブジェクトの境界メタデータを格納することができる。さらに、BIテーブル600は、ヒープオブジェクトに対する各ロード命令もしくはストア命令またはその両方ごとにアクセスし、境界チェックを実行することができる。
図6に示すように、BIテーブル600は複数のBIエントリ(例えば、BIエントリ610)を含む線形テーブル(linear table)として構成することができる。各BIエントリは、ベースアドレスフィールド620とオブジェクトサイズフィールド630とを含む。図6において、BIテーブル600の各BIエントリは、64ビットのベースアドレスフィールドと64ビットのオブジェクトサイズフィールドとを含む16バイトのBIエントリとして実装される。一の実施形態において、BIテーブル600の各BIエントリは、48ビットのベースアドレスフィールドと48ビットのオブジェクトサイズフィールドとを含む12バイトのBIエントリとして実装してもよい。BIテーブル600の各BIエントリは、ヒープオブジェクトと関連付けることができる。所与のオブジェクトに対応するBIテーブル600の特定のBIエントリにアクセスするには、1回のテーブルルックアップ(single table-lookup)を行うだけでよい(BITable[index])。この1回のテーブルルックアップでは、オブジェクト割り当て時にポインタ650に埋め込み可能なインデックス640を使用することができる。これに対して、図1を参照して上述した境界チェック型手法のうち、分離境界グループ130の一部の実装形態を用いて境界メタデータにアクセスする場合は、ポインタ値そのものを用いた複数レベルのテーブルルックアップ(multi-level table lookups)が必要な可能性がある。
BIテーブル用のメモリ空間は、プログラムの初期化時にmmap呼び出しでMAP_ANONYMOUSフラグを指定して予約することができ、これにより、アクセス時に物理ページを遅延割り当て(allocated lazily)することが容易になる。したがって、BIテーブルが消費するメモリは、プログラム内でメモリ割り当てされた(malloced)オブジェクトの数に比例して増大する。BIテーブルのベースの仮想アドレスとそのサイズは、専用ハードウェアレジスタ(それぞれBTBASEおよびBTSIZE)に格納することができる。一の実施形態において、これらの専用ハードウェアレジスタは、特権ソフトウェア(privileged software)から、またはハードウェア内部からのみアクセス可能である。BIテーブルのベースの仮想アドレスとそのサイズは、x86アーキテクチャのページテーブルベース(page-table base)を格納するCR3レジスタと同様に、コンテキストスイッチによって他のプロセス状態と共に保存もしくは復元またはその両方を行うことができる。これにより、ハードウェアが境界チェックを行いながら、BIエントリの仮想アドレスをBTBASE + index*16として計算するのを容易にすることができる。BIテーブルのサイズから、freeで無効化されたエントリの再使用が必要であるかを決定可能である。一般的にBIテーブルは、プログラム内のライブオブジェクト(メモリ割り当て済みであり解放済みでないオブジェクト)の最大数を収容可能な大きさを有している必要がある。BIテーブルのサイズは1600万エントリ(後述するSPEC-CPU2017のワークロードのうち、ライブオブジェクトの最大数は240万であった)に設定可能であるが、ユーザはコンパイル時にそれより小さい値を選択してメモリの消費を抑えることができる。
LLVMベースのインスツルメンテーションを用いて、mainが実行される前に、malloc/freeフックを初期化することができる。一の実施形態において、LLVMベースのインスツルメンテーションでは、malloc/freeフックを初期化する関数を挿入することができる。これらのフックにより、プログラムからの後続のmallocやfreeの呼び出しをインターセプトすることができる。これらの後続の呼び出しでは、内部メモリの割り当て関数の呼び出しや、BIエントリの作成または削除が行われる。特別な命令(setBIEntry/getBIEntry)を用いて、信頼済みフック関数(trusted hook functions)内でBIエントリを更新またはチェックすることができる。BIテーブルに対する不正な読み出しや書き込みの防止を図るために、これらの特別な命令を使用して、他の非特権ソフトウェア(unprivileged software)(信頼済みメモリアロケータ関数の外部)からのBIテーブルへのアクセスを禁止することができる(これは、信頼済みコンパイラまたはランタイムによるバイナリ検査(binary inspection)で実施可能である)。一の実施形態において、createBIEntryおよびdeleteBIEntryの機能は、BIテーブルの安全性を図るための新たなISA命令として実装することができ、非特権的な使用(unprivileged usage)は、malloc/free関数でのみ許可される(バイナリ検査でこれを確実にすることができる)。ハードウェアは、非特権ソフトウェアからのBIテーブルへのロード/ストアを明示的に防止することができる。
malloc/freeで呼び出し可能な関数フックの例を、一覧1および2に示す。mallocがインターセプトされると、real_mallocを呼び出すことができる。返されたベースアドレスおよび要求されたオブジェクトサイズは、setBIEntry命令によってmallocがインターセプトされた際に、BIエントリに格納することもできる。最初の1600万回のmallocでは、新しいBIエントリをBIテーブルで使用することができる。それ以外の場合は、解放されたBIエントリのインデックス値を格納可能なFIFOを用いて、freeで無効になったBIエントリの1つをFIFO順に再使用することができる。そして、このBIエントリのインデックスは、ポインタの上位24ビットに埋め込まれ、プログラムに返される。freeがインターセプトされた際に、このポインタの上位24ビットのインデックスを用いて、getBIEntry命令によりBIエントリを取得することができる。また、このポインタの上位24ビットのインデックスは、ポインタ値がオブジェクトのベースアドレスと一致しているかの検証に用いることもできる。そして、BIエントリを無効にすることができ(例えば、対応するオブジェクトのベースアドレスおよびオブジェクトサイズを0に設定することができ)、real_freeを呼び出してオブジェクトを解放することができる。
一覧1
Figure 2022065654000002
一覧2
Figure 2022065654000003
図7は、本明細書に記載の1つ以上の実施形態に係る、プログラムの64ビット仮想アドレス空間のレイアウト700を例示する図である。上述したように、本開示の境界チェックフレームワークの1つ以上の実施形態においては、ヒープオブジェクトポインタの上位24ビットを、BIテーブル内の対応するBIエントリのインデックスで置き換えることができる。4レベルのページテーブルを持つ64ビットのLinux(登録商標)システムにおいては、プログラムは通常、48ビットのユーザ仮想アドレス空間(user Virtual-Address space)を使用可能である。インデックスビットが48ビットのユーザアドレスの上位8ビットと重複する可能性があるため、図7に示すように、24ビットのインデックスビットを含むヒープアドレスとプログラムアドレスとの衝突を避けるために、プログラムの仮想アドレス空間を2テラバイト(TB)の領域に制限することができる。本開示の境界チェックフレームワークの実施形態における、珍しいシナリオ(uncommon scenarios)の対処例は、以下でより詳細に説明する。このような珍しいシナリオの例としては、プログラムが2TBより大きい仮想アドレス空間を必要とする場合、ポインタにおいて十分なインデックスビットが使用できない場合、BIテーブルのサイズが不十分な場合、などがある。
レイアウト700において、ヒープは0x0から0xFFFFFFFFFFまで上向きに成長(grow upwards)し、スタックは0x7FFFFFFFFFFFから0x7F0000000000まで下向きに成長(grow downwards)する。残りの254TBのユーザ仮想アドレス空間(すなわち、48ビットの仮想アドレス空間の残りの部分)は、PROT_NONEメモリ保護引数を使用したmmap呼び出しで予約することができる。レイアウト700において、スタックアドレスとの衝突を回避するために、ヒープオブジェクトについてはインデックス値0x7Fの使用をスキップすることができる。また、カーネルアドレスとの衝突を回避するために、レイアウト700における0xFFFF80~0xFFFFFFまでのインデックス値の使用をスキップすることができる。インデックス0x0はNULLポインタ(例えば、ポインタ値「0」)用に予約して、有効なプログラム動作であるNULLポインタでのfree呼び出しをサポートすることができる。
本開示の境界チェックフレームワークにおける境界外アクセスや解放済みメモリ使用の検出は、ロードやストアに対してハードウェアが挿入する境界チェックに依存する。以下、かかるハードウェアベースの境界チェックの設計および実装の一例を説明する。本開示の境界チェックフレームワークのこの例においては、ヒープオブジェクト(上位24ビットにインデックスが存在することで識別可能)に対するすべてのロードおよびストアは、ロード/ストア実行の一部として、ハードウェアベースの境界チェックを含めることができる。境界チェックでは、インデックスを用いて対応するBIテーブルのエントリを検索し、オブジェクトのベースアドレスおよびサイズを取得することができる。ハードウェアベースの境界チェックでは、この取得したオブジェクトのベースアドレスおよびサイズに基づいて、アクセスが[base address,base address+object size]内であることを確認することができる。この範囲内にない場合、境界外の例外(out-of-bounds exception)を発生させることができる。BIエントリのベースアドレスおよびオブジェクトサイズが0の場合、解放済みメモリ使用の例外(use-after-free exception)を発生させることができる。BIエントリが再使用されていた場合、境界の不一致によりダングリングポインタのアクセスが高確率で検出されるが、これに対して境界外の例外としてフラグを立てることができる。
図8は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックを実装するためのハードウェア構成800を例示する図である。ハードウェアベースの境界チェックの場合、境界チェック対象のBIエントリのアドレスは、BIテーブルBaseレジスタと、ロード/ストアアドレスからのインデックスビットとを用いて、BTBASE+Index*16として計算することができ、アドレス変換は通常のロード(regular load)と同じにすることができる。境界チェックは、ロード/ストアの仮想アドレスの準備ができた時点で実行開始することができ、また、ロード/ストアの実行に影響を与えることなくそれと並行して続けることができる。ハードウェアベースの境界チェックは、ロード/ストアのコミットステージ(commit-stage)のクリティカルパス上にのみ存在する。コミットステージは、チェックが合格の場合のみ、ロード/ストアをコミットし、そうでなければ、境界チェックが完了するまで停止する。図8に示すように、BIテーブルのエントリは、ハードウェア構成800内の専用キャッシュ(BIキャッシュ(BICache))にキャッシュすることができる。専用キャッシュは、L1-Dキャッシュ(L1-Dcache)と同様なものとすることができる。BIキャッシュは、ロード/ストア時にL1-Dキャッシュと並行してアクセスしてハードウェアベースの境界チェックを行えるため、ハードウェアベースの境界チェックによる性能への影響は最小限に抑えることができる。BIキャッシュにヒットするハードウェアベースの境界チェックは、ロード/ストアのレイテンシ(latency)にほとんど、あるいはまったく影響を与えない。
図9は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックに伴う速度低下のシナリオを例示する図である。図9に示すように、速度低下が発生するのは通常、境界チェックがBIキャッシュミスとなり、かつ対応するロード/ストア命令がコミットステージに到達するまで境界チェックが保留(pending)となっている場合のみである。
一の実施形態において、本開示の境界チェックフレームワークは、BIテーブルのエントリ用に専用の8キロバイト(KB)、8ウェイ(8-way)のBIキャッシュを用いることができる。BIテーブルへのすべてのアクセス(境界チェックのため、およびmallocやfreeからBIテーブルへのロードとストアのため)は、BIキャッシュを経由させることができる。BIキャッシュの設計は、VIPT(Virtually-Indexed Physically Tagged)方式とすることができる。また、L1-Dキャッシュとほぼ同様の設計とすることができ、レイテンシもL1-Dキャッシュとほぼ同様とすることができる(ただし、サイズはそれより大幅に小さい)。このような設計にすることにより、ハードウェアベースの境界チェックがBIキャッシュでヒットした場合に、ロード/ストアの実行に影響を与えないようにすることができる。BIキャッシュでミスした場合は、簡略化のために、BIエントリはメモリから処理(service)することができる。一の実施形態において、オーバーヘッドの削減をさらに図るため、エントリを最終レベルのキャッシュ(last-level cache)にキャッシュすることもできる。ロード/ストアキューのエントリは、BIキャッシュミスにより境界チェックが遅れた場合に、保留中の境界チェックのステータスを格納するために拡張することができる。保留中の境界チェックのステータスの格納には、48ビットのBIエントリアドレス、1ビットのcheckIssuedフラグ、および1ビットのcheckCompleteフラグを格納することを含むことができる。
一の実施形態において、本開示の境界チェックフレームワークは、一部の命令についてISAサポート(ISA support)を利用して、特権を持たない攻撃者(unprivileged adversary)によるBIテーブルへの不正アクセスを防止することができる。かかる命令は、initBITable命令を含むことができる。オペレーティングシステム(OS)は、initBITable命令を用いて、ハードウェアのBTBASEレジスタにおけるBIテーブルのベースアドレスをプログラム初期化時に任意の仮想アドレスに設定するとともに、BTSIZEレジスタにおけるサイズを設定することができる。非特権ソフトウェアからのBTBASEレジスタもしくはBTSIZEレジスタまたはその両方へのアクセスに対して、例外を発生させることができる。
かかる命令はさらに、信頼済みのmalloc/free関数に対してBIエントリの書き込みや読み出しを許可するsetBIEntry命令やgetBIEntry命令を含むことができる。例えば、setBIEntry命令により、特定のBIエントリ(BITable[index]={base,size})を設定することができる。また、setBIEntry命令は、mallocやfreeでBIエントリを割り当てたり無効にしたりするのに用いることができる。getBIEntry命令により、freeがBIエントリを読み出し、解放対象のポインタが有効であるかどうか(BITable[index].base==ptr_val)をチェックすることができる。信頼済みのコンパイラまたはランタイムによって、setBIEntry命令もしくはgetBIEntry命令またはその両方が、信頼済みのメモリアロケータ関数でのみ用いられることを容易に確実にすることができる。さらに、BIテーブルがマッピングされているアドレスに対する非特権ソフトウェアによる明示的なロードやストアを、ハードウェアによって容易に防止することができる。これにより、特権を持たない攻撃者がBIテーブルのアドレスを推測したとしても、BIテーブルに対して読み出しや書き込みができないようにすることができる。
一の実施形態において、mallocおよびfreeのフック関数は、ロック(locks)を使用してBIテーブルおよびBIテーブルの管理データ構造(例えば、フリーエントリFIFO(free-entry FIFO))のアトミック更新(atomic updates)を可能にすることにより、スレッドセーフな方法(thread-safe manner)で実装することができる。さらに、異なるコアにわたるBIキャッシュ(VIPT設計)間のコヒーレンスは、既存のキャッシュ-コヒーレンスファブリック(cache-coherence fabric)をハードウェアに用いることにより維持することができる。BIテーブルに対する一のコアからの更新を、他のコアからのアクセスに反映させることができ、追加のソフトウェア介入(extra software intervention)の必要はない。プログラム自体がスレッドセーフに書かれており(例えば、異なるスレッドから同一のオブジェクトに対するアクセスとfreeとの間にデータ競合(data race)が発生しない)、かつ内部のメモリアロケータ自体がスレッドセーフである限り、本開示の境界チェックフレームワーク、はマルチスレッドプログラム(multi-threaded programs)との互換性を維持することができる。
上述したように、本開示の境界チェックフレームワークの実施形態を実装した場合、いくつかの珍しいシナリオが発生する場合がある。例外的なケースとして、BIテーブルがプログラムのすべてのBIエントリを格納できない場合がある。例えば、プログラムのアクティブオブジェクト数がBIテーブルのサイズを超える場合、BIテーブルは当該プログラムのすべてのBIエントリを格納できない場合がある。他の例として、ポインタ内で十分な数のインデックスビットが利用できない場合、BIテーブルはプログラムのすべてのBIエントリを格納できない場合がある。
このような場合、オーバーフローテーブル(overflow-table)を用いて、境界メタデータを格納することができる。メタデータがオーバーフローテーブルに保持されているポインタは、そのインデックスビットに特別な値を埋め込むことで識別可能である。このようなポインタについては、ポインタ値そのものを用いてオーバーフローテーブルを検索することができる。このようなテーブルルックアップでは、高コストなマルチレベルのテーブルルックアップが必要になる場合があるため、プログラムにおいて、使用頻度の低いBIエントリのみをオーバーフローテーブルに配置するようにすることができる。本開示の境界チェックフレームワークを実装して評価したSPEC-CPU2017のワークロードでは、1600万のエントリ容量のBIテーブルで十分以上であり(最大で300万未満のエントリが使用)、オーバーフローテーブルは必要としなかった。
以下、本開示の境界チェックフレームワークの1つ以上の実施形態において検出可能な、メモリの安全性に関するバグの種類について例示する。また、以下ではさらに、攻撃者による境界チェックメタデータへのアクセスを防止する例を詳しく説明する。また、本開示の境界チェックフレームワークの1つ以上の実施形態を用いて検出可能な、新しい潜在的なバグについても以下で説明する。
本開示の境界チェックフレームワークの実装例を、How2Heapエクスプロイトスイート(How2Heap exploit suite)のうち25のエクスプロイト(exploits)でテストした。How2Heapエクスプロイトスイートは、境界外アクセス、解放済みメモリ使用、無効解放、二重解放のようなヒープの空間的・時間的安全性に関するバグを利用するものである。本開示の境界チェックフレームワークの実装例では、これら25のプログラムすべてにおいてバグを検出し、例外を発生させて、エクスプロイトの目的が達成される前にプログラムを終了させることができた。これらのうち、本開示の境界チェックフレームワークの実装例では、8件のエクスプロイトで境界外アクセスが、10件のエクスプロイトで解放済みメモリ使用が、7件のエクスプロイトで無効/二重解放が検出された。
境界外アクセスについては、ロード/ストアと並行して挿入される境界チェックによりBIエントリをチェックし、アクセスがロードやストアのオブジェクト境界内であることを確認することができる。解放済みメモリ使用については、ロード/ストアに対する境界チェックによってBIエントリがベース=0、サイズ=0であることが判明した場合は、オブジェクトが最近解放されたか、またはBIエントリが初期化されていない(オブジェクトがメモリ割り当てされていない)かのいずれかである。この場合、本開示の境界チェックフレームワークの実装例では、両方のシナリオに対してエラーのフラグを立てることができ、25件のエクスプロイトのうち10件において、これらのバグを特定できた。BIエントリがメモリ解放(Free)と解放済みメモリ使用(Use-After-Free)との間で再割り当てされた場合、解放済みメモリ使用を境界外アクセスとして高確率で検出することができる。また、オーバーフローテーブルを使用することで、BIエントリの再使用を完全に回避することもできる。二重解放と無効解放については、解放対象のポインタ(pointer-to-be-freed)が対応するBIエントリのオブジェクトベースと一致するかを検証する、freeに対するBIエントリチェックで不一致が検出された場合、無効解放または二重解放のバグを示している可能性がある。ポインタの上位ビットのインデックスが有効な値でない場合、またはBIエントリのオブジェクトベースが一致しない場合は、無効解放バグのフラグを立てることができる。あるいは、BIエントリのベースとサイズが0の場合、二重解放バグのフラグを立てることができる。
本開示の境界チェックフレームワークの1つ以上の実施形態において、ロードまたはストアの境界をチェックするために用いられる2種類のメタデータは、(i)境界を含むBIテーブルにおけるBIエントリ、および(ii)BIテーブルにアクセスするために用いられるポインタ内のインデックスビット、である。以下、本明細書の記載の1つ以上の実施形態による、この2種類のメタデータを保護する例を説明する。
BIテーブルの保護については、特権を持たない攻撃者が、BIテーブルを直接読み出したり変更したりすることはできない。BIテーブルがマッピングされている仮想メモリに対する非特権ソフトウェアによるロードやストアの実行は、ハードウェアによって阻止することができる。このチェックは、BTBaseからBTBase+BITableSizeまでのアドレス範囲に対する特権のないロードやストアを阻止することにより、ロード/ストアユニットによって実施することができる。非特権ソフトウェアに対してBIテーブルへのアクセスを許可するsetBIEntryおよびgetBIEntry命令は通常、信頼済みのメモリアロケータ関数内でのみ許可される(これは、信頼済みのコンパイラまたはランタイムによって実施することができる)。概して、特権OSもしくはシステムソフトウェア、またはハードウェアのみがBIテーブルに直接アクセスすることができる。
ポインタのインデックスビットの保護については、攻撃者が被害者コード(victim code)を変更して、任意にポインタを上書きしたり、ワイルドポインタ(wild pointers)を生成したりすることはできないとの想定が可能である。しかし、攻撃者が被害者コードに含まれる安全でないポインタ演算を利用して、未検証の入力を用いてオーバーフローまたはアンダーフロー(underflow)を引き起こし、インデックスビットを破損させようと試みる可能性がある。このような破損は、本明細書に記載の1つ以上の実施形態に従って実装される境界チェックにおいてエラーとして検出される場合が多い。また、CPUのレジスタを拡張してポインタのインデックスビットを個別に格納し、インデックスビットをポインタ演算から明示的に分離することによっても、インデックスビットの破損を防ぐことができる。
以下、本開示の境界チェックフレームワークの実施形態により実装され、Gem5でモデリングされた境界チェック例に対する試験例の結果について説明する。本試験例は、clang-11とGlibc-v2.27を使用してコンパイルされた13個のC/C++SPEC-CPU2017バイナリを用いて行った。以下、ポインタアクセスをオブジェクトの割り当て境界(allocation-bounds)に対してチェックした際に、本境界チェック例が検出した境界外アクセスについて説明する。ここで、BIエントリは、mallocによって割り当てられた16バイトの整列サイズ(16-Byte aligned size)を格納している。本開示の境界チェックフレームワークの1つ以上の実施形態はさらに、プログラムによって要求されるオブジェクトサイズをBIエントリに格納することによって、バイト粒度の境界チェック(byte-granularity bounds-checks)をサポートする。
図10に、本試験例の結果を示す。具体的には、図10は、本開示の境界チェックフレームワークの実施形態によって境界外アクセスが検出された関数を例示するグラフ1000である。図10は、本開示の境界チェックフレームワークの実装例によって、Gem5シミュレータ上で110億個の命令に対して実行された13個のSPEC C/C++バイナリにわたって境界外アクセスが検出された関数を示す。全体として、図10に示すように、この境界チェックフレームワークの実装例では、87行のコードで境界外アクセスが検出された。87行のコードのうち、80行のコードは、高度に最適化されたGlibc-v2.27の文字列処理用の関数(strlen、strchr、strcmpなどを含む)で、7行のコードは、blenderプログラムの4つのユーザ関数であった。この試験例では、これらのアクセスが境界外となった最大バイト数は、Glibc関数の62バイトで、blender関数ではわずか4バイトであった。
本試験例で検出されたこれらのバグはいずれも、メモリからSIMDレジスタにデータをロードするSIMD命令が原因であることが確認された。図11は、本明細書に記載の1つ以上の実施形態に係る、境界外の原因となったSPEC-CPU2017アプリケーションにおける命令を例示するグラフ1100である。図11に示すように、Glibc文字列処理関数におけるこのような命令は、SIMD移動(MOVDQA、MOVDQU、MOVHPD、MOVLPD)、比較(PCMPEQB)、または最小化(PMINUP)の命令を含む。また、図11に示すように、blenderにおけるこのような命令は、SIMD演算命令(MUSS、ADSS、SUBSS)を含む。調査により判明したところでは、blenderのバグは、O3フラグ(O3 flag)でコンパイルした場合に、コンパイラが非整列の16バイトSIMDロード(unaligned 16-byte SIMD loads)を使用してオブジェクト境界にあるメモリにアクセスすると、部分的に境界外アクセスが発生することにより、発生したものであった。これらのバグは、SIMD演算を使用していないためO0フラグ(O0 flag)を用いることで消滅した。Glibc関数におけるバグは、Ubuntu18.04で配布された共有ライブラリ(libc.a)に存在し、またメモリアクセス時の境界外バイト数が最大62バイトになるため、より深刻なものと考えられる。
境界外アクセスのコード行数が最も多い(20行)関数であるstrlenについて調べたところでは、そのバグの半数以上(20件中11件)は、16バイトのオペランド(1つはメモリから、もう1つはレジスタから)のバイト単位(byte-wise)の比較を行うためのPCMPEQB命令に起因するものであった。strlen関数はこれらを用いて、入力文字列のNULL文字(「\0」)の高速チェックを実行し、文字列の長さを計算する。Glibc-v2.27のlibc.aのオブジェクトダンプ(object-dump)から生成されたstrlenのアセンブリコードの例を一覧3に示す。このコードでは、16バイトの比較を3つ(他の場所では最大4つ)同時に発行した後、テストおよびジャンプ命令を使用して、NULLが発生した場合に比較を停止する。この安全でないコードは、文字列オブジェクトの外側にある最大47バイト(16バイト比較を4回行う場合は最大63バイト)のメモリにアクセスできる。これらのバイナリをデフォルトバージョンのASANでもテストしたが、これらのバグのいずれも検出することはできなかった。これは、ASANでは、共有ライブラリのバグを検出するために共有ライブラリの再コンパイルを必要とするためである。さらに、ASANのデフォルト実装(default implementation)では、本開示の境界チェックフレームワークの実施形態ではblenderにおいて検出された、非整列ロード(unaligned loads)による部分的な境界外アクセスを検出しなかった。
一覧3
Figure 2022065654000004
以下、上述した試験例を実施するための評価方法の概要を示す。また、以下ではさらに、本開示の境界チェックフレームワークの1つ以上の複数の実施形態を実装する際に発生し得る、例示的なソフトウェアおよびハードウェア変更によるオーバーヘッドについて説明する。
評価方法として、本開示の境界チェックフレームワーク(malloc/freeフックを含む)の実施形態を実現するためのソフトウェア変更を、共有ライブラリとしてパッケージ化(packaging)した。さらに、評価方法として、LLVM10で追加されたインスツルメンテーションを利用して、プログラムmainの前に初期化関数(initialization function)を追加した。本開示の境界チェックフレームワークの実施形態を実現するためのハードウェア変更は、Gem5 v20.0でモデリングした。性能評価のための評価方法として、SPEC-CPU2017で公開されている16種類のC/C++ベンチマークのうち、13種類のベンチマークをrefデータセットと共に利用した(3種類のワークロードは、本評価方法では動作しなかった)。さらに、評価手法として、インスツルメンテーション後のバイナリ(instrumented binaries)をネイティブマシン(Intel社(カリフォルニア州サンタクララ)が提供するXeon CPU E-2174G、3.80GHz)上で完了まで実行(ISAの変更をCコードでエミュレート)し、インスツルメンテーション前のバイナリ(uninstrumented binaries)と比較することで、ソフトウェアインスツルメンテーションのオーバーヘッドを評価した。ハードウェアのオーバーヘッドについての評価方法として、インスツルメンテーション後のバイナリを使用し、Gem5のシステムコールエミュレーションモード(System-Call Emulation mode)において、境界チェックを行う場合と行わない場合とでバイナリを実行した。さらに、評価方法として、初期化フェーズをスキップしてキャッシュをウォームアップ(warmup)するために最初の100億個の命令を早送りし,10億個の命令の統計情報を追跡した。本評価方法がGem5のために使用したハードウェア構成を表1に示す。
Figure 2022065654000005
図12は、本明細書に記載の1つ以上の実施形態に係る、BIテーブル管理のためのソフトウェアインスツルメンテーションによる性能への影響を例示するグラフ1200である。具体的には、グラフ1200は、malloc/free呼び出しをインターセプトしてBIテーブルを更新する共有ライブラリとリンクしたアプリケーションの実行時間(execution times)を示している。グラフ1200は総じて、malloc/freeインスツルメンテーションに関連付けられる速度低下の評価を容易にするものである。グラフ1200に示す実行時間は、インスツルメンテーション前のバイナリの実行時間に正規化されている。グラフ1200に示す各実行時間は、対応するプログラムをネイティブシステム上で完了まで実行し、全体の実行時間を測定することによって得られたものである。ネイティブ実行(native execution)を容易にすると共に、BIテーブル管理のオーバーヘッドをモデリングするために、複数のBIエントリを、ポインタにインデックスビットを埋め込まずにmallocで割り当て、freeでランダムにBIエントリを削除した。図12に示すように、BIテーブル管理のためのソフトウェアインスツルメンテーション(境界チェックなし)によって、すべてのプログラムわたって平均約0.5%の速度低下が追加される可能性がある。mallocの頻度が高いワークロード(例えば、gccやperlbench)では、BIテーブル更新のためのキャッシュアクセスが増加するため、最大1.8%~2.4%の速度低下が発生する可能性がある。mallocがほとんど使用されないその他のワークロードでは、性能への影響は無視できる程度である。
図13は、本明細書に記載の1つ以上の実施形態に係る、ハードウェアベースの境界チェックによる性能への影響を例示するグラフ1300である。具体的には、グラフ1300は、境界チェックと共に実行されるインスツルメンテーション後のバイナリの命令10億個あたりの実行時間を、境界チェックを実行しない対応するバイナリの実行時間にそれぞれ正規化して示したものである。グラフ1300は総じて、インスツルメンテーション後のバイナリを用いたGem5におけるハードウェアベースの境界チェックに関連付けられる速度低下の評価を容易にするものである。図13に示すように、ハードウェアベースの境界チェックによって、平均約1%の速度低下が追加される可能性がある。これらのオーバーヘッドの主な要因は、BIキャッシュミスに伴い境界チェックで発生するメモリアクセスである。mallocの頻度が高いワークロード(例えば、xalancbmk、gcc、parest)では、バッファが小さくなるため、同じインデックスを共有するバッファアクセスが少なくなる傾向がある。これにより、境界メタデータの作業セット(working-sets)が大きくなる可能性があり、そのため、BIキャッシュミス率が高くなったり(例えば、2%~16%)、速度低下が大きくなったり(例えば、1%~6%)する可能性がある。BIキャッシュヒット率が99%超のその他のワークロードでは、速度低下は無視できる程度である。
図14および15は、BIキャッシュミスが発生したロードに関するシナリオの内訳の例を示す図である。具体的には、図14は、本明細書に記載の1つ以上の実施形態に係る、BIキャッシュミスを含む命令1000個あたりのロードを例示するグラフ1400である。図15は、本明細書に記載の1つ以上の実施形態に係る、BIキャッシュミスを含むロードの割合を例示するグラフ1500である。境界チェックがBIキャッシュヒットの場合、速度低下が発生することはないため、xalancbmk、gcc、parestなどのワークロードにおける速度低下を理解すべく、これらのワークロードでBIキャッシュミスが発生するシナリオを評価した。評価の結果、総じてBIキャッシュミスの98%超がロード操作時の境界チェックで発生し、ストア時のミスはわずか2%であることが分かった。
グラフ1400および1500は、ロード処理が行われた場所に基づく、ロード操作時のBIキャッシュミスの内訳を示している(それぞれ、絶対数と割合で示す)。グラフ1400および1500に示すように、xalancbmkワークロードが最もBIキャッシュミスが多く(ミス率が最も高い)、その結果、速度低下が最も大きい。一方、gccワークロードはparestワークロードよりもミス率は高いが、gccワークロードの方が速度低下は小さい。概して、gccワークロードの速度低下が小さいのは、ロードがL1-ヒットである場合(これは、L1-ミスとなったロード時のBIキャッシュミスよりも性能への影響が大きい)のBIキャッシュミスの割合が非常に小さいためである。このように、L1-キャッシュヒット時のBIキャッシュアクセスに局所性(locality)がないことが、xalancbmkおよびparestのワークロードの速度低下の主な要因となり得る。ただしこれは、BIエントリ割り当てアルゴリズムを、特にこれらのベンチマークで一般的なサブキャッシュラインオブジェクト(sub-cacheline objects)に対して局所鋭敏な(locality-sensitive)ものにすることで対処可能であり、それによりこれらのワークロードのオーバーヘッドを低減することができる。
図16および17は、BIキャッシュサイズごとの、境界チェックに伴う速度低下の例を示す図である。具体的には、図16は、本明細書に記載の1つ以上の実施形態に係る、異なるBIキャッシュサイズごとの、境界チェックに伴う平均速度低下を例示するグラフ1600である。図17は、本明細書に記載の1つ以上の実施形態に係る、異なるBIキャッシュサイズごとの、BIキャッシュミス率を例示するグラフ1700である。上述した境界チェックのオーバーヘッドの評価例では、8KBのデフォルトBIキャッシュサイズを利用したが、グラフ1600および1700は、その他のBIキャッシュサイズにおける評価を示している。具体的には、グラフ1600および1700は、BIキャッシュのサイズを1KBから64KBまで変化させたときの、境界チェックに伴う速度低下と、BIキャッシュミス率とを示している。グラフ1600および1700に示すように、BIキャッシュのサイズが大きくなるにつれて、速度低下が7%(1KB)、3%(4KB)、1%(8KB)と減少していく。ただし、BIキャッシュのサイズをさらに大きくした場合の速度低下の減少度合いは、わずかである可能性がある。これは、8KBを超えると、ほとんどのワークロードのミス率が1%未満となる可能性があり、平均BIキャッシュミス率が総じてさほど減少しないためである。
図18および19は、本開示の境界チェックフレームワークの実施形態の実装に伴うメモリオーバーヘッドの例を示す図である。具体的には、図18は、本明細書に記載の1つ以上の実施形態に係る、境界チェックに関連するメモリ帯域幅のオーバーヘッドを例示するグラフ1800である。図19は、本明細書に記載の1つ以上の実施形態に係る、BIテーブルに関連するメモリオーバーヘッドを例示するグラフ1900である。グラフ1800に示すように、境界チェックによって、アプリケーションによるメモリ帯域幅消費が平均約29%増加する可能性がある。ただし、このアプリケーションによるメモリ帯域幅消費は、BIキャッシュの設計に応じて変化し得る。例えば、BIエントリを共有の最終レベルキャッシュ(shared last-level cache)に追加でキャッシュすることにより、必要な帯域幅を減らすことができる。幸い、DDR4 DRAMであれば、速度低下を生じることなく、追加の帯域幅要件を満たすことができる。メモリの消費については、BIテーブルが1エントリあたり16バイトの1600万エントリで構成されている場合、BIテーブルは最大で256MBを消費する可能性がある。この構成では、BIテーブルは平均39%のメモリを追加で消費する可能性がある。一の実施形態において、800万の12バイトエントリ(48ビットのベースと境界を格納)で構成された、メモリ最適化された(memory optimized)BIテーブル設計(例えば、BIテーブル-MemOpt)の場合、追加のメモリ消費は約17%とすることができる。これらのオーバーヘッドは、BIテーブルが必要とするメモリが、プログラムメモリの使用量ではなくmallocの数に応じて増大するため、図1を参照して上述した境界チェック型手法うち分離境界グループ130のようなシャドウメモリを使用した手法に比べて、はるかに小さくすることができる。
以下、空間的・時間的安全性を確保するための他のハードウェアベースの手法について説明し、本開示のハードウェアベースの境界チェックフレームワークと比較する。他の境界チェック手法に対する本開示の境界チェックフレームワークの1つの特徴的な要素として、本開示の境界チェックフレームワークによれば、非常に低コストでありながら、境界情報の伝達およびルックアップが容易に行える。
図1を参照して上述したように、分離境界グループ130における1つの手法は、シャドウメモリから境界メタデータにアクセスすることによって境界チェックを行うが、この場合、空間的安全性しか確保されない。分離境界グループ130における他の手法では、この設計を拡張して、取り消し(revoke)可能な一意の識別子(これもシャドウメモリに格納されている)とポインタを関連付けることにより、適度なコスト(例えば、平均24%の速度低下)で時間的安全性を確保する。境界チェック時のこのようなシャドウメモリへのアクセスは、単一のオブジェクトの異なるワードに対してロード/ストアを行うためにシャドウメモリにおける異なる場所へのアクセスが行われるため、時間的な局所性(temporal locality)が限られる。本開示の境界チェックフレームワークの1つ以上の実施形態においては、ポインタ内のインデックスビットを使用してBIテーブルにアクセスすることができ、これにより容易に、単一のオブジェクトに対するすべてのロード/ストアが同一のBIテーブルエントリを使用することを確実にすることができる。これにより、98%超のBIキャッシュヒット率を実現可能な低コストの境界チェック(例えば、1%の速度低下)を実行することが容易になる。
分離境界グループ130の他の手法では、空間的および時間的安全性を確保する。すなわち、能力ID(Capability-ID)を用いてインデックスされた別個の能力テーブル(capability-table)に格納された能力とポインタを関連付け、境界チェックの境界を取得する。しかし、メモリにスピルしたポインタ(pointers spilled to memory)の場合、5レベルのPointer-Alias Tableに対して2回目の高コストなルックアップを必要とするため、ポインタ値から能力IDを導出することは高コストになる可能性がある。この手法では、能力IDを低コストで派生ポインタ(derived pointers)に伝達し、能力および識別子をキャッシュするために、ハードウェアにおける投機的ポインタ追跡メカニズム(speculative pointer-tracking mechanism)を提案し、平均的速度低下を15%に抑えているが、高コストのテーブルルックアップにより、最悪の場合40%もの速度低下を招く可能性がある。さらに、ポインタ演算を介して能力IDを転送するには、投機的なポインタ追跡メカニズムが必要となる。これに対して、本開示の境界チェックフレームワークの実施形態は、ポインタの未使用ビット内に埋め込まれたインデックスを用いてルックアップ可能なBIテーブルを利用するため、追加のコストを必要とすることなく、派生ポインタに自動的にBIテーブルを転送することができ、最悪の場合でも速度低下を約7%に抑えることができる。
分離境界グループ130のその他の手法によって、空間的・時間的安全性が確保できる場合もあるが、これらの手法における境界チェックは追加の明示的な命令(extra explicit instructions)を必要とし、また境界テーブルが2レベルのトライ(two-level trie)として構成されているため高コストなテーブルルックアップを伴うことから、大きなオーバーヘッド(例えば、平均50%~60%)が生じる。これに対して、本開示の境界チェックフレームワークの実施形態では、時間的な局所性が高く、ロード/ストア実行時にハードウェアに透過的に挿入可能なテーブルルックアップを最大1回行うだけでよい境界チェックを実装することができる。
隣接境界グループ110の手法は、メモリの安全性を確保することはできるが、バイナリレイアウトを変更しなければならず、それにより既存のライブラリコードとの互換性に影響が生じる。インライン境界グループ120の手法は、未使用のポインタビットを境界メタデータ用に転用することによって互換性の問題を回避できるが、時間的な安全性を確保することができない。本開示された境界チェックフレームワークの実施形態によれば、レガシー共有ライブラリ(legacy shared-libraries)との互換性を維持すると共に、既存の共有ライブラリに渡されるポインタに関するメモリ安全性(時間的安全性および空間的安全性の両方)を確保することもでき、さらに、速度低下を無視できる程度にとどめることもできる。
トリップワイヤを用いた確率的手法では、オブジェクトまたはサブオブジェクトの粒度(granularity)でマジックバリュー(magic-values)(すなわち、トリップワイヤ)を挿入し、ハードウェアでこれらのマジックバリューをチェックすることで、トリップワイヤを作動させる境界外アクセスを検出することにより、低コストのメモリエラー検出を実現することができる(例えば、2%~18%の速度低下)。しかし、このような手法では、トリップワイヤを超えてメモリにアクセスするような、より大きな境界外アクセスを検出することができない。本開示の境界チェックフレームワークの実施形態によれば、同等またはそれ以上の性能で、すべての境界外アクセスを正確に検出することが可能となる。
メモリタギングを用いた確率的手法は、オブジェクトとポインタのペアにタグまたは「色」を割り当て、これらのタグを両者別々に保持し、ポインタ逆参照時にポインタとアクセスされたメモリのタグが一致するかどうかをチェックする。この手法では速度低下を無視できる程度(例えば、5%より小さい速度低下)にできるが、異なるオブジェクトに再使用される4ビットのタグ(ポインタの上位ビットに格納される)を使用するため、エラーを確率的にしか検出できず、検出漏れ(false-negatives)につながる。本開示の境界チェックフレームワークの実施形態においてもポインタビットを転用できるが、上記とは対照的に、実際の境界情報へのインデックスを格納するために当該ポインタビットを使用する。したがって、本開示の境界チェックフレームワークの実施形態によれば、同等の速度低下で、オブジェクト境界の正確な実施(高いカバー率)を実現することができる。
図20A乃至20Gは、本明細書に記載の1つ以上の実施形態に係る、メモリ内のBIテーブルを初期化するための動作フロー2000を例示する図である。図20Aに示すように、動作フロー2000は、アプリケーションまたはユーザプログラムがランタイムに入る状態2002を含む。状態2002から、動作フロー2000は図20Bに示す状態2004に移行する。状態2004において、アプリケーションは、2つの引数を含むBIテーブル初期化呼び出し(initialization call)を生成する。BIテーブル初期化呼び出しの第1の引数は、マスク値(例えば、0xff00)を含む。このマスク値は、ポインタ内のどの未使用ビットを、BIテーブル内の対応するBIエントリのインデックス情報の格納に使用するかを定義するものである。BIテーブル初期化呼び出しの第2の引数は、サイズ値(例えば、128)を含む。このサイズ値は、初期化時にBIテーブルに割り当てられるBIエントリの数を定義するものである。状態2004から、動作フロー2000は図20Cに示す状態2006に移行する。
状態2006において、アプリケーションは、境界チェックライブラリ(BC_Library)に対してBIテーブル初期化呼び出しを発行する。状態2006から、動作フロー2000は図20Dに示す状態2008に移行する。状態2008において、BC_Libraryの作成ルーチン(creation routine)が、BIテーブル初期化呼び出しに含まれるサイズ値に基づいて、メモリの領域をBIテーブルに割り当てることにより、メモリ内にBIテーブルを作成する。状態2008から、動作フロー2000は図20Eに示す状態2010に移行する。状態2010において、BC_Libraryの初期化ルーチン(initialization routine)が、BIテーブルの各BIエントリに初期値を入力(populate)することによって、BIテーブルを初期化する。状態2010から、動作フロー2000は図20Fに示す状態2012に移行する。
状態2012において、BC_Libraryの専用レジスタルーチン(special register routine)が、複数の専用ハードウェアレジスタに、BIテーブルに対応する値を入力する。図20Fに示すように、複数の専用ハードウェアレジスタは、境界テーブルレジスタ(BTR)、境界マスクレジスタ(BMR)、および境界テーブルサイズレジスタ(BTSR)を含む。BTRは、メモリ内の割り当て領域に存在するBIテーブルのベースアドレスを格納する。BMRは、状態2006にてアプリケーションがBC_Libraryに発行したBIテーブル初期化呼び出しからマスク値を格納する。BTSRは、状態2006にてアプリケーションがBC_Libraryに発行したBIテーブル初期化呼び出しからサイズ値を格納する。このサイズ値は、BIテーブルを構成するBIエントリの数を定義するものである。状態2012から、動作フロー2000は図20Gに示す状態2014に移行する。状態2014において、BC_Libraryのハンドラルーチン(handler routine)が、BIテーブル上での操作に使用可能なbt_handlerを設定する。一の実施形態において、bt_handlerは、グローバル変数(global variable)である。一の実施形態において、bt_handlerは、BIテーブルのベースアドレス、BIテーブル初期化呼び出しのサイズ値、BIテーブル初期化呼び出しのマスク値、またはこれらの組み合わせに関連するデータを格納する複数のフィールドで構成される。
図21A乃至21Eは、本明細書に記載の1つ以上の実施形態に係る、メモリ割り当て機能を処理するための動作フロー2100を例示する図である。図21Aに示すように、動作フロー2100は、アプリケーションが、メモリ領域の割り当てを要求するためのメモリ割り当て呼び出し(memory allocation call)を生成する状態2102を含む。メモリ割り当て呼び出しは、要求したメモリ領域割り当てのサイズを定義する長さ値(length value)を含む引数を含む。状態2102から、動作フロー2100は図21Bに示す状態2104に移行する。状態2104において、アプリケーションは、ヒープライブラリ(Heap_Library)のメモリ割り当て関数に対して、メモリ割り当て呼び出しを発行する。図21Bに示すように、メモリ割り当て関数は、BIテーブルにエントリを作成するための2つの引数を含むBIエントリ作成呼び出し(BIEntry creation call)を生成する(p=createBI(p,len))。さらに、メモリ割り当て関数は、元のメモリ割り当て呼び出し(original memory allocation call)を処理し、要求されたメモリ領域を割り当てる(p=origin_malloc(len))。BIエントリ作成の2つの引数は、新たに割り当てられたメモリ領域のベースアドレスを定義するポインタ値を含む第1の引数と、割り当てられたメモリ領域のサイズを定義する長さ値を含む第2の引数とを含む。状態2104から、動作フロー2100は図21Cに示す状態2106に移行する。
状態2106において、HEAP_Libraryのメモリ割り当て関数が、BC_LibraryのBIエントリ作成関数に対して、BIエントリ作成呼び出しを発行する。状態2106から、動作フロー2100は図21Dに示す状態2108に移行する。状態2108において、BIエントリ作成関数は、割り当てられたメモリ領域に関連付けられた境界メタデータを格納するために、BIテーブル内の空きBIエントリ(free BIEntry)を検索する。状態2108から、動作フロー2100は図21Eに示す状態2110に移行する。状態2110において、BIエントリ作成関数は、空きBIエントリに対して、割り当てられたメモリ領域のベースアドレスを定義するポインタ値と、割り当てられたメモリ領域のサイズを定義する長さ値とを入力する。BIエントリ作成関数はさらに、空きBIエントリのインデックス値(idx)をポインタ値に埋め込み、メモリ割り当て関数に返される新たなポインタ値を作成する。
図22A乃至22Kは、本明細書に記載の1つ以上の実施形態に係る、ロード命令を処理するための動作フロー2200を例示する図である。図22Aに示すように、動作フロー2200は、アプリケーションがアドレスRaからロード命令を実行可能な状態2202を含む。状態2202から、動作フロー2200は図22Bに示す状態2204に移行する。状態2204において、境界保護ユニット(BPU:bound protection unit)は、RaレジスタおよびBMRからアドレス値およびマスク値を抽出することができる。状態2204から、動作フロー2200は図22Cに示す状態2206に移行する。状態2206において、BPUは、ロード命令に関連付けられたヒープオブジェクトのメモリアドレスを抽出すると共に、アドレスおよびマスク値からインデックス値を抽出することができる。状態2206から、動作フロー2200は図22Dに示す状態2208に移行する。状態2208において、Raから導出されたメモリアドレスとマスク値とがロード命令によって利用され、ヒープオブジェクトからバイトをロードすることができる。状態2208から、動作フロー2200は図22Eに示す状態2210に移行する。
状態2210において、BPUは、アプリケーションに関連付けられたBIテーブルのベースアドレスを含むBTRと、RaおよびBMRから導出されたインデックスとを用いて、アドレスRaに対応するBIエントリのアドレスを決定することができる。状態2210から、動作フロー2200は図22Fに示す状態2212に遷移する。状態2212において、BPUは、状態2210にて決定されたBIエントリのアドレスを用いて、ロード命令に対する適切なBIエントリを取得する。状態2212から、動作フロー2200は図22Gに示す状態2214に移行する。状態2214において、BPUは、インデックス値を、BTSRから取得したBIテーブルのサイズ値と比較して、インデックス値が有効であるか否かを評価することができる。状態2214から、動作フロー2200は図22Hに示す状態2216に移行する。
状態2216において、状態2214での評価によってインデックス値が無効であると判定された場合、BPUは例外値(exception value)を生成し、境界ステータスレジスタ(BSR:bounds status register)に格納することができる。あるいは、状態2214での評価によってインデックス値が有効であると判定された場合、BPUは、BIエントリアドレスを含むBIロード命令(BI load instruction)を境界キャッシュに発行することができる。状態2216から、動作フロー2200は図22Iに示す状態2218に移行する。状態2218において、境界キャッシュが境界メタデータを含んでいる場合、BPUはBIロード命令に応答して、境界キャッシュからヒープオブジェクトに対応する当該境界メタデータを取得することができる。あるいは、境界キャッシュが境界メタデータを含んでいない場合、BPUは、BIロード命令に応答して、メモリ内のBIテーブルからヒープオブジェクトに対応する当該境界メタデータを取得することができる。状態2218から、動作フロー2200は図22Jに示す状態2220に移行する。
状態2220において、BPUは、境界メタデータと状態2206で抽出されたヒープオブジェクトのメモリアドレスとを比較して、ロード対象のメモリアドレスが有効であるか否かを評価することができる。状態2220から、動作フロー2200は図22Kに示す状態2222に移行する。状態2222において、状態2220での評価によってメモリアドレスが無効であると判定された場合、BPUは例外値を生成し、BSRに格納することができる。あるいは、状態2220での評価によってヒープオブジェクトのメモリアドレスが有効であると判定された場合、BPUは、アプリケーションによって実行されるロード命令を続行させることができる。
図23は、本明細書に記載の1つ以上の実施形態に係る、ポインタ2300を例示する図である。一部の場合において、配列のインデックス作成やポインタ演算の結果、BIテーブルへのインデックスとして使用されるポインタの未使用ビット(またはインデックスビット)に演算が「オーバーフロー」して、未使用ビットを「破損」(corrupt)する可能性がある。かかる場合に境界外参照(out-of-bounds reference)が検出されないためには、破損したインデックス値が、BIテーブル内の有効なBIエントリを参照している必要があると共に、ポインタのポインタ値ビット(またはアドレスビット)が当該BIエントリの境界内の有効なアドレスに対応している必要がある。このような事態が発生する可能性は低いが、ポインタを変更して、このような事態が発生する可能性を低減したり、回避したりすることができる。そのために、ポインタ2300は、インデックスビット2320(例えば、ビット42~63)とアドレスビット2330(例えば、ビット0~39)との間の保護帯域(guard band)を促進する保護ビット(guard bits)2310(例えば、ビット41および40)を含む。図24および25を参照して以下で詳述するように、保護ビット2310は、「適度な大きさの(moderately sized)」オフセットがアドレスに加算されたりアドレスから減算されたりする場合に、インデックスビット2320を保護することができる。
図24は、本明細書に記載の1つ以上の実施形態に係る、ポインタ2400を例示する図である。図24に示すように、ポインタ2400は、インデックスビット2420と、アドレスビット2430と、インデックスビット2420とアドレスビット2430との間に介在する保護ビット2440と、を含む。図24において、保護ビットは、左から右に「10」の2進値で構成される。ポインタ2400に適度な大きさのオフセット(例えば、<240)を加算すると、保護ビット2440の下位ビット(例えば、ビット40)が「0」の2進値から「1」の2進値に反転するキャリー(carry)が発生する可能性があるが、それがインデックスビット2420にオーバーフローして、インデックスビット2420を破損することはないと考えられる。さらに、ポインタ2400から適度な大きさのオフセットを減算すると、保護ビット2440のビット41が「1」の2進値から「0」の2進値に反転するボロー(borrow)が発生する可能性があるが、それがインデックスビット2420にオーバーフローして、インデックスビット2420を破損することはないと考えられる。
例えば、図25に示すように、負の「1」の2進値をポインタ値2400に加算することができる(または、「1」の2進値をポインタ値2400から減算することができる)。保護ビット2440の上位ビット(例えば、ビット41)に負の「1」の2進値を加算することで、負の1の64ビット表現において、ビット41の左側の「1」の2進値を実質的にゼロにするキャリーを発生させることができる。したがって、ビット41の左側のビットは合計で、図24のポインタ2400によって表される元のアドレスにおけるこれらのビットに等しくなる。図23乃至25を参照して上述したインデックスビットの破損緩和(corruption mitigation)手法によって、1テラバイト(TB)超のアドレス空間を使用し、400万超の配列に対して境界情報を追跡するアプリケーションまたはユーザプログラムの実行が容易になる。当該手法はこれを実現しながら、境界外の配列参照を防止すると共に、適度な大きさのオフセット(例えば、<240)に伴うポインタ演算における「インデックス破損」を防止または軽減することができる。
図26は、本明細書に記載の1つ以上の実施形態に係る、ヒープオブジェクトに関するハードウェアベースのメモリエラー軽減を容易にするコンピュータ実装方法2600を例示するフローチャートである。説明を簡潔にするために、本明細書の他の実施形態における要素と同様の要素については説明を省略する。
ステップ2602にて、コンピュータ実装方法2600は、オブジェクトがメモリに割り当てられた際に、プロセッサ(例えば、エントリコンポーネント240を含む)を用いて、境界情報を格納するためのテーブルにエントリを割り当てることを含むことができる。ステップ2604にて、コンピュータ実装方法2600は、プロセッサ(例えば、転用コンポーネント250を含む)を用いて、オブジェクトアドレスの未使用ビットを転用して、テーブルのエントリへのインデックスを格納することを含むことができる。
一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサ(例えば、チェックコンポーネント260を含む)を用いて、アドレス内のインデックスビットを使用して境界情報にアクセスすることによって、ロード命令およびストア命令に対してハードウェアで境界チェックを実行することを含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサ(例えば、伝達コンポーネント270を含む)を用いて、後続のオブジェクトアドレスが割り当てステートメントまたはポインタ演算を介して導出される際に、インデックスを自動的に伝達することを含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、配列の境界をチェックすることを含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、配列参照が境界内であるか境界外であるかを判定することを含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、境界外の配列参照の発生を軽減することを含むことができる。
一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、オブジェクトアドレス内の未使用ビットを使用して、アクセス可能なメモリアドレスの範囲をチェックすることをさらに含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、オブジェクトアドレスが割り当てステートメントにコピーされる際に、未使用ビットで追加の情報を伝達することをさらに含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、オブジェクトアドレスが関数呼び出しの引数として渡される際に、未使用ビットで追加の情報を伝達することをさらに含むことができる。一の実施形態において、コンピュータ実装方法2600はさらに、プロセッサを用いて、オブジェクトアドレスがアドレスの計算に使用される際に、未使用ビットで追加の情報を伝達することをさらに含むことができる。
上記では、ヒープオブジェクトを誤ったメモリ参照から保護することを主に説明したが、本明細書に記載のメカニズムは、グローバルオブジェクトやスタック上に割り当てられたオブジェクトなど、他の種類のオブジェクトにも適用可能である。グローバルオブジェクトは、プログラム起動時にプログラム内の各グローバルオブジェクトについて、BIエントリをBIテーブルに割り当てることで保護することができる。スタックオブジェクトも保護することができる。スタックオブジェクトを保護する1つの方法として、プログラムを構成するソース言語ファイル(例えば、CファイルやC++ファイル)を前処理する前処理ステップを追加する方法がある。ソース言語ファイルの前処理として、ファイル内の各関数について、当該関数が直接的または間接的に自身を再帰的に呼び出すことができるか否かを判定する静的解析を行うことができる。関数が自身を再帰的に呼び出すことができない場合、前処理として、当該関数を編集して、関数内の自動オブジェクト(automatic objects)の宣言(declarations)を静的オブジェクトに変換(translate)することができる。そして、プログラム起動時に、これらの静的オブジェクトについてのBIエントリを、上述したグローバルオブジェクトについてのBIエントリの割り当てと同様に割り当てることができる。再帰的に呼び出すことができる関数内のオブジェクトは、別の方法で処理することができる。この場合、別の処理ステップにおいて、関数のプロローグとエピローグを編集して、当該関数内の各オブジェクトに対してBIエントリの割り当ておよび解放を行うためのコードを含めることができる。あるいは、すべての再帰的関数および非再帰的関数を同様に処理し、各関数のプロローグとエピローグを編集して、適切なBIエントリの割り当ておよび解放を行うためのコードを含めることができる。
また、ポインタの定義時にNULL値(すなわち0)を割り当てることにより、初期化されていないポインタ(uninitialized pointers)の使用を防ぐことも可能である。これにより、初期化されていないポインタの「ガベージ(garbage)」を使ってメモリの読み出しや書き込みが行われてしまう逆参照バグ(de-referencing bugs)からプログラムを保護することができる。
なお、上述した保護メカニズムを含めても含めなくても、プログラムの構築は可能である。例えば、適切な「make」フラグを使用することで、性能の低下を生じることなく、必要に応じて保護メカニズムを含まないプログラムを構築することができる。
本開示の主題の種々の態様を理解するための背景情報として、図27および以下の説明において、本開示の主題の種々の態様を実現可能な好適な環境を概説する。図27は、本開示の種々の態様を実現するための好適な動作環境2700を示す図である。動作環境2700は、コンピュータ2712を含むことができる。また、コンピュータ2712は、処理ユニット2714、システムメモリ2716、およびシステムバス2718を含むことができる。システムバス2718は、システムメモリ2716を含むシステムコンポーネントを処理ユニット2714に接続する。処理ユニット2714は、種々の入手可能なプロセッサのうちの任意のものとすることができる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャを処理ユニット2714として採用してもよい。システムバス2718は、複数種類のバス構造のうち任意のものとすることができる。これらのバス構造は、インダストリスタンダードアーキテクチャ(ISA)、マイクロチャネルアーキテクチャ(MSA)、拡張ISA(EISA)、インテリジェントドライブエレクトロニクス(IDE)、VESAローカルバス(VLB)、ペリフェラルコンポーネントインターコネクト(PCI)、カードバス、ユニバーサルシリアルバス(USB)、アドバンストグラフィックスポート(AGP)、Firewire(IEEE1394)、および小型コンピュータシステムインタフェース(SCSI)を含む種々の利用可能なバスアーキテクチャのうち、任意のものを使用したメモリバスもしくはメモリコントローラ、周辺バスもしくは外部バス、もしくはローカルバスまたはこれらの組み合わせを含む。また、システムメモリ2716は、揮発性メモリ2720および不揮発性メモリ2722を含むことができる。起動時などにコンピュータ2712内の要素間で情報を転送するための基本ルーチンを含む基本入出力システム(BIOS)は、不揮発性メモリ2722に記憶される。一例として、不揮発性メモリ2722は、ROM、プログラマブルROM(PROM)、電気的プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM)、フラッシュメモリ、または不揮発性RAM(たとえば、強誘電体RAM(FeRAM))を含むことができる。また、揮発性メモリ2720は、外部キャッシュメモリとして機能するRAMを含むことができる。一例として、RAMは、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、シンクロナスDRAM(SDRAM)、ダブルデータレートSDRAM(DDR SDRAM)、エンハンストSDRAM(ESDRAM)、シンクリンクDRAM(SLDRAM)、ダイレクトラムバスRAM(DRRAM)、ダイレクトラムバスダイナミックRAM(DRDRAM)、およびラムバスダイナミックRAMなどの多くの形態で利用可能である。
コンピュータ2712はさらに、取り外し可能/取り外し不能かつ揮発性/不揮発性コンピュータ記憶媒体を含むことができる。例えば、図27にはディスクストレージ2724が示されている。また、ディスクストレージ2724は例えば、磁気ディスクドライブ、フロッピーディスクドライブ、テープドライブ、Jazドライブ、Zipドライブ、LS-100ドライブ、フラッシュメモリカード、またはメモリスティックなどのデバイスを含むことができる。また、ディスクストレージ2724は例えば、光ディスクドライブを含む他の記憶媒体と独立して、またはそれと組み合わせて用いられる記憶媒体を含むことができる。光ディスクドライブは、例えばCD-ROM装置、CD-Rドライブ、CD-RWドライブ、またはDVD-ROMドライブである。ディスクストレージ2724とシステムバス2718との接続を容易にするために、インタフェース2726のような取り外し可能または取り外し不能インタフェースが通常用いられる。また図27には、ユーザと、好適な動作環境2700における基本的なコンピュータリソースとの間の仲介として機能するソフトウェアが図示されている。かかるソフトウェアは、たとえば、オペレーティングシステム2728を含むことができる。オペレーティングシステム2728は、ディスクストレージ2724に記憶することができ、コンピュータ2712のリソースの制御と割り当てを行う。システムアプリケーション2730は、プログラムモジュール2732およびプログラムデータ2734(これらは例えば、システムメモリ2716またはディスクストレージ2724に記憶される)を介して、オペレーティングシステム2728によるリソース管理を利用する。なお、本開示は、種々のオペレーティングシステムまたはオペレーティングシステムの組み合わせによって実現可能である。ユーザは、入力装置2736を介してコンピュータ2712にコマンドまたは情報を入力する。入力装置2736の一例としては、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナ、TVチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラなどが挙げられる。これらおよび他の入力装置は、インタフェースポート2738を介してシステムバス2718によって処理ユニット2714に接続される。インタフェースポート2738の例としては、シリアルポート、パラレルポート、ゲームポート、USBなどが挙げられる。出力装置2740は、入力装置2736と同じ種類のポートのうちのいくつかを使用する。したがって、例えばUSBポートを使用して、コンピュータ2712に入力を行ったり、コンピュータ2712から出力装置2740に情報を出力したりすることができる。出力アダプタ2742が図示されているが、これは他の出力装置2740の中でも、モニタ、スピーカ、プリンタのような一部の出力装置2740については専用のアダプタが必要であることを示すものである。出力アダプタ2742は例えば、出力装置2740とシステムバス2718との間の接続手段として機能するビデオカードおよびサウンドカードを含む。なお、他の装置もしくは装置のシステムまたはその組み合わせによって、リモートコンピュータ2744のような、入力機能および出力機能の両方が提供される。
コンピュータ2712は、リモートコンピュータ2744などの1つ以上のリモートコンピュータへの論理接続を用いるネットワーク環境において動作することができる。リモートコンピュータ2744は、コンピュータ、サーバ、ルータ、ネットワークPC、ワークステーション、マイクロプロセッサベースの機器、ピア装置やその他の一般的なネットワークノードなどとすることができ、一般的には、コンピュータ2712について上述した要素の多くまたはすべてを含むこともできる。図においては、簡略化のためにメモリストレージ装置2746のみをリモートコンピュータ2744と共に示している。リモートコンピュータ2744はネットワークインタフェース2748を介してコンピュータ2712に論理的に接続され、次いで通信接続2750を介して物理的に接続される。ネットワークインタフェース2748は、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、セルラーネットワークなどの有線もしくは無線またはその両方の通信ネットワークを含む。LAN技術は、ファイバ分散データインタフェース(FDDI)、銅線分散データインタフェース(CDDI)、イーサネット(登録商標)、トークンリングなどを含む。WAN技術は、一例として、ポイントツーポイントリンク、回線交換網(例えば、サービス総合デジタル網(ISDN)とその変形)、パケット交換網、およびデジタル加入者線(DSL)を含む。通信接続2750は、ネットワークインタフェース2748をシステムバス2718に接続するために使用されるハードウェア/ソフトウェアを指す。図中、通信接続2750は例示としてコンピュータ2712の内部に図示しているが、コンピュータ2712の外部にあってもよい。一例に過ぎないが、ネットワークインタフェース2748に接続するためのハードウェア/ソフトウェアは、通常の電話回線用モデム、ケーブルモデム、DSLモデムなどのモデム、ISDNアダプタおよびイーサネットカードなどの内部技術および外部技術を含むことができる。
本発明は、任意の可能な技術詳細レベルで統合されたシステム、方法もしくはコンピュータプログラム製品またはそれらの組み合せとすることができる。コンピュータプログラム製品は、プロセッサに本発明の態様を実行させるためのコンピュータ可読プログラム命令を記憶したコンピュータ可読記憶媒体を含むことができる。コンピュータ可読記憶媒体は、命令実行装置によって使用される命令を保持し、記憶することができる有形の装置とすることができる。コンピュータ可読記憶媒体は、一例として、電子記憶装置、磁気記憶装置、光学記憶装置、電磁記憶装置、半導体記憶装置またはこれらの適切な組み合わせとすることができる。コンピュータ可読記憶媒体のより具体的な一例としては、ポータブルコンピュータディスケット、ハードディスク、RAM、ROM、EPROM(またはフラッシュメモリ)、SRAM、CD-ROM、DVD、メモリスティック、フロッピーディスク、パンチカードまたは溝内の隆起構造などに命令を記録した機械的に符号化された装置、およびこれらの適切な組み合せが挙げられる。本明細書で使用されるコンピュータ可読記憶装置は、電波もしくは他の自由に伝播する電磁波、導波管もしくは他の伝送媒体を介して伝播する電磁波(例えば、光ファイバケーブルを通過する光パルス)、またはワイヤを介して送信される電気信号のような、一過性の信号それ自体として解釈されるべきではない。
本明細書に記載のコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピュータ装置/処理装置へダウンロード可能である。あるいは、ネットワーク(例えばインターネット、LAN、WANもしくはワイヤレスネットワークまたはこれらの組み合わせ)を介して、外部コンピュータまたは外部記憶装置へダウンロード可能である。ネットワークは、銅製伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータもしくはエッジサーバまたはこれらの組み合わせを備えることができる。各コンピュータ装置/処理装置内のネットワークアダプタカードまたはネットワークインタフェースは、ネットワークからコンピュータ可読プログラム命令を受信し、当該コンピュータ可読プログラム命令を、各々のコンピュータ装置/処理装置におけるコンピュータ可読記憶媒体に記憶するために転送する。本発明の動作を実施するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、集積回路用構成データ、または、スモールトークやC++などのオブジェクト指向プログラミング言語、および「C」プログラミング言語や類似のプログラミング言語などの手続き型プログラミング言語を含む、1つ以上のプログラミング言語の任意の組み合わせで記述されたソースコードもしくはオブジェクトコードのいずれかとすることができる。コンピュータ可読プログラム命令は、スタンドアロン型ソフトウェアパッケージとして完全にユーザのコンピュータ上で、または部分的にユーザのコンピュータ上で実行可能である。あるいは、部分的にユーザのコンピュータ上でかつ部分的にリモートコンピュータ上で、または、完全にリモートコンピュータもしくはサーバ上で実行可能である。後者の場合、リモートコンピュータは、LANやWANを含む任意の種類のネットワークを介してユーザのコンピュータに接続してもよいし、外部コンピュータに(例えば、インターネットサービスプロバイダを使用してインターネットを介して)接続してもよい。いくつかの実施形態において、例えばプログラマブル論理回路、フィールドプログラマブルゲートアレイ(FPGA)、プログラマブル論理アレイ(PLA)を含む電子回路は、本発明の態様を実行する目的で当該電子回路をカスタマイズするために、コンピュータ可読プログラム命令の状態情報を利用することによって、コンピュータ可読プログラム命令を実行することができる。
本発明の各態様は、本明細書において、本発明の実施形態に係る方法、装置(システム)、およびコンピュータプログラム製品のフローチャートもしくはブロック図またはその両方を参照して説明されている。フローチャートもしくはブロック図またはその両方における各ブロック、および、フローチャートもしくはブロック図またはその両方における複数のブロックの組み合わせは、コンピュータ可読プログラム命令によって実行可能である。上記のコンピュータ可読プログラム命令は、機械を生産するために、汎用コンピュータ、専用コンピュータ、または他のプログラマブルデータ処理装置のプロセッサに提供することができる。これにより、かかるコンピュータまたは他のプログラマブルデータ処理装置のプロセッサを介して実行されるこれらの命令が、フローチャートもしくはブロック図またはその両方における1つ以上のブロックにて特定される機能/動作を実行するための手段を創出する。上記のコンピュータ可読プログラム命令はさらに、コンピュータ、プログラマブルデータ処理装置もしくは他の装置またはこれらの組み合わせに対して特定の態様で機能するよう命令可能なコンピュータ可読記憶媒体に記憶することができる。これにより、命令が記憶された当該コンピュータ可読記憶媒体は、フローチャートもしくはブロック図またはその両方における1つ以上のブロックにて特定される機能/動作の態様を実行するための命令を含む製品を構成する。また、コンピュータ可読プログラム命令を、コンピュータ、他のプログラマブル装置、または他の装置にロードし、一連の動作を当該コンピュータ、他のプログラマブル装置、または他の装置上で実行させることにより、コンピュータ実行プロセスを生成することができる。これにより、当該コンピュータ、他のプログラマブル装置、または他の装置上で実行される命令が、フローチャートもしくはブロック図またはその両方における1つ以上のブロックにて特定される機能/動作を実行する。
本開示の図面におけるフローチャートおよびブロック図は、本発明の種々の実施形態に係るシステム、方法およびコンピュータプログラム製品の可能な実装形態のアーキテクチャ、機能性、および動作を示している。この点に関して、フローチャートまたはブロック図における各ブロックは、特定の論理機能を実行するための1つ以上の実行可能な命令を含む、命令のモジュール、セグメント、または部分を表すことができる。他の一部の実装形態において、ブロック内に示した機能は、各図に示す順序とは異なる順序で実行してもよい。例えば、連続して示される2つのブロックは、実際には、関係する機能に応じて、略同時に実行してもよいし、場合により逆順で実行してもよい。なお、ブロック図もしくはフローチャートまたはその両方における各ブロック、および、ブロック図もしくはフローチャートまたはその両方における複数のブロックの組み合わせは、特定の機能または動作を行う専用ハードウェアベースのシステムによって、または専用ハードウェアとコンピュータ命令との組み合わせによって実行可能である。
以上、1つ以上のコンピュータ上で動作するコンピュータプログラム製品のコンピュータ実行可能命令との一般的な関連の中で本主題を説明してきたが、当業者であれば理解できるように、本開示は、他のプログラムモジュールと組み合わせて実施することもできる。プログラムモジュールは一般に、特定のタスクを実行する、もしくは特定の抽象データ型を実装する、またはその両方を行うルーチン、プログラム、コンポーネント、データ構造などを含む。さらに、当業者であれば理解できるように、本発明のコンピュータ実装方法は、他のコンピュータシステム構成において実施可能である。これらのコンピュータシステム構成には、コンピュータ、携帯型コンピュータ装置(例えば、PDAや電話)、マイクロプロセッサベースのまたはプログラム可能な消費者向け電子機器または産業用電子機器の他、シングルプロセッサまたはマルチプロセッサのコンピュータシステム、ミニコンピュータ装置、メインフレームコンピュータなどが含まれる。例示した態様は、通信ネットワークを介してリンクされたリモート処理装置によってタスクが実行される分散型コンピュータ環境において実施することもできる。ただし、本開示の態様のすべてではなくとも一部は、スタンドアロンのコンピュータ上で実施することができる。分散型コンピュータ環境において、プログラムモジュールは、ローカルおよびリモート両方のメモリ記憶装置に記憶することができる。例えば、1つ以上の実施形態において、コンピュータ実行可能コンポーネントはメモリから実行することができる。当該メモリは、1つ以上の分散メモリユニットを含むか、またはそれらで構成することができる。本明細書において、「メモリ」および「メモリユニット」という用語は交換可能である。さらに、本明細書に記載の1つ以上の実施形態は、コンピュータ実行可能コンポーネントのコードを分散方式で実行することができ、例えば、複数のプロセッサが組み合わさってまたは協働して、1つ以上の分散メモリユニットからコードを実行することができる。本明細書において、「メモリ」という用語は、1つの場所における単一のメモリもしくはメモリユニット、または1つ以上の場所における複数のメモリもしくはメモリユニットを包含することができる。
本明細書において、「コンポーネント」、「システム」、「プラットフォーム」、「インタフェース」などの用語は、コンピュータ関連のエンティティもしくは1つ以上の特定の機能を有する動作機械に関連するエンティティを指すか、もしくはこれらを含むか、またはその両方として用いることができる。本明細書で開示するエンティティは、ハードウェア、ハードウェアとソフトウェアの組み合せ、ソフトウェア、または実行中のソフトウェアのいずれかとすることができる。コンポーネントは一例として、プロセッサ上で動作するプロセス、プロセッサ、オブジェクト、実行ファイル、実行スレッド、プログラム、もしくはコンピュータまたはこれらの組み合わせとすることができる。例えば、サーバ上で動作するアプリケーションおよび当該サーバの両方を、1つのコンポーネントとすることができる。プロセスもしくは実行スレッドまたはその両方に、1つ以上のコンポーネントが存在することができる。そして、コンポーネントは、1台のコンピュータに局所化するか、もしくは2台以上のコンピュータに分散するか、またはその両方とすることができる。他の例として、それぞれのコンポーネントは、種々のデータ構造が記憶された種々のコンピュータ可読媒体から実行することができる。これらのコンポーネントは、1つ以上のデータパケットを有する信号に従うなどして、ローカルもしくはリモートまたはその両方のプロセスを介して通信することができる(例えば、一のコンポーネントからのデータは、ローカルシステム内で、分散システム内で、もしくは他のシステムとのネットワーク(インターネットなど)を介して、またはこれらの組み合わせによって、信号を介して他のコンポーネントと相互作用する)。さらに他の例として、コンポーネントは、プロセッサによって実行されるソフトウェアまたはファームウェアアプリケーションによって動作する電気回路または電子回路によって動作する機械部品によって実現される、特定の機能を有する装置とすることができる。かかる場合、プロセッサは装置の内部にあっても外部にあってもよく、ソフトウェアまたはファームウェアアプリケーションの少なくとも一部を実行することができる。さらに他の例として、コンポーネントは、機械部品なしで電子コンポーネントを介して特定の機能を実現する装置とすることができる。ここで、電子コンポーネントは、当該電子コンポーネントの機能の少なくとも一部を付与するソフトウェアまたはファームウェアを実行するためのプロセッサまたは他の手段を含むことができる。一の態様において、コンポーネントは、仮想マシンを介して、(例えば、クラウドコンピューティングシステム内で)電子コンポーネントをエミュレートすることができる。
さらに、「または/もしくは/あるいは(or)」という用語は、排他的な意味ではなく、包含的な意味で用いられるものとする。すなわち、別段の指定がない限り、または文脈から明らかでない限り、「XがAまたはBを使用する」と言った場合、自然な包含的置換のいずれかを意味するものとする。すなわち、「XがAを使用する」、「XがBを使用する」、または「XがAおよびBの両方を使用する」場合、これらの例はいずれも「XがAまたはBを使用する」に当てはまる。さらに、本明細書および添付図面で使用する冠詞「a」および「an」(「ある/1つの/一の」)は、別段の指定がない限り、または文脈から単数を意味していることが明らかでない限り、概して「1つまたは複数」を意味すると解釈されるべきである。また、本明細書において、「例(example)」や「例示的な(exemplary)」という用語は、例、事例、または例示として提供される内容であることを意味するために用いられる。ここで断っておくが、本明細書に開示する主題はかかる例によって限定されない。さらに、「例」や「例示的」なものとして本明細書に記載したいかなる態様または設計も、必ずしも他の態様または設計よりも好ましいまたは有利なものであると解釈すべきではなく、当業者に公知の同等の例示的な構造および技術を排除することを意図するものでもない。
本明細書で使用される「プロセッサ」という用語は、例えばシングルコアプロセッサ、ソフトウェアマルチスレッド実行機能を有するシングルプロセッサ、マルチコアプロセッサ、ソフトウェアマルチスレッド実行機能を有するマルチコアプロセッサ、ハードウェアマルチスレッド技術を有するマルチコアプロセッサ、並列プラットフォーム、および分散共有メモリを有する並列プラットフォームを含む、実質的にいかなる種類のコンピュータ処理ユニットまたは装置をも意味することができる。さらに、プロセッサは、本明細書に記載の機能を実行するように設計された集積回路、特定用途向け集積回路(ASIC)、デジタル信号プロセッサ(DSP)、フィールドプログラマブルゲートアレイ(FPGA)、プログラマブルロジックコントローラ(PLC)、複合プログラマブルロジックデバイス(CPLD)、ディスクリートゲートもしくはトランジスタロジック、ディスクリートハードウェアコンポーネント、またはこれらの任意の組み合わせを意味することができる。さらに、プロセッサは、空間使用量を最適化するかまたはユーザ機器性能を向上させるために、例えば分子および量子ドットに基づくトランジスタや、スイッチ、ゲートなどのナノスケールアーキテクチャを利用することができる。プロセッサは、コンピュータ処理ユニットの組み合わせとして実装することもできる。本開示において、「ストア(store)」、「ストレージ」、「データストア(data store)」、「データストレージ」、「データベース」などの用語、ならびにコンポーネントの動作および機能に関係するほぼすべての他の情報記憶コンポーネントに関する用語は、「メモリコンポーネント」、「メモリ」内に具体化されるエンティティ、またはメモリを構成するコンポーネントを意味するために使用される。なお、本明細書に記載のメモリもしくはメモリコンポーネントまたはその両方は、揮発性メモリまたは不揮発性メモリのいずれでもよく、または、揮発性および不揮発性メモリの両方を含むことができる。一例として、不揮発性メモリは、ROM、プログラマブルROM(PROM)、電気的プログラマブルROM(EPROM)、電気的消去可能ROM(EEPROM)、フラッシュメモリ、または不揮発性RAM(たとえば、強誘電体RAM(FeRAM))を含むことができる。揮発性メモリは、例えば外部キャッシュメモリとして機能することができるRAMを含むことができる。一例として、RAMは、シンクロナスRAM(SRAM)、ダイナミックRAM(DRAM)、シンクロナスDRAM(SDRAM)、ダブルデータレートSDRAM(DDR SDRAM)、エンハンストSDRAM(ESDRAM)、シンクリンクDRAM(SLDRAM)、ダイレクトラムバスRAM(DRRAM)、ダイレクトラムバスダイナミックRAM(DRDRAM)、およびラムバスダイナミックRAM(RDRAM)などの多くの形態で利用可能である。さらに、本開示のシステムまたはコンピュータ実装方法におけるメモリコンポーネントは、これらおよび任意の他の適切な種類のメモリを含むものとするが、それに限定されるものではない。
上記の説明には、システムおよびコンピュータ実装方法の単なる例が含まれている。当然ながら、本開示を説明するにあたり、コンポーネントまたはコンピュータ実装方法について考え得る全ての組み合わせを説明することは不可能であるが、当業者にとっては自明なように、本開示に対してさらなる組み合わせや置換が多数可能である。さらに、「含む(include)」、「有する/備える(have)」、「所有する(possess)」などの用語が発明の詳細な説明、特許請求の範囲、付録、および図面において使用される場合、かかる用語は、「含む(comprising)」が請求項において移行句として使用される場合の解釈と同様に、包含的な意味を持つものとする。
本発明の種々の実施形態を例示として説明してきたが、網羅的であることや、これらの実施形態に限定することを意図したものではない。当業者には明らかなように、記載した各実施形態の範囲および要旨から逸脱することなく、多くの変更および変形が可能である。本明細書で用いられる用語は、各実施形態の原理、実際の用途、もしくは市場で確認される技術に対する技術的な改善を最もよく説明するために、または、当業者が本明細書に開示する各実施形態を理解できるように選択されたものである。

Claims (24)

  1. プロセッサを含むシステムであって、
    前記プロセッサは、非一時的なコンピュータ可読媒体に記憶されたコンピュータ実行可能コンポーネントを実行し、
    前記コンピュータ実行可能コンポーネントは、
    オブジェクトがメモリに割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てるエントリコンポーネントと、
    オブジェクトアドレスの未使用ビットを転用して、前記テーブルのエントリへのインデックスを格納する転用コンポーネントと、
    を含む、システム。
  2. アドレス内のインデックスビットを用いて前記境界情報にアクセスすることによって、ロード命令およびストア命令に対してハードウェアで境界チェックを実行するチェックコンポーネントをさらに含む、
    請求項1に記載のシステム。
  3. 後続のオブジェクトアドレスが割り当てステートメントまたはポインタ演算を介して導出される際に、前記インデックスを自動的に伝達する伝達コンポーネントをさらに含む、
    請求項1に記載のシステム。
  4. 前記チェックコンポーネントは、配列の境界をチェックする、
    請求項2に記載のシステム。
  5. 前記チェックコンポーネントは、配列参照が境界内であるか境界外であるかを判定し、境界外の配列参照の発生を軽減する、
    請求項2に記載のシステム。
  6. 前記転用コンポーネントは、前記オブジェクトアドレス内の未使用ビットを用いて、アクセス可能なメモリアドレスの範囲を追跡する、
    請求項1に記載のシステム。
  7. 前記伝達コンポーネントは、前記オブジェクトアドレスが割り当てステートメントにコピーされる際に、未使用ビットで追加の情報を伝達する、
    請求項3に記載のシステム。
  8. 前記伝達コンポーネントは、前記オブジェクトアドレスが関数呼び出しの引数として渡される際に、未使用ビットで追加の情報を伝達する、
    請求項3に記載のシステム。
  9. 前記伝達コンポーネントは、前記オブジェクトアドレスがアドレスの計算に使用される際に、未使用ビットで追加の情報を伝達する、
    請求項3に記載のシステム。
  10. アドレスにおけるインデックスビットとアドレスビットとの間に、保護ビットが介在する、
    請求項1に記載のシステム。
  11. 前記テーブルに格納される前記境界情報を管理することは、メモリ割り当て関数またはメモリ解放ライブラリ関数に対して変更を行うことを含む、
    請求項1に記載のシステム。
  12. アプリケーションが前記テーブルのサイズを超えるアクティブオブジェクト数を含む場合、または当該アクティブオブジェクト数をサポートするために必要なインデックスビットの数が、割り当てられたインデックスビットの数を超える場合、前記境界情報のサブセットがオーバーフローテーブルに格納される、
    請求項1に記載のシステム。
  13. 前記オーバーフローテーブルを示す値を含むインデックスビットがアドレスに含まれている場合、当該アドレスを用いて前記境界情報のサブセット内の前記境界情報にアクセスすることによって、ロード命令およびストア命令に対してハードウェアで境界チェックを実行するチェックコンポーネントをさらに含む、
    請求項12に記載のシステム。
  14. コンピュータ実装方法であって、
    オブジェクトがメモリに割り当てられた際に、プロセッサにより、境界情報を格納するためのテーブルにエントリを割り当てることと、
    プロセッサにより、オブジェクトアドレスの未使用ビットを転用して、前記テーブルのエントリへのインデックスを格納することと、
    を含む、方法。
  15. プロセッサにより、アドレス内のインデックスビットを用いて前記境界情報にアクセスすることによって、ロード命令およびストア命令に対してハードウェアで境界チェックを実行することをさらに含む、
    請求項14に記載の方法。
  16. 後続のオブジェクトアドレスが割り当てステートメントまたはポインタ演算を介して導出される際に、プロセッサにより、前記インデックスを自動的に伝達することをさらに含む、
    請求項14に記載の方法。
  17. プロセッサにより、配列の境界をチェックすることをさらに含む、
    請求項15に記載の方法。
  18. プロセッサにより、配列参照が境界内であるか境界外であるかを判定することをさらに含む、
    請求項15に記載の方法。
  19. プロセッサにより、境界外の配列参照の発生を軽減することをさらに含む、
    請求項18に記載の方法。
  20. プロセッサにより、前記オブジェクトアドレス内の未使用ビットを用いて、アクセス可能なメモリアドレスの範囲を追跡することをさらに含む、
    請求項15に記載の方法。
  21. 前記オブジェクトアドレスが割り当てステートメントにコピーされる際に、プロセッサにより、未使用ビットで追加の情報を伝達することをさらに含む、
    請求項15に記載の方法。
  22. 前記オブジェクトアドレスが関数呼び出しの引数として渡される際に、プロセッサにより、未使用ビットで追加の情報を伝達することをさらに含む、
    請求項15に記載の方法。
  23. 前記オブジェクトアドレスがアドレスの計算に使用される際に、プロセッサにより、未使用ビットで追加の情報を伝達することをさらに含む、
    請求項15に記載の方法。
  24. プログラム命令が実装されたコンピュータ可読記憶媒体を含むコンピュータプログラム製品であって、当該プログラム命令はプロセッサによって実行可能であり、当該プロセッサに、
    オブジェクトが割り当てられた際に、境界情報を格納するためのテーブルにエントリを割り当てる機能と、
    オブジェクトアドレスの未使用ビットを転用して、前記テーブルのエントリへのインデックスを格納する機能と、
    を実行させる、コンピュータプログラム製品。
JP2021168826A 2020-10-15 2021-10-14 無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品(無効なメモリ参照に対する保護) Pending JP2022065654A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US17/071,257 US11429590B2 (en) 2020-10-15 2020-10-15 Protecting against invalid memory references
US17/071,257 2020-10-15

Publications (1)

Publication Number Publication Date
JP2022065654A true JP2022065654A (ja) 2022-04-27

Family

ID=78399510

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021168826A Pending JP2022065654A (ja) 2020-10-15 2021-10-14 無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品(無効なメモリ参照に対する保護)

Country Status (5)

Country Link
US (2) US11429590B2 (ja)
JP (1) JP2022065654A (ja)
CN (1) CN114371951A (ja)
DE (1) DE102021124623A1 (ja)
GB (1) GB2604201B (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11429590B2 (en) * 2020-10-15 2022-08-30 International Business Machines Corporation Protecting against invalid memory references
US11966331B2 (en) 2020-12-30 2024-04-23 International Business Machines Corporation Dedicated bound information register file for protecting against out-of-bounds memory references
US11983532B2 (en) 2020-12-30 2024-05-14 International Business Machines Corporation Optimize bound information accesses in buffer protection
US11997141B2 (en) * 2021-10-21 2024-05-28 Cisco Technology, Inc. Attestation and computer forensics based on universal references for hardware and/or software configurations
US20220222183A1 (en) * 2022-03-25 2022-07-14 Intel Corporation Tagless implicit integrity with multi-perspective pattern search
WO2023239463A1 (en) * 2022-06-06 2023-12-14 Microsoft Technology Licensing, Llc Hardware revocation engine for temporal memory safety

Family Cites Families (45)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS61228539A (ja) 1985-04-03 1986-10-11 Hitachi Ltd アドレス変換回路
US5546561A (en) 1991-02-11 1996-08-13 Intel Corporation Circuitry and method for selectively protecting the integrity of data stored within a range of addresses within a non-volatile semiconductor memory
US6370073B2 (en) 1998-10-01 2002-04-09 Monlithic System Technology, Inc. Single-port multi-bank memory system having read and write buffers and method of operating same
US6662268B1 (en) 1999-09-02 2003-12-09 International Business Machines Corporation System and method for striped mirror re-synchronization by logical partition rather than stripe units
US20030126591A1 (en) 2001-12-21 2003-07-03 Youfeng Wu Stride-profile guided prefetching for irregular code
US6910106B2 (en) * 2002-10-04 2005-06-21 Microsoft Corporation Methods and mechanisms for proactive memory management
US6981099B2 (en) 2002-12-16 2005-12-27 Sun Microsystems, Inc. Smart-prefetch
US8762694B1 (en) 2003-02-19 2014-06-24 Intel Corporation Programmable event-driven yield mechanism
US7634629B2 (en) 2005-12-19 2009-12-15 Intel Corporation Mechanism to control access to a storage device
US8468244B2 (en) 2007-01-05 2013-06-18 Digital Doors, Inc. Digital information infrastructure and method for security designated data and with granular data stores
US20090077097A1 (en) * 2007-04-16 2009-03-19 Attune Systems, Inc. File Aggregation in a Switched File System
US7730289B2 (en) 2007-09-27 2010-06-01 Faraday Technology Corp. Method for preloading data in a CPU pipeline
US7962729B2 (en) 2009-01-05 2011-06-14 International Business Machines Corporation Dynamic runtime range checking of different types on a register using upper and lower bound value registers for the register
US8635415B2 (en) 2009-09-30 2014-01-21 Intel Corporation Managing and implementing metadata in central processing unit using register extensions
KR101639672B1 (ko) * 2010-01-05 2016-07-15 삼성전자주식회사 무한 트랜잭션 메모리 시스템 및 그 동작 방법
US8949579B2 (en) 2010-10-04 2015-02-03 International Business Machines Corporation Ineffective prefetch determination and latency optimization
US9304898B2 (en) * 2011-08-30 2016-04-05 Empire Technology Development Llc Hardware-based array compression
US10191873B2 (en) * 2012-12-20 2019-01-29 Advanced Micro Devices, Inc. Method and apparatus for power reduction for data movement
US9569612B2 (en) * 2013-03-14 2017-02-14 Daniel Shawcross Wilkerson Hard object: lightweight hardware enforcement of encapsulation, unforgeability, and transactionality
US8977997B2 (en) * 2013-03-15 2015-03-10 Mentor Graphics Corp. Hardware simulation controller, system and method for functional verification
US9721086B2 (en) 2013-03-15 2017-08-01 Advanced Elemental Technologies, Inc. Methods and systems for secure and reliable identity-based computing
CN105814548B (zh) * 2014-07-14 2019-02-12 上海兆芯集成电路有限公司 具有使用不同编索引方案的主高速缓存器和溢出高速缓存器的高速缓存器系统
WO2016028293A1 (en) * 2014-08-20 2016-02-25 Landmark Graphics Corporation Optimizing computer hardware resource utilization when processing variable precision data
US9535613B2 (en) 2014-11-24 2017-01-03 Futurewei Technologies, Inc. Hardware and software methodologies for detecting illegal memory address of a memory access operation
US10162694B2 (en) 2015-12-21 2018-12-25 Intel Corporation Hardware apparatuses and methods for memory corruption detection
US10528476B2 (en) * 2016-05-24 2020-01-07 International Business Machines Corporation Embedded page size hint for page fault resolution
US10198335B2 (en) 2016-09-23 2019-02-05 Intel Corporation Detecting root causes of use-after-free memory errors
US20180095720A1 (en) 2016-09-30 2018-04-05 Intel Corporation Storage device with fine grained search capability
US11601523B2 (en) 2016-12-16 2023-03-07 Intel Corporation Prefetcher in multi-tiered memory systems
GR20170100067A (el) * 2017-02-16 2018-10-31 Arm Limited Προβλεψη χρησης τομεων κρυφης μνημης
US20180255589A1 (en) * 2017-03-03 2018-09-06 Qualcomm Incorporated Random access request regulation techniques for wireless stations
WO2018176339A1 (en) 2017-03-30 2018-10-04 Intel Corporation Methods and apparatus to protect memory from buffer overflow and/or underflow
US10706164B2 (en) 2017-09-29 2020-07-07 Intel Corporation Crypto-enforced capabilities for isolation
US10761970B2 (en) 2017-10-20 2020-09-01 International Business Machines Corporation Computerized method and systems for performing deferred safety check operations
GB2572151B (en) 2018-03-19 2020-07-08 Advanced Risc Mach Ltd An apparatus and method for storing bounded pointers
US20190303263A1 (en) * 2018-03-30 2019-10-03 Kermin E. Fleming, JR. Apparatus, methods, and systems for integrated performance monitoring in a configurable spatial accelerator
US20190356412A1 (en) * 2018-05-16 2019-11-21 Qualcomm Incorporated Fast termination of multilane double data rate transactions
EP3584946A1 (en) * 2018-06-19 2019-12-25 Fronius International GmbH A photovoltaic module level monitoring system
US10691374B2 (en) * 2018-07-24 2020-06-23 Salesforce.Com, Inc. Repeatable stream access by multiple components
US11256624B2 (en) * 2019-05-28 2022-02-22 Micron Technology, Inc. Intelligent content migration with borrowed memory
US20200379809A1 (en) * 2019-05-28 2020-12-03 Micron Technology, Inc. Memory as a Service for Artificial Neural Network (ANN) Applications
US11868273B2 (en) 2019-06-29 2024-01-09 Intel Corporation Memory protection with hidden inline metadata to indicate data type
US11429590B2 (en) 2020-10-15 2022-08-30 International Business Machines Corporation Protecting against invalid memory references
US11966331B2 (en) 2020-12-30 2024-04-23 International Business Machines Corporation Dedicated bound information register file for protecting against out-of-bounds memory references
US11983532B2 (en) 2020-12-30 2024-05-14 International Business Machines Corporation Optimize bound information accesses in buffer protection

Also Published As

Publication number Publication date
GB2604201A (en) 2022-08-31
US20220358116A1 (en) 2022-11-10
DE102021124623A1 (de) 2022-04-21
US11966382B2 (en) 2024-04-23
GB2604201B (en) 2023-02-15
US11429590B2 (en) 2022-08-30
US20220121644A1 (en) 2022-04-21
GB202113829D0 (en) 2021-11-10
CN114371951A (zh) 2022-04-19

Similar Documents

Publication Publication Date Title
Oleksenko et al. Intel mpx explained: A cross-layer analysis of the intel mpx system stack
JP2022065654A (ja) 無効なメモリ参照に対する保護のためのシステム、コンピュータ実装方法、およびコンピュータプログラム製品(無効なメモリ参照に対する保護)
US10810309B2 (en) Method and system for detecting kernel corruption exploits
Duck et al. Stack Bounds Protection with Low Fat Pointers.
CN109002706B (zh) 一种基于用户级页表的进程内数据隔离保护方法和系统
Nagarakatte et al. Watchdoglite: Hardware-accelerated compiler-based pointer checking
Oleksenko et al. Intel MPX explained: An empirical study of intel MPX and software-based bounds checking approaches
KR20080072952A (ko) 메모리 페이지를 프로그램과 연관시키기 위한 페이지컬러링
US9804975B2 (en) Hardware-enforced prevention of buffer overflow
US11138128B2 (en) Controlling guard tag checking in memory accesses
Saileshwar et al. Heapcheck: Low-cost hardware support for memory safety
US20230236925A1 (en) Tag checking apparatus and method
Lee et al. Securing gpu via region-based bounds checking
US20230409494A1 (en) Technique for constraining access to memory using capabilities
JP2021512405A (ja) メモリ・アクセスにおける保護タグ・チェックの制御
Lei et al. Put your memory in order: Efficient domain-based memory isolation for wasm applications
Seo et al. ZOMETAG: Zone-based memory tagging for fast, deterministic detection of spatial memory violations on ARM
De et al. HeapSafe: securing unprotected heaps in RISC-V
US11625171B2 (en) Hardware support for memory safety with an overflow table
US11822652B1 (en) Prime and probe attack mitigation
JP7369720B2 (ja) アクションをトリガするための装置及び方法
Santos et al. Hati: Hardware assisted thread isolation for concurrent c/c++ programs
Kim et al. RV-CURE: A RISC-V Capability Architecture for Full Memory Safety
TW202340955A (zh) 使用能力約束記憶體存取之技術
CN117222990A (zh) 用于使用能力约束对存储器的访问的技术

Legal Events

Date Code Title Description
RD16 Notification of change of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7436

Effective date: 20211208

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20220518

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20240319