(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022105981
(43)【公開日】2022-07-15
(54)【発明の名称】帯域内フォールトインジェクション検出機能を備えたプロセッサ
(51)【国際特許分類】
G06F 21/55 20130101AFI20220708BHJP
G06F 9/38 20060101ALI20220708BHJP
G06F 15/78 20060101ALI20220708BHJP
G06F 11/10 20060101ALI20220708BHJP
【FI】
G06F21/55 380
G06F9/38 380X
G06F15/78 516
G06F11/10 648
【審査請求】有
【請求項の数】25
【出願形態】OL
(21)【出願番号】P 2021180955
(22)【出願日】2021-11-05
(31)【優先権主張番号】17/141249
(32)【優先日】2021-01-05
(33)【優先権主張国・地域又は機関】US
(71)【出願人】
【識別番号】508197206
【氏名又は名称】新唐科技股▲ふん▼有限公司
(74)【代理人】
【識別番号】110000291
【氏名又は名称】弁理士法人コスモス国際特許商標事務所
(72)【発明者】
【氏名】ハーシュマン,ジヴ
【テーマコード(参考)】
5B013
5B062
【Fターム(参考)】
5B013EE09
5B062AA07
5B062AA08
5B062DD10
5B062JJ06
(57)【要約】
【課題】 マイクロプロセッサ回路内の帯域内エラー検出のための方法とシステムを提供する。
【解決手段】 プロセッサを保護するための装置であって、前記装置は、前記プロセッサによって処理されたコード命令を監視するように構成され、その1つ以上のコード命令は、1つ以上のエラー検出ビットを含む入力インターフェース、および前記エラー検出ビットを用いて前記プログラムコードのエラーを検出するように構成され、前記エラーの検出に応答して応答アクションを開始する保護回路を含む装置。
【選択図】
図1
【特許請求の範囲】
【請求項1】
プロセッサを保護するための装置であって、前記装置は、
前記プロセッサによって処理されたコード命令を監視するように構成され、その1つ以上のコード命令は、1つ以上のエラー検出ビットを含む入力インターフェース、および
前記エラー検出ビットを用いてプログラムコードのエラーを検出するように構成され、前記エラーの検出に応答して応答アクションを開始する保護回路を含む装置。
【請求項2】
前記エラーの検出では、前記保護回路は、フォールトインジェクション攻撃を検出するように構成される請求項1に記載の装置。
【請求項3】
前記エラー検出ビットは、前記コード命令の予約済みビット位置に挿入され、前記保護回路は、前記予約済みビット位置から前記エラー検出ビットを抽出するように構成される請求項1に記載の装置。
【請求項4】
前記エラー検出ビットが、前記コード命令の実行に影響を与えない事実上予約済みビット位置において前記コード命令に挿入され、前記保護回路は、前記事実上予約済みビット位置から前記エラー検出ビットを抽出するように構成される請求項1に記載の装置。
【請求項5】
前記エラー検出ビットが、(i)ジャンプオフセットを示すように指定されているが、(ii)前記プロセッサが無視するように構成されている、1つ以上のビット位置において1つ以上のジャンプ命令に挿入される請求項1に記載の装置。
【請求項6】
前記エラー検出ビットが、エラー検出のために前記プログラムコードに追加された1つ以上の専用コード命令に挿入され、前記保護回路は、前記専用コード命令を識別し、前記専用コード命令から前記エラー検出ビットを抽出するように構成される請求項1に記載の装置。
【請求項7】
前記保護回路は、前記コード命令内の前記エラー検出ビットの位置の定義を保持し、前記定義に従って前記コード命令から前記エラー検出ビットを抽出するように構成される請求項1に記載の装置。
【請求項8】
前記エラー検出ビットの所与のセットは、所与のコード命令の少なくとも一部を介して計算され、前記所与のコード命令に挿入される請求項1に記載の装置。
【請求項9】
前記エラー検出ビットの所与のセットは、前記プログラムコード内の複数の選択されたビットを介して計算され、少なくとも1つの前記選択されたビットおよび前記セット内の少なくとも1つの前記エラー検出ビットは、異なるコード命令に配置される請求項1に記載の装置。
【請求項10】
前記選択されたビットは、決定論的コードフローを有する前記プログラムコードのセクションに限定される請求項9に記載の装置。
【請求項11】
前記選択されたビットは、ジャンプ命令またはジャンプ宛先命令をトラバースしない前記プログラムコードのセクションに限定される請求項9に記載の装置。
【請求項12】
前記エラー検出ビットを、処理のために前記プロセッサに提供された前記コード命令に挿入するように構成された挿入回路をさらに含む請求項1に記載の装置。
【請求項13】
コード命令を含むプログラムコードをフェッチして実行するように構成され、その1つ以上のコード命令は1つ以上のエラー検出ビットを含む命令パイプライン、および
少なくとも前記コード命令内の前記エラー検出ビットを監視するように構成され、前記エラー検出ビットを用いて、前記プログラムコード内のエラーの検出に応答して応答アクションを開始する保護回路を含むプロセッサ。
【請求項14】
プロセッサを保護する方法であって、前記方法は、
前記プロセッサによって処理されたコード命令を監視するステップを含み、その1つ以上のコード命令は、1つ以上のエラー検出ビットを含むステップ、
前記エラー検出ビットを用いてプログラムコードのエラーを検出するステップ、および
前記エラーの検出に応答して応答アクションを開始するステップを含む方法。
【請求項15】
前記エラーを検出するステップは、フォールトインジェクション攻撃を検出するステップを含む請求項14に記載の方法。
【請求項16】
前記エラー検出ビットは、前記コード命令の予約済みビット位置に挿入され、前記コード命令の監視は、前記予約済みビット位置から前記エラー検出ビットを抽出するステップを含む請求項14に記載の方法。
【請求項17】
前記エラー検出ビットが、前記コード命令の実行に影響を与えない事実上予約済みビット位置において前記コード命令に挿入され、前記コード命令の監視は、前記事実上予約済みビット位置から前記エラー検出ビットを抽出するステップを含む請求項14に記載の方法。
【請求項18】
前記エラー検出ビットが、(i)ジャンプオフセットを示すように指定されているが、(ii)前記プロセッサが無視するように構成されている、1つ以上のビット位置において1つ以上のジャンプ命令に挿入される請求項14に記載の方法。
【請求項19】
前記エラー検出ビットが、エラー検出のために前記プログラムコードに追加された1つ以上の専用コード命令に挿入され、前記コード命令の監視は、前記保護回路は、前記専用コード命令を識別し、前記専用コード命令から前記エラー検出ビットを抽出するステップを含む請求項14に記載の方法。
【請求項20】
前記コード命令の監視は、前記コード命令内の前記エラー検出ビットの位置の定義を保持し、前記定義に従って前記コード命令から前記エラー検出ビットを抽出するステップを含む請求項14に記載の方法。
【請求項21】
前記エラー検出ビットの所与のセットは、所与のコード命令の少なくとも一部を介して計算され、前記所与のコード命令に挿入される請求項14に記載の方法。
【請求項22】
前記エラー検出ビットの所与のセットは、前記プログラムコード内の複数の選択されたビットを介して計算され、少なくとも1つの前記選択されたビットおよび前記セット内の少なくとも1つの前記エラー検出ビットは、異なるコード命令に配置される請求項14に記載の方法。
【請求項23】
前記選択されたビットは、決定論的コードフローを有する前記プログラムコードのセクションに限定される請求項22に記載の方法。
【請求項24】
前記選択されたビットは、ジャンプ命令またはジャンプ宛先命令をトラバースしない前記プログラムコードのセクションに限定される請求項22に記載の方法。
【請求項25】
前記エラー検出ビットを、処理のために前記プロセッサに提供された前記コード命令に挿入するように構成された挿入回路をさらに含む請求項14に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、マイクロプロセッサに関するものであり、特に、マイクロプロセッサ回路内の帯域内エラー検出のための方法とシステムに関するものである。
【背景技術】
【0002】
フォールトインジェクション攻撃は、暗号回路などの安全な電子回路から情報にアクセス、分析、または抽出するように用いられる一連の技術である。フォールトインジェクション攻撃は通常、回路またはその一部に、攻撃者が回路またはそれが格納している情報に侵入するのをアシストするようにその論理状態を変え、その動作を変えさせることを含んでいる。フォールトインジェクション攻撃は、例えば、信号線に物理的に接触することによって、高出力レーザーまたは電磁パルスを照射することによって、または電源またはその他の外部インターフェースにグリッチを発生させることによって始められる可能性がある。フォールトインジェクション攻撃を検出および/または軽減するための様々な技術は当技術分野で知られている。
【発明の概要】
【発明が解決しようとする課題】
【0003】
マイクロプロセッサ回路内の帯域内エラー検出のための方法とシステムを提供する。
【課題を解決するための手段】
【0004】
本明細書に記載された実施形態は、プロセッサを保護するための装置を提供する。この装置は、入力インターフェースおよび保護回路を含む。入力インターフェースは、プロセッサによって処理されたコード命令を監視するように構成され、その1つ以上のコード命令は、1つ以上のエラー検出ビットを含む。保護回路は、エラー検出ビットを用いてプログラムコードのエラーを検出するように構成され、エラーの検出に応答して応答アクションを開始する。
【0005】
いくつかの実施形態では、エラーの検出では、保護回路は、フォールトインジェクション攻撃を検出するように構成される。一実施形態では、1つ以上のエラー検出ビットは、1つ以上のコード命令の予約済みビット位置に挿入され、保護回路は、予約済みビット位置からエラー検出ビットを抽出するように構成される。他の実施形態では、1つ以上のエラー検出ビットが、コード命令の実行に影響を与えない事実上予約済みビット位置において1つ以上のコード命令に挿入され、保護回路は、事実上予約済みビット位置からエラー検出ビットを抽出するように構成される。
【0006】
さらに他の実施形態では、1つ以上のエラー検出ビットが、(i)ジャンプオフセットを示すように指定されているが、(ii)プロセッサが無視するように構成されている、1つ以上のビット位置において1つ以上のジャンプ命令に挿入される。さらに他の実施形態では、1つ以上のエラー検出ビットが、エラー検出のためにプログラムコードに追加された1つ以上の専用コード命令に挿入され、保護回路は、専用コード命令を識別し、専用コード命令からエラー検出ビットを抽出するように構成される。
【0007】
開示された実施形態では、保護回路は、コード命令内のエラー検出ビットの位置の定義を保持し、その定義に従ってコード命令からエラー検出ビットを抽出するように構成される。例示的な実施形態では、1つ以上のエラー検出ビットの所与のセットは、所与のコード命令の少なくとも一部を介して計算され、所与のコード命令に挿入される。
【0008】
いくつかの実施形態では、1つ以上のエラー検出ビットの所与のセットは、プログラムコード内の複数の選択されたビットを介して計算され、少なくとも1つの選択されたビットおよびセット内の少なくとも1つのエラー検出ビットは、異なるコード命令に配置される。一実施形態では、複数の選択されたビットは、決定論的コードフローを有するプログラムコードのセクションに限定される。例示的な実施形態では、複数の選択されたビットは、ジャンプ命令またはジャンプ宛先命令をトラバースしないプログラムコードのセクションに限定される。
【0009】
いくつかの実施形態では、この装置は、1つ以上のエラー検出ビットを、処理のためにプロセッサに提供された1つ以上のコード命令に挿入するように構成された挿入回路をさらに含む。
【0010】
本発明の一実施形態による、命令パイプラインおよび保護回路を含むプロセッサがさらに提供される。命令パイプラインは、コード命令を含むプログラムコードをフェッチして実行するように構成され、その1つ以上のコード命令は1つ以上のエラー検出ビットを含む。保護回路は、少なくともコード命令内のエラー検出ビットを監視するように構成され、エラー検出ビットを用いて、プログラムコード内のエラーの検出に応答して応答アクションを開始する。
【0011】
本発明の一実施形態による、プロセッサを保護する方法も提供される。
この方法は、プロセッサによって処理されたコード命令を監視するステップを含み、その1つ以上のコード命令は、1つ以上のエラー検出ビットを含む。プログラムコードのエラーは、エラー検出ビットを用いて検出され、応答アクションがエラーの検出に応答して開始される。
【0012】
添付の図面とともに以下の詳細な説明及び実施例を検討することで、本発明をより完全に理解できる。
【図面の簡単な説明】
【0013】
【
図1】
図1は、本発明の実施形態による、安全なプロセッサを模式的に示すブロック図である。
【
図2】
図2は、本発明の実施形態による、プロセッサを保護するための方法を模式的に示すフローチャートである。
【発明を実施するための形態】
【0014】
本明細書で説明された本発明の実施形態は、コード命令で発生するビットエラーからプロセッサを保護するための方法および装置を提供する。コード命令のエラーは、例えば、プロセッサを異常に動作させることによって機密情報を引き出そうとするフォールトインジェクション攻撃によって引き起こされる可能性がある。しかしながら、一般的に、開示された技術は、任意の故意に(hostile)または意図的でない(innocent)のメカニズムによって引き起こされるエラーからプロセッサを保護するのに有用である。本文脈では、「プロセッサ」という用語は、中央処理装置(CPU)、マイクロコントローラユニット(MCU)、組み込みコントローラ、処理コアなどの様々なタイプのプロセッサを指す。
【0015】
プロセッサは通常、メモリからコード命令をフェッチし、フェッチされた命令を実行するように構成された命令パイプラインを含む。各コード命令は、プロセッサの特定の命令セットアーキテクチャ(ISA)から取り出され、ビットのグループとして表され、メモリに格納される。ビットは、命令のオペコード、および場合によっては1つ以上のオペランドを定義する。理解できるように、命令の任意のビットにおけるビットエラーは、予測できない結果を引き起こす可能性があり、非常に望ましくない。
【0016】
本発明のいくつかの実施形態は、プロセッサをビットエラーから保護する保護回路を提供する。保護回路は、1つ以上のコード命令に挿入された1つ以上のエラー検出ビットを監視する。エラー検出ビットを用いてプログラムコードのエラーを検出すると、保護回路は適切な応答動作を開始する。
【0017】
いくつかの実施形態では、保護回路は、プロセッサの不可欠な部分として実装される。代替の実施形態では、保護回路はプロセッサの外部にある。いくつかの実施形態では、エラー検出ビットは、例えば、コンパイラまたはポストプロセッサによって、予めコード命令内に挿入され、その結果、メモリに格納されたプログラムコードが、すでにエラー検出ビットを含むことになる。代替の実施形態では、エラー検出ビットは、実行時にコード命令内に挿入される。例えば、専用の挿入回路は、メモリからフェッチされてプロセッサに提供されたコード命令内にエラー検出ビットを挿入することができる。
【0018】
いくつかの実施形態では、エラー検出ビットは、プロセッサの特定のISAを変えることなく、且つ命令サイズ(「幅(width)」)を拡張することなく、命令内の既存のビット位置内に挿入される。この機能は、例えば、プロセッサの命令スループットを保持し、且つ従来のプロセッサとの後方互換性のためにも重要である。エラー検出ビットに既存のビット位置を再利用するための様々な技術が本明細書で説明される。
【0019】
いくつかの実施形態では、エラー検出は、命令ごとに独立して適用される。このような実施形態では、特定の命令のエラー検出ビットは、同じ命令の(一部または全ての)ビットを介してのみ計算される。他の実施形態では、エラー検出は、命令の境界にわたって、例えば、プログラムコードの全てのセクションにわたって適用される。いくつかの実施形態では、エラー検出のために、追加のコマンドがプログラムコード内に挿入される。
【0020】
本明細書に記載の実施形態は、主にパリティに言及しているが、任意の他の適切なエラー検出スキームを代替の実施形態で用いることもできる。エラー検出ビットは、簡潔にするために、本明細書ではエラー検出コード(EDC)ビットとも呼ばれる。
【0021】
開示された技術は、コード命令内のビットエラーからプロセッサを保護するための効率的で、且つコスト効率の高い手段を提供する。
【0022】
システム記述
図1は、本発明の実施形態による、安全なプロセッサ20を模式的に示すブロック図である。
図1の実施形態では、プロセッサ20は、プログラムコードをフェッチして実行する命令パイプライン24、プログラムコードを格納するメモリ32、およびプログラムコードで発生する可能性のあるビットエラーからプロセッサを保護する保護回路28を含む。
【0023】
命令パイプライン24は、複数のパイプラインステージを含む。この例では、命令パイプライン24は、フェッチユニット36、復号化ユニット40、および1つ以上の実行ユニット44を含む。フェッチユニット36はメモリ32からコード命令をフェッチする。復号化ユニット40は、フェッチされた命令を復号化する。実行ユニット44は、決定された命令を実行する。実行ユニット44は、例えば、1つ以上のロードストアユニット(LSU)、算術論理ユニット(ALU)、分岐ユニット、または任意の他の適切な実行ユニットを含み得る。
【0024】
保護回路28は、1つ以上のコード命令の所定のビット位置に挿入されたエラー検出ビット(EDCビットとも呼ばれる)を用いて、プログラムコード内のビットエラーを識別する。本文脈では、「プログラムコード(program code)のビットエラー」および「コード命令(cord instruction)のビットエラー」という用語は、プログラムコードがシステムまたはプロセッサに提供された後(例えば、元のプログラムコードがメモリ32に格納された後)に、故意にまたは意図的にでないにかかわらず、コードに導入されたエラーを指している。言い換えれば、開示された技術では、システムまたはプロセッサに提供された元のプログラムコード(例えば、メモリ32に元々格納されているプログラムコード)は、開示された技術によってエラーが軽減される。
【0025】
以下の説明は、主にパリティビットを例に挙げて説明している。パリティを用いるとき、各パリティビットは、コード命令の所定のビットセットを介して計算される。セット内の「1」の数が奇数の場合、パリティビットは「1」に設定され、セット内の「1」の数が偶数の場合、パリティビットは「0」に設定される。パリティチェックは、例えばハミングコードなどで複数のエラー複数のエラーを検出するように用いられることができる。CRC、ハッシュ、sha、マルチビットパリティ、または任意の他の適切なスキームなどの他のエラー検出スキームが用いられて、開示された技術を実施することができる。
【0026】
いくつかの実施形態では、メモリ32に格納されたプログラムコードは、すでにEDCビットを含む。例えば、EDCビットは、コンパイラによって、またはコンパイラによって生成されたコンパイル済みプログラムコードを処理するポストプロセッサによって挿入されることができる。他の実施形態では、メモリ32に格納されたプログラムコードは、EDCビットを含まず、プロセッサ20は、実行時にEDCビットをプログラムコードに挿入するEDC挿入回路48をさらに含む。一実施形態では、EDC挿入回路は、メモリ32と命令パイプライン24との間に一線状(in-line)に配置され、フェッチユニット36がメモリからフェッチする1つ以上のコード命令内にEDCビットを挿入する。
【0027】
図1の実施形態では、保護回路28は、インターフェース50を用いて命令パイプライン24を通過するコード命令を受信する。保護回路28は、通常、EDCスキームの定義、例えば、(i)コード命令内のEDCビットの位置、および(ii)EDCビットが計算される対応するビットの位置の定義を保持する。この定義を用いて、保護回路28は、EDCビットの値がプログラムコード内の1つ以上のビットエラーを示しているかどうかを識別する。
【0028】
本例では、EDCスキームはコード命令ごとに最大1つのEDCビットを定義する。コード命令がEDCビットを含んでいるとき、EDCビットは、命令の他の全てのビットを介して、または命令の所定の部分を介してパリティとして計算される。本例の保護回路28は、EDCスキームを指定するルックアップテーブル(LUT)52を含む。インターフェース50を介して監視される各命令には、LUT52は2つの出力、(i)この命令がEDCビットを含むかどうかを指定する「EDC存在(exist)」ビット、および(ii)EDCビットの位置を指定する「EDC位置(location)」ビットを生成する。代替の実施形態では、LUT52は、他のタイプのEDCスキームをサポートするための任意の他の適切な構造および出力を有することができる。さらに代替的に、EDCスキームは、LUTに限らず、任意の他の適切な回路またはデータ構造を用いて定義および格納されることもできる。
【0029】
保護回路28は、EDCビットがプログラムコード内の任意のビットエラーを示しているかどうかを検証するEDCチェック論理56をさらに含む。本例では、論理56は、インターフェース50を介して監視されたコード命令を入力として受け取る。各命令には、論理56は、LUT52によって生成された対応する「EDC存在」および「EDC位置」ビットを受け取る。所定の命令には、対応する「EDC存在」ビットが「1」の場合、論理56は、命令内の適切なビットのパリティ(奇数/偶数)を計算し、それを位置「EDC位置」のビットの値と比較する。命令の適切なビットを介して計算されたパリティ(奇数/偶数)が位置「EDC位置」のビットの値と一致しない場合、論理56は、命令でビットエラーが発生したと判断し、適切な応答動作を開始する。
【0030】
様々な実施形態では、論理56は、様々なタイプの応答動作を開始することができる。例えば、論理56は、フォールトインジェクション攻撃が進行中である可能性があることを示すアラート(alert)を発することができる。追加的または代替的に、論理56は、プロセッサまたはその一部を無効にする、プロセッサから機密データを消去する、または任意の他の適切な動作を開始することができる。
【0031】
図に見られるように、「EDC位置」ビットは、命令パイプライン24(通常、復号化ユニット40)にも提供される。いくつかの実施形態では、命令パイプライン24の構成要素(例えば、復号化ユニット40)は、EDCビットを無視するために、命令内のEDCビットの位置を知る必要がある。この点については、以下でさらに詳しく説明する。いくつかの実施形態では、論理56は、現在監視されている命令がジャンプ命令またはジャンプ先(jump-destination)命令(ジャンプが行われる「ターゲット(target)」または「ランディング(landing)」命令)であるときにアサートされる「ジャンプ(JUMP)」入力も受け取る。いくつかの実施形態では、論理56は、プロセッサで例外が発生したときにアサートされる「例外(EXCEPTION)」入力をさらに受け取る。「ジャンプ(JUMP)」入力は、EDCビットが個別にチェックされる個別のコードセクション間の境界を示す(marking)ために用いられる。「EXCEPTION」入力は、エラー検出チェックを一時的に無効または中断するために用いられる。これらの点についても、以下で詳しく説明する。
【0032】
図1に示されたプロセッサ20および保護回路28の構成は、単に概念を明確にするために示された例示的な構成である。代替的な実施形態では、任意の他の適切な構成が用いられ得る。
【0033】
例えば、
図1では、メモリ32はプロセッサの一部として示されている。代替的な実施形態では、メモリ32は、プロセッサの外部にあり、および/または適切な命令キャッシュを介してアクセス可能であり得る。
【0034】
他の例として、
図1では、保護回路28がプロセッサ20の一体化した部分として示されている。あるいは、保護回路28は、プロセッサの外部にあってもよい。同様に、EDC挿入回路48(用いられる場合)は、プロセッサの外部にあってもよい。従って、開示された技術は、外部回路を結合することにより、従来の汎用プロセッサとの使用に適している。
【0035】
さらに他の例として、
図1では、命令は、フェッチユニット36の出力から保護回路28に提供されているが、開示された技術は、この構成に限定されない。代替的な実施形態では、インターフェース50は、命令パイプライン24内の任意の他の適切なポイントから、例えば、復号化ユニット40の出力から、または実行ユニット44の出力からでも、命令を保護回路に転送することができる。一実施形態では、パイプラインの後の段階から命令を得る場合、保護回路28は、EDCビットを命令の他のビットと相関させるために、フェッチした後に命令の元のフォーマット(命令がメモリ32に格納されていたフォーマット)を再構築する必要があり得る。代替の実施形態では、コンパイラまたはポストプロセッサは、インターフェース50のサンプリングポイントにおける命令の構造を考慮しながら、EDCビットをコードに挿入することができる。この技術を用いるとき、命令パイプライン24の構成要素はそれらがインターフェース50に到達する前にEDCビットを破棄しないように注意する必要がある。
【0036】
命令パイプライン24の構造は、明確にするために非常に単純化されている。実際のプロセッサは、より複雑な命令パイプラインを含むことができる。さらに、開示された技術は、パイプライン化されたプロセッサと用いられることに限定されるものではなく、任意の他の適切なマイクロアーキテクチャを有するプロセッサと用いられることもできる。一般に、開示された技術を理解するために必須ではない構成要素は、明確にするために省略されている。
【0037】
様々な実施形態において、任意の開示された回路は、任意の適切なハードウェアまたはファームウェアを用いて、例えば、1つ以上の個別の部品、1つ以上の特定用途向け集積回路(ASIC)、および/または1つ以上のフィールドプログラマブルゲートアレイ(FPGA)を用いて実装され得る。
【0038】
いくつかの実施形態では、保護されているプロセッサは、本明細書で説明された機能を実行するようにソフトウェアにプログラムされた汎用プロセッサを含むことができる。例えば、ソフトウェアは、インターネットを介して電子形式でプロセッサにダウンロードされてもよく、または、代替的または追加的に、磁気メモリ、光メモリ、または電子メモリなどの非一時的な有形媒体に提供および/または格納されてもよい。
【0039】
図2は、本発明の一実施形態による、プロセッサ20を保護するための方法を模式的に示すフローチャートである。この方法は、フェッチユニット36が、フェッチステップ60で、メモリ32から1つ以上のコード命令をフェッチすることから始まる。フェッチされた命令は、復号化ユニット40と保護回路28の両方に提供される。従って、この方法のフローは2つの並列分岐に分かれる。
【0040】
復号化ステップ64では、復号化ユニット40は、フェッチされた命令を復号する。実行ステップ68では、実行ユニット44は命令を実行し、この方法のフローは、ステップ60に戻り、メモリから次の命令をフェッチする。
【0041】
識別ステップ72では、保護回路28は、どのコード命令にEDCビットが含まれており、且つこれらの命令内のEDCビットの位置を識別する。抽出ステップ76では、保護回路28は、命令からEDCビットを抽出する。EDCチェックステップ80では、保護回路28は、EDCビットの値がコード命令の任意のビットエラーを示しているかどうかをチェックする。
【0042】
EDCビットがエラーを示さない場合(「EDC通過(PASS)」)、方法のフローはステップ60に戻る。そうでなければ、EDCビットがビットエラー(「EDC未通過(FAIL)」)を示す場合、保護回路28は、動作トリガー(action triggering)ステップ84で応答動作(responsive action)を開始する。
【0043】
図2のフローは、概念を明確にするためだけに描かれた例示的なフローである。代替の実施形態では、任意の他の適切なフローが用いられ得る。
【0044】
例えば、プロセッサ20は、EDCの挿入およびチェックが有効な「安全(secure)」な動作モード、およびEDCの挿入とチェックが無効な「正常(normal)」の操作モードをサポートすることができる。モードは、例えば、コードアドレス範囲ごとに構成されることができる。
【0045】
EDCビットのビット位置
様々な実施形態では、保護回路28によって用いられるEDCスキームは、例えば、コード命令およびプログラムコード全体におけるEDCビットの位置において、互いに異なってもよい。
【0046】
いくつかの実施形態では、1つ以上のEDCビットは、プロセッサのISAに従って「予約済み(reserved)」として定義されたビット位置に(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)挿入される。「予約済み」の位置にあるビット値は命令パイプライン24により無視されるため、そのようなビット値を変更してもコードの実行には影響しない。
【0047】
いくつかの実施形態では、1つ以上のEDCビットは、「事実上予約済み(de-facto reserved)」のビット位置に(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)挿入される。本文脈では、「事実上予約済みのビット位置」という用語は、プロセッサのISAで予約済みとして定義されていないが、命令パイプライン24により無視され、コードの実行に影響を与えないビット位置を指している。事実上予約済みのビット位置の非限定的な例の1つは、プロセッサの適用可能なアドレス範囲を超えるアドレスビットである。例えば、命令構造がnビットアドレスを指定しているが、プログラムコードで実際に用いられているアドレス空間がn-1ビットのみを用いている場合を考えてみる。このような場合、アドレスのn番目のビットは、ISAで「予約済み」として正式に定義されていなくても、EDCビットとして安全に用いられることができる。
【0048】
他の例として、いくつかのISAは、ジャンプの最大サイズ(ジャンプオフセットのサイズ)が異なる複数のジャンプコマンドをサポートしている。この機能は、オフセットが小さいジャンプを実行するときに命令サイズを縮小するのに役立つ。いくつかの実施形態では、コンパイラまたはポストプロセッサは、ジャンプコマンドを用いるように設定されており、ジャンプアドレスまたはオフセットは、実際に必要なサイズよりも大きい、大きなオフセットサイズを有する命令オペランド(可能であればレジスタでなく)で定義され、これによりオフセット値の1つ以上の最上位ビット(MSB)がEDCビットとして用いられることができるようになる。これらの実施形態では、プロセッサもこの仕様を認識している必要があり、これにより、命令パイプライン24(例えば、分岐実行ユニット)がEDCビットを無視するようになる。
【0049】
例えば、最大±24ビットのジャンプオフセットを可能にする「正常」ジャンプ、および最大±16ビットのジャンプオフセットを可能にする「近接(near)」ジャンプをサポートする2つのタイプのジャンプコマンド、ISAについて考えてみる。一実施形態では、コンパイラまたはポストプロセッサは、(i)常に最大±16ビットのジャンプオフセットのみを可能にするが、(ii)常に「正常」ジャンプ命令のタイプを用いるように構成される。この構成は、ジャンプオフセットの8つのMSBを未使用のままにし、事実上予約済みがEDCビットとして用いられる(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって挿入される)。
【0050】
追加的または代替的に、様々な他の命令割り当て(instruction-assignment)設定がコンパイラまたはポストプロセッサに用いられ、EDCに用いられ得る事実上未使用のビット位置を生成することができる。追加的または代替的に、コンパイラまたはポストプロセッサは、一般に、冗長性を有する命令を優先するように設定されることができる。この機能は、EDCに利用されることができるより多くの事実上未使用のビットを生成する。このような命令を優先することは、適用可能な安全性/効率性のトレードオフに適合するように有効化、無効化、または構成されることができる。
【0051】
いくつかの実施形態では、コンパイラまたはポストプロセッサは、EDC用に1つ以上の専用コード命令をプログラムコードに追加し、これらの命令にEDCビットを挿入する。コンパイラまたはポストプロセッサは、例えば、プログラムコード内で定期的な間隔でそのようなNOP命令を生成することができる。これらの実施形態における保護回路28は、専用命令を識別し、そこからEDCビットを抽出するように構成される。専用命令は、例えば、プロセッサにより無視されるようにISAで指定されている「不操作(No-Operation; NOP)」コマンドを含み得るが、通常、予約済み、または事実上予約済みのビット用にいくらかのスペースを有する。
【0052】
追加的または代替的に、命令は、保護回路28およびコンパイラまたはポストプロセッサとの調整により、「事実上NOP(de-facto NOP)」または「NOP類似(NOP-like)」に設定されることができる。例えば、プロセッサの特定のレジスタは、実際のプログラムコードで用いられないように設定できる。コンパイラまたはポストプロセッサは、例えばプログラムコード内で定期的な間隔でこのレジスタに関わる命令を生成し、これらの命令にEDCビットを挿入することができる。これらの実施形態の保護回路28は、当該レジスタに関する命令を識別し、そこからEDCビットを抽出するように構成される。様々な他の調整スキームが、通常のコード実行に影響を与えない方法でEDCに様々なコマンドを割り当てるように用いられることができる。
【0053】
NOPまたはNOP類似の命令を用いるとき、コンパイラまたはポストプロセッサがNOPまたはNOP類似の命令を(例えば、定期的な間隔で)生成するが、それらにEDCビットを挿入しないハイブリッドスキーム(hybrid scheme)も可能である。実行時に、挿入回路48は、EDCビットをコンパイラまたはポストプロセッサにより生成された1つ以上のNOPまたはNOP類似の命令に挿入する。
【0054】
上述のスキームは、単に例として選択されたものである。代替の実施形態では、任意の他の適切なビット位置がEDCビットに用いられることができる。
【0055】
EDCスキームによるコードカバレッジ
様々な実施形態では、保護回路28により用いられるEDCスキームは、例えば、EDCにより保護されたコードの部分において、互いに異なる可能性がある。
【0056】
例えば、いくつかの実施形態では、EDCスキームは「内部命令(intra-instruction)」であり、即ち、所与の命令に挿入されたEDCビットは、同じコード命令の他の1つ以上の他のビットのみを介して計算される(従って、保護する)。例えば、EDCビットは、命令内の他の全てのビットのパリティとして、または命令の所定の部分を介して(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)計算されることができる。他の実施形態では、EDCスキームは、所与のEDCビットが複数のコード命令で選択された複数のビットを介して計算される(従って、保護する)ことができるという意味で、命令境界をまたがっている。
【0057】
いくつかの実施形態では、EDCスキームは、全てのプログラムコード、または少なくともコードの大部分を保護することができる。例えば、プログラムコードがセクションに分割され、1つ以上のEDCビットのグループが各セクションに挿入された(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)実施形態を考えてみる。1つ以上のEDCビットの各グループは、その全てのコードセクションを介して計算される(従って、保護する)。
【0058】
理解できるように、上述のスキームが適切に機能するために、保護されている各コードセクションは、決定論的(即ち、データ依存しない、または可変であるまたは予測不可能な)コードフローを有する必要がある。本文脈では、「決定論的コードフローを有するコードセクション(code section having a deterministic code flow)」という用語は、コードセクションの実行が常に同じ順序で同じ命令のシーケンスに従うことを意味している。当該順序は、EDCチェック用の保護回路に到達する命令の順序である。例えば、EDCチェックがフェッチユニットの出力に実行された場合、プロセッサパイプラインが命令を順不同で復号化して実行させることができる。一方、フェッチが順不同で実行された場合、命令はEDCの計算およびチェックの前に、再順序付けされる(例えば保護回路により)必要がある。
【0059】
例示的な実施形態では、この要件は、各セクションを連続したジャンプ命令および/またはジャンプ先命令間のセクションとして定義することによって満たされる。「ジャンプ先(jump-destination)」命令は、プログラムコード内でジャンプ命令によりジャンプ先にジャンプする命令である。言い換えると、1つ以上のEDCビットの各グループは、任意のジャンプまたはジャンプ先命令をトラバースしないコードセクションを介して計算される(従って、保護する)。本文脈では、「トラバースしない(does not traverse)」という用語は、セクションの最初の命令と最後の命令を除外しており、これらは通常、ジャンプまたはジャンプ先命令である。
【0060】
一実施形態では、条件付き分岐命令、無条件ジャンプ命令、およびリターン命令も全て、コードをセクションに分割するためのジャンプ命令とみなされる。このように分割すると、保護されている各コードセクションは、任意のジャンプまたはジャンプ先命令をトラバースしない。
【0061】
いくつかの実施形態では、1つ以上のEDCビットの各グループは、前のジャンプまたはジャンプ先命令より先(場合によっては後)に開始するそれぞれのコードセクションを介して計算される(従って、保護する)。このセクションは、次のジャンプまたはジャンプ先命令までに(場合によっては先に)終了する。
【0062】
ジャンプ先命令を考慮に入れるために、いくつかの実施形態では、コンパイラ(またはポストプロセッサ)が、プログラムコードを分析し、様々な可能なジャンプ先命令をマークする。様々な実施形態では、様々な技術がジャンプ先命令を識別するために用いられ得る。
【0063】
一実施形態では、ポリシーは、コンパイラまたはポストプロセッサが、全てのジャンプ命令がこの目的のためにプログラムコードに挿入された特定のタイプの命令にジャンプすることを保証するように定義されることができる(即ち、全てのジャンプ先命令は、特定の識別可能なタイプである)。この規約を用いるとき、任意のジャンプ命令および特定のタイプの命令がセクション境界として用いられ得る。例えば、このポリシーは、全てのジャンプ先の命令がNOP命令、または特定のレジスタとして機能する命令であることを特定することができる。他の例として、ポリシーは、コンパイラまたはポストプロセッサがアドレスのサブセットへのジャンプのみを許可するように特定することができる(例えば、N LSB(Least Significant Bit)==0を有するアドレスへのみ)。追加的または代替的に、任意の他の適切な規約がジャンプ先命令を定義するために、用いられることができる。一般に、冗長なジャンプ先命令を定義することは許容されており、これは、この定義は、より細かいセグメンテーションがより小さなセクションとなることがほとんどないためである。一方、パーティショニングに用いられた実際のジャンプ先命令がないことは問題がある。
【0064】
さらに代替的に、各コードセクションが決定論的なコードフローを有する限り、セクションに分割する他の形式も可能である。
【0065】
一実施形態では、1つ以上のEDCビットのグループが、各ジャンプ命令およびジャンプ先命令に挿入され(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)、前のジャンプまたはジャンプ先命令より、全てのコードセクションを介して計算される(従って、保護する)。このようなスキームは、プログラムコードの大部分を保護する。
【0066】
一実施形態では、1つ以上のEDCビットのグループが、決定論的コードフローを有する各セクション(例えば、連続したジャンプ/ジャンプ先命令間の各セクション内の任意の場所)の少なくとも1つの命令に挿入される(例えば、コンパイラまたはポストプロセッサによって、または挿入回路48によって)。所与のセクションのEDCビットは、コードセクションで選択された複数のビットを介して計算され(従って、保護する)、EDCビットの先行の命令のビットおよび/またはEDCビットの後続の命令のビットを含むことができる。
【0067】
他の実施形態では、所与の命令(例えば、隣接するコードセクション間を分けるジャンプまたはジャンプ宛先命令)は、2つのタイプのEDCビットを含む。1つのEDCビットは、命令自体を介して計算される(従って、保護する)。第2のEDCビットは、前のジャンプ/ジャンプ先より、コードセクションを介して計算される(従って、保護する)。
【0068】
上述の実施形態では、保護回路28は、EDCチェック論理56(
図1)の「ジャンプ」入力を用いて、保護されているコードセクションの開始位置をマークすることができる。これらの実施形態では、EDCチェック論理56は、「ジャンプ」入力の各アサーションでEDC(例えば、パリティ)の計算をリセットし、再スタートする。
【0069】
非決定論的コードフローのもう1つの原因は、プロセッサ20での例外の発生である。従って、いくつかの実施形態では、保護回路28は、各例外および例外コードの実行からの各リターン時に、EDCチェック論理56(
図1)の「例外」入力をアサートする。「例外」入力がアサートされたとき、EDCチェック論理56は、決定論的コードフローを有する次のコードセクションの開始まで、現在のEDC計算を中止し、エラーのチェックも一時停止する(例えば、「ジャンプ」入力の次のアサーションまで)。
【0070】
いくつかの実施形態では、プロセッサ20に割り込みが発生したとき、保護回路28は、メインコードでEDCチェックの状態(「コンテキスト(CONTEXT)」)を記録することができる。割り込みコードの実行が完了し、プロセッサがメインコードの実行にリターンすると、保護回路28は、記録された状態(「コンテキスト」)を復元し、中断されたポイントからEDCチェックを再開する。
【0071】
上述の実施形態は、例として引用されており、以下の特許請求の範囲は、上述に具体的に開示および記載された内容に限定されないことに留意されたい。むしろ、この範囲は、上述の様々な特徴のコンビネーションおよびサブコンビネーションの両方、ならびに前述の説明を読んで当業者が知るであろう、先行技術に開示されていないその変形および修正を含む。参照することにより本特許出願に組み込まれた文書は、組み込まれた文書の用語の定義が本明細書で明示的または暗黙的になされた定義と矛盾する場合を除いて、本出願の不可欠な部分と見なされ、本明細書の定義のみが考慮されるべきである。
【符号の説明】
【0072】
20 プロセッサ
24 命令パイプライン
28 保護回路
32 メモリ
36 フェッチユニット
40 復号化ユニット
44 実行ユニット
48 挿入回路
50 インターフェース
52 ルックアップテーブル
56 論理(EDCチェック論理)
60、64、68、72、76、80、84 ステップ