物理地址如何显示在DRAM字符串和存储区中

上一篇文章中,我们讨论了Intel Sandy Bridge处理器如何映射L3缓存中的物理地址。

现在,我将告诉您这些处理器的内存控制器如何将物理地址映射到DRAM中的某个位置,尤其是DRAM模块中的行号,存储区和列号。 称之为DRAM地址映射 。 我以一台测试机为例。

动机:Rowhammer错误


我对映射DRAM地址感兴趣,因为它与Rowhammer错误有关

Rowhammer是某些DRAM模块的问题,其中某些最坏情况的内存访问模型可能导致内存损坏。 在这些DRAM中,存储线的多次激活(“线阻塞”)会导致电噪声,从而改变相邻线易受攻击的单元中的位。

这些重复的线路激活可能是由于多次访问同一DRAM组不同线路上的一对DRAM地址引起的。 知道DRAM地址的映射很有用,因为它表明哪些地址对满足此“一个存储体,不同的行”(相同存储体,不同的行; SBDR)属性。

猜测和检查地址映射


为了进行测试,我有一台带有DRAM模块且容易受到Rowhammer错误影响的机器。 在此计算机上运行rowhammer_test会显示一些变化。

我想知道这台机器的DRAM地址映射方案,但尚未公开记录:这是Sandy Bridge处理器,但是Intel没有记录这些处理器的内存控制器使用的地址映射。

实际上, rowhammer_test测试不需要知道SBDR地址对。 他只是尝试几次敲击随机选择的地址对。 通常,其中的1/8或1/16是SBDR对,因为在我们的汽车中,每个DIMM中有8个存储区(总共16个存储区)。 因此,我们不需要知道DRAM地址的映射就不​​会引起存储器中的位更改,但是这种知识将有助于更有目的地进行测试。

尽管没有记录地址映射,但是我发现我可以基于DRAM几何结构对其进行合理假设,然后根据rowhammer_test报告的物理地址检查该假设。 该测试报告位更改的物理地址( “受害者” )和进行这些更改的物理地址对( “攻击者” )。 由于这些对必须是SBDR对,因此我们可以验证地址到该经验数据的假设映射。

记忆体几何


第一步:检查机器中安装了多少个DIMM,以及它们的内部组织方式。

我可以使用Linux上decode-dimms请求DIMM信息(在Ubuntu上,它位于I2C-tools软件包中)。 此工具解码DIMM中的SPD(串行状态检测)元数据。

在我的测试机上,有两个4 GB的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的容量可以得到预期的大小:

每行8 KB * 32768行* 2等级* 8个存储库= 4096 MB = 4 GB

映射DRAM地址


在我的测试计算机上,如下使用物理地址:

  • 位0-5 :这些是字符串中字节索引的低6位(即64字节高速缓存行的6位索引)。
  • 位6 :这是一个在两个DIMM之间选择的1位通道号。
  • 位7-13 :一行中索引的高7位(即列号的高位)。
  • 位14-16 :与行号的低3位进行XOR,得到3位的存储体编号。
  • 位17 :1位等级编号,可在两个DIMM等级(通常是DIMM芯片的两侧)之间进行选择。
  • 位18-32 :15位行号。
  • 位33+ :可以设置它们是因为物理内存以大于0的物理地址开头。

为什么要这样显示?


这种映射rowhammer_test的结果(请参见下文),但是我们也可以解释地址位的映射方式,以便为典型的内存访问模式(如顺序访问和分步或分步访问)提供良好的性能(跨步访问):

  • 并发渠道 。 在第6位中放置一个通道号意味着高速缓存行将在两个可以并行访问的通道(即两个DIMM)之间交替。 这意味着,如果我们顺序访问地址,则负载将分布在两个通道上。

    顺便说一句, Ivy Bridge (Sandy Bridge的继任者)似乎使频道号的显示复杂化。 英特尔的演示文稿提到“通道散列”,并指出“它允许您基于多个地址位选择通道。” 历史上,它是“ A [6]”。 这样可以确保在通道之间更均匀地分配内存访问。”
  • 银行滑倒 :通常,列号,银行和行的排列应尽量减少银行活动行的频繁更改(银行颠簸)。

    一个简短的介绍:DRAM模块被组织成存储体,而存储体又被组织成行。 每个存储区都有一个“当前激活的行”:其内容被复制到行缓冲区中 ,该行缓冲区充当高速缓存,可以快速访问。 访问另一条线需要更长的时间,因为需要先将其激活。 因此,在映射DRAM地址时,SBDR对在物理地址空间中尽可能地携带。

    当交替激活两条特定的线(可能是故意的)时,追逐线(行锤)是滑行的一种特殊情况。
  • 银行并行性 :可以并行访问银行(尽管程度比通道小),因此随着地址的增加,银行编号在行号之前更改。
  • XOR方案 :将行号的最低有效位与Bank号进行XOR运算是避免在大步访问数组时避免bank滑落的技巧。 例如,在上面的显示中,XOR'ing强制X和X + 256k地址位于不同的存储体中,而不形成SBDR对。

    银行/行的异或方案在各种文献中都有描述,例如:

与rowhammer_test对帐


在测试机上运行rowhammer_test_extrowhammer_test的扩展版本)6小时,发现22位中的位重复更改。 (请参阅源数据和分析代码 )。

铸造字符串的测试生成三个地址(A1,A2,V)的集合:

  • V是受害者的地址,在这里我们可以看到位的变化。
  • A1和A2是我们发现的攻击者的地址。
  • 对A1和A2进行排序,以使A1比A2更接近V。 我们暂时假定较近的地址A1实际上会引起位变化(尽管如果使用更复杂的DRAM地址映射,则不一定是正确的)。

对于所有这些结果,我们期望完成以下三个属性:

  • 号A1和V必须相差1,即 它们应该在相邻的行中。 (A2可以有任何行号)。

    此属性使确定行号最低位在物理地址中的位置变得容易。

    测试表明,除了两个结果外,此属性均成立。 在这两个结果中,行号相差3而不是1。
  • 银行 :V,A1和A2必须具有相同的银行号码。 确实,该属性在所有22个结果中均得到体现。 仅在应用行/库的XOR'ing方案时保存。
  • 通道 :V,A1和A2必须具有相同的通道号。 所有结果都是如此。 碰巧所有结果的通道都为0,因为rowhammer_test仅选择以4k对齐的地址,因此仅测试一个通道(也许可以认为是错误)。

可能的进一步测试


将来,您可以再运行两个实验来检查DRAM地址映射是否正确评估了SBDR属性:

  • 时间的度量 :对SBDR地址对的多次访问应比对不带SBDR的地址对的多次访问慢,因为前者导致线路激活,而后者则不会激活。
  • 详尽的Rowhammer测试 :一旦我们发现攻击者 A1的地址,该地址会导致位的重复更改,我们就可以在A2的许多值上进行检查。 造币(A1,A2)的效果只有在为一对SBDR时才会改变。

另外,从系统单元中删除一个DIMM应该从DRAM地址映射中删除通道位,并相应地更改攻击者和受害者地址。 也可以检查。

Source: https://habr.com/ru/post/zh-CN431102/


All Articles