どんな提案/議論も大歓迎です!
質問は実際にはタイトルのように簡単ですが、物理的な住所が必要な理由を説明します。
背景:
最近はキャッシュとマルチコア アーキテクチャに魅了されており、並列環境下でキャッシュがプログラムにどのように影響するかについて非常に興味があります。
一部の CPU モデル (たとえば、Intel Core Duo T5800) では、L2 キャッシュがコア間で共有されます。したがって、プログラムAが次のような物理アドレスでメモリにアクセスしている場合
0x00000000, 0x20000000, 0x40000000...
およびプログラム B でデータにアクセスする
0x10000000, 0x30000000, 0x50000000...
これらのアドレスは同じサフィックスを共有するため、L2 キャッシュ内の関連するセットは頻繁にフラッシュされます。また、2 つのプログラムが互いに競合し、キャッシュではなくメモリからゆっくりとデータを読み取ることが予想されますが、それらは異なるコアで分離されています。
それでは実際に結果を検証したいと思います。この実験では、仮想アドレスではなく物理アドレスを知る必要があります。しかし、どうすればこれに対処できますか?
最初の試み:
ヒープから大きなスペースを食べ、マスクし、特定のアドレスを取得します。
私の CPU にはサイズ = 2048KB で連想性 = 8 の L2 キャッシュがあるため、物理アドレスのようなもの0x12340000, 0x12380000, 0x123c0000
は L2 キャッシュの最初のセットに関連付けられます。
int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {
v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
v[1] = (int*) ((unsigned)(v[0]) + 0x40000);
// one program pollute v[0], another polluting v[1]
}
悲しいことに、仮想メモリの「助け」により、変数HEAP
は物理メモリ内で常に連続しているわけではありません。異なるキャッシュ セットに関連している可能性がありますv[0]
。v[1]
2回目の試み
にアクセス/proc/self/mem
し、メモリ情報の取得を試みます。
うーん...結果はまだ仮想メモリについてのようです。