2012-02-15 8 views
4

Linuxを実行するIntel x86プラットフォームでは、C/C++では、L1/L2キャッシュに値(uint32など)を格納するようにOSとハードウェアに指示する方法L2キャッシュ、システムメモリにはありませんか?たとえば、セキュリティやパフォーマンス上の理由から、32ビットのキー(32ビットの符号なしint)をDRAMに格納する必要はなく、代わりにプロセッサのキャッシュにのみ格納したいと考えています。これどうやってするの?私はIntel XeonプロセッサでFedora 16(Linux 3.1とgcc 4.6.2)を使用しています。システムメモリの代わりにプロセッサキャッシュにC/C++変数を格納する

ご協力いただきありがとうございます。

+6

短い回答:できません。データをキャッシュに保持する "トリック"をすることはできますが、キャッシュには何も固定することはできません。 – Mysticial

+0

セキュリティ上の理由から、プログラムを簡単に逆アセンブルできれば、それをキャッシュに隠すことを試みても大して役に立たないでしょう。 –

+1

それを置いても、永久的ではありません。それをキャッシュに入れてキーを読んでどこから始めるのですか? –

答えて

3

変数をプロセッサのキャッシュに強制的に格納することはできませんが、registerキーワードを使用すると、指定された変数をCPUレジスタに割り当てて宣言することをコンパイラに提案できます以下のような:

register int i; 
+0

ええ、これは彼のプロセスがコンテキストを切り替えるまで続くだけです。私は元のポスターが質問をする前に彼の正確なパフォーマンス(または "セキュリティ")の要件を考えていたことは非常に疑問です。それゆえ、私はより多くの詳細を要求しています(主に、おそらく彼自身が問題を適切に策定しなければならないためです)。 – chetan

+0

+1はレジスタの使用方法を示唆していますが、質問はあいまいです。 –

5

あなたはL1/L2キャッシュに何かを保つためにCPUを強制することができますのx86にはCPU命令(または実際に私の知る任意のプラットフォーム)はありません。このような非常に低いレベルの詳細をC/C++のような高級言語に公開しましょう。 「パフォーマンス」のためにこれを行う必要があるということは、あなたがどのようなパフォーマンスを見ているのかという状況がなければ無意味です。なぜあなたのプログラムは、キャッシュ内のデータだけにアクセスすることに密接に依存しているのですか?セキュリティのためにこれが必要だと言うと、セキュリティ設計が悪いように思えます。どちらの場合でも、正確にここで何をしようとしているのかについて、より詳細な情報を提供する必要があります。

5

短い答えでは、キャッシュとは異なり、メインメモリからのアクセス、高速化、分岐予測やパイプライン処理などの高度な技術を使用することはできません。

キャッシュが特定のデータに使用されていることを確認する方法はありますが、それでもRAMに常駐し、プリエンプティブマルチタスクオペレーティングシステムでは、キャッシュの内容がコンテキストを通じて吹き飛ばされることを保証できません「世界を止める」、または低レベルのアトミック操作以外の任意の2つの命令を切り替えることはできますが、一般的には、処理を行わずにスピンロックのインクリメントとフェッチなど、暗号アルゴリズムを一度に実行できます。

1

キャッシュを直接使用することはできませんが、ハードウェアレジスタを整数に使用することができ、高速です。

1

実際にパフォーマンスが必要な場合は、CPUレジスタで変数を使用する方がよいでしょう。

レジスタを使用できない場合、たとえば、異なるスレッドまたはコア間で同じ値を共有する必要がある場合(マルチコアが一般的になっているため)、変数をメモリに格納する必要があります。

すでに述べたように、コールやキーワードを使用してメモリにキャッシュを強制することはできません。 しかし、キャッシュは完全に愚かではありません。メモリブロックが頻繁に使用される場合は、キャッシュに保持するのに問題はありません。

このメモリ空間に異なるコアから多くのデータを書き込む場合は、プロセッサ内のキャッシュコヒーレンシブロックに負荷をかけることになります。これは、すべてのキャッシュと実際のメモリ以下は同期して維持されます。 これにより、CPUの全体的なパフォーマンスが低下します。

逆の(キャッシュしない)は、ヒープメモリの一部に割り当てることができるプロパティとしてが存在することに注意してください。

関連する問題