次に、これらのプロセッサのメモリコントローラーがどのように物理アドレスをDRAMの場所、特にDRAMモジュールの行、バンク、列番号にマップするかを説明します。 DRAMアドレスマッピングと呼びます 。 例として1台のテストマシンを使用します。
動機:Rowhammerのバグ
Rowhammerバグに関連するDRAMアドレスのマッピングに興味があります。
Rowhammerは、特定の最悪ケースのメモリアクセスモデルがメモリ破損につながる可能性がある場合、一部のDRAMモジュールの問題です。 これらのDRAMでは、メモリラインの繰り返しのアクティブ化(「ラインの詰まり」)により、隣接するラインの脆弱なセルのビットが変化する電気ノイズが発生します。
これらの繰り返されるラインアクティベーションは、同じDRAMバンクの異なるラインにあるDRAMアドレスのペアへの複数のアクセスによって発生する可能性があります。 DRAMアドレスのマッピングを知ることは、アドレスのどのペアがこの「1つのバンク、異なる行」(同じバンク、異なる行、SBDR)プロパティを満たすかを示すので便利です。
アドレスマッピングの推測と確認
テストのために、私はRowhammerバグに対して脆弱なDRAMモジュールを搭載したマシンを使用しています。 このマシンでrowhammer_testを実行すると、少し変更があります。
このマシンのDRAMアドレスマッピングスキームを知りたいのですが、公開されていません:ここにSandy Bridgeプロセッサがありますが、Intelはこれらのプロセッサのメモリコントローラで使用されるアドレスマッピングを文書化していません。
実際、
rowhammer_test
テストで
rowhammer_test
SBDRアドレスペアを知る必要はあり
rowhammer_test
ん。 彼は、ランダムに選択されたアドレスのペアをたたこうと数回試みます。 通常、それらの1/8または1/16はSBDRペアになります。これは、この車では各DIMMに8バンク(および合計16バンク)があるためです。 したがって、メモリのビットを変更するためにDRAMアドレスのマッピングを知る必要はありませんが、そのような知識はテストをより意図的に実施するのに役立ちます。
アドレスのマッピングは文書化されていませんが、DRAMジオメトリに基づいて合理的な仮定を立て、
rowhammer_test
によって報告された物理アドレスに基づいて仮定を確認できることが
rowhammer_test
。 テストでは、ビットが変更される物理アドレス( 「victims」 )と、これらの変更を行う物理アドレスのペア( 「aggressors」 )が報告されます。 これらのペアはSBDRペアでなければならないため、この経験的データへのアドレスの仮想マッピングを検証できます。
メモリジオメトリ
最初のステップは、マシンにインストールされているDIMMの数と、それらが内部的に構成されている方法を確認することです。
Linuxで
decode-dimms
を使用してDIMM情報を要求でき
decode-dimms
(Ubuntuでは
I2C-tools
パッケージに含まれています)。 このツールは、DIMMのSPD(Serial Presence Detect)メタデータをデコードします。
私のテストマシンでは、2つの4ギガバイトSO-DIMMで 、8 GBのメモリを提供します。
decode-dimms
は、各モジュールについて次の情報を報告します。
サイズ4096 MB 銀行x行x列xビット8 x 15 x 10 x 64 ランク2
これは、両方のDIMMが次のことを意味します。
- 各バンクには2 ^ 15行(32768行)があります。
- 各行には2 ^ 10 * 64ビット= 2 ^ 16ビット= 2 ^ 13バイト= 8 KBが含まれます。
各DIMMには2つのランクと8つのバンクがあります。 DIMMの容量をクロスチェックすると、予想されたサイズが得られます。
1行あたり8 KB * 32768行* 2ランク* 8バンク= 4096 MB = 4 GB
DRAMアドレスのマッピング
テストコンピューターでは、物理アドレスのビットを次のように使用します。
- ビット0〜5 :これらは、文字列のバイトインデックスの下位6ビット(つまり、64バイトキャッシュラインの6ビットインデックス)です。
- ビット6 :これは、2つのDIMMから選択する1ビットのチャネル番号です。
- ビット7-13 :行内のインデックスの上位7ビット(つまり、列番号の上位ビット)。
- ビット14〜16 :行番号の下位3ビットとのXOR。これにより、3ビットのバンク番号が得られます。
- ビット17 :2つのDIMMランク(通常はDIMMチップの両側)から選択する1ビットのランク番号。
- ビット18-32 :15ビットの行番号。
- ビット33+ :物理メモリは0より大きい物理アドレスで始まるため、設定できます。
なぜそのようなディスプレイですか?
このマッピングは、
rowhammer_test
の結果に
rowhammer_test
ています(以下を参照)が、シーケンシャルアクセスやステップまたはステップアクセスなどの一般的なメモリアクセスパターンに対して良好なパフォーマンスを提供するようにアドレスビットがマッピングされることも説明できます(ストライドアクセス):
- 同時実行チャネル 。 チャネル番号をビット6に配置すると、キャッシュラインは2つのチャネル(つまり、2つのDIMM)の間で交互になり、並行してアクセスできます。 これは、アドレスに連続してアクセスすると、負荷が2つのチャネルに分散されることを意味します。
ちなみに、 Ivy Bridge (Sandy Bridgeの後継)は、チャンネル番号の表示を複雑にしているようです。 Intelのプレゼンテーションでは「チャネルハッシュ」に言及しており、「複数のアドレスビットに基づいてチャネルを選択できる」と述べています。 歴史的に、それは「A [6]」でした。 これにより、チャネル間でメモリアクセスがより均等に分散されます。 - 銀行の滑り :一般に、列番号、銀行、および行の配置は、銀行のアクティブな行の頻繁な変更(銀行スラッシング)を最小限に抑える必要があります。
簡単な紹介:DRAMモジュールはバンクに編成され、バンクは順番に編成されます。 各バンクには「現在アクティブ化されているライン」があります。その内容はラインバッファにコピーされます。 ラインバッファはキャッシュとして機能し、すばやくアクセスできます。 最初にアクティブにする必要があるため、別の回線へのアクセスには時間がかかります。 したがって、DRAMアドレスをマッピングするとき、SBDRペアは物理アドレス空間で可能な限り伝送されます。
行の追跡(行ハンマー)は、2つの特定の行が交互にアクティブになったときに(場合によっては)バンクをスリップする特殊なケースです。 - 銀行の並列性 :銀行は(チャネルよりも程度は低いですが)並列にアクセスできるため、アドレスが増えると行番号の前に銀行番号が変わります。
- XORスキーム :行番号の最下位ビットをバンク番号にXORすることは、大きなステップで配列にアクセスするときにバンクをスリップさせないための秘trickです。 たとえば、上記の表示では、XORを実行すると、XおよびX + 256kアドレスがSBDRペアを形成せずに異なるバンクに配置されます。
銀行/行のXORスキームは、たとえば次のようなさまざまな文献で説明されています。
- David Tavei Wangによる博士論文「現代のDRAMシステム:性能分析と計画アルゴリズム」 、2005年。セクション5.3.5「銀行アドレスの平滑化(ステップ衝突)」を参照してください。 この論文では、一般的なDRAMテクノロジーに関する優れた背景情報も見つけることができます。
- 記事「統合メモリ階層を使用したDRAM遅延の削減」 、2001年。図を参照。 3。
rowhammer_testとの調整
rowhammer_test_ext ( rowhammer_testの拡張バージョン)をテストマシンで6時間実行すると、22か所でビットの繰り返しの変更が明らかになりました。 ( ソースデータと分析コードを参照)。
文字列のミントのテストでは、3つのアドレス(A1、A2、V)のセットが生成されます。
- Vは被害者の住所であり、少し変化が見られます。
- A1とA2は、私たちが造る攻撃者のアドレスです。
- A1がA2よりもVに近くなるように、A1とA2を並べ替えます。 仮に、より近いアドレスA1が実際にビット変更を引き起こすと仮定します(より複雑なDRAMアドレスマッピングが使用される場合、これは必ずしも当てはまりません)。
これらのすべての結果について、3つのプロパティが完了することが期待されます。
- 行 : 行番号A1とVは1異なる必要があります。 それらは隣接する行になければなりません。 (A2は任意の行番号を持つことができます)。
このプロパティにより、行番号の最下位ビットが物理アドレスのどこにあるかを簡単に判断できます。
テストでは、このプロパティが2つを除くすべての結果に適用されることが示されました。 これら2つの結果では、行番号は1ではなく3だけ異なります。 - 銀行 :V、A1、A2は同じ銀行番号でなければなりません。 実際、この特性は22の結果すべてに現れました。 行/銀行のXORスキームを適用する場合にのみ保存されます。
- チャンネル :V、A1、A2は同じチャンネル番号でなければなりません。 これはすべての結果に当てはまります。
rowhammer_test
は4kにアラインされたアドレスのみを選択し、したがって1つのチャネルのみをテストするため、すべての結果がchannel = 0になります(これはバグと見なされる可能性があります)。
可能なさらなるテスト
将来、DRAMアドレスマッピングがSBDRプロパティを正しく評価するかどうかを確認するために、さらに2つの実験を実行できます。
- 時間の測定 :SBDRアドレスのペアへの複数アクセスは、SBDRのないペアへの複数アクセスよりも遅いはずです。なぜなら、最初のものは回線のアクティブ化を引き起こし、2番目はそうではないからです。
- 徹底的なRowhammerテスト :ビットの繰り返しの変更を引き起こす攻撃者A1のアドレスを見つけるとすぐに、A2の多くの値でこれを確認できます。 ミンティングの効果(A1、A2)は、SBDRのペアである場合にのみビットを変更します。
さらに、システムユニットから1つのDIMMを取り外すと、DRAMアドレスマッピングからチャネルビットが削除され、それに応じて攻撃者と被害者のアドレスが変更されます。 これも確認できます。