piernov

By piernov — Aug 27, 2023

识别焊接内存的笔记本电脑上的缺陷 RAM IC

警告:本文中的某些信息是不确定的,并且基于第三方的逆向工程结果。需要来自内存控制器制造商的官方文档,但 Intel 没有公开这些文档。这仅仅展示了缩小故障范围的思路。此外,其他因素,如 PCB 或 CPU 故障,也可能导致问题,而不仅仅是 RAM IC 本身(例如,MacBook Air 13" 2011 (主板编号 820-3023) 上的常见故障)。

引言

我们将以 MacBook Pro Late 2013 15" IG (主板编号 820-3662) 作为案例研究,该型号配备了 16 GiB RAM,这意味着完全装配了 32 个 RAM IC。这个特定的逻辑板没有通过 ASD EFI 内存测试。

每个 RAM IC 都有一个 8 位的数据总线,因此需要 8 个 IC 才能构成现代 PC 中常见的 64 位宽的数据总线。 除此之外,还有两个内存通道,每个通道 2 个 rank,总共 4×8=32 个 IC。 这也意味着内存数据总线上的 1 个数据位有 4 个相关的 IC。

内存控制器负责将 CPU 看到的物理地址映射到实际的通道、rank、bank、行和列。

请注意,在操作系统下,CPU 上执行的软件将看到虚拟地址,而不是物理地址。操作系统管理虚拟地址空间,而 MMU (内存管理单元),CPU 的一部分,负责虚拟地址和物理地址之间的转换,但这一点与本文关系不大。

在本文中,我们希望将 Memtest86 检测到的内存故障缩小到单个 IC。 Memtest86 将显示“物理”地址,但不会准确显示哪个 IC 受影响。 请注意,最新版本的 Memtest86(商业版的付费版本)增加了对 DIMM 上受影响 IC 的识别支持,仅适用于某些平台。 不支持 DDR3 平台。

这要求系统能够 POST 并启动 Memtest86,即由于 RAM IC 短路而无法供电,或者无法 POST(没有启动声音或 3 声蜂鸣),则无法使用此技术。

使用 Memtest86 查找错误

请注意,Memtest86 和 Memtest86+ 不是同一个软件。 Memtest86+ 是开源的,而 Memtest86 是专有的。 在这种情况下,我们将不幸地使用 Memtest86。 如果你愿意,可以尝试使用 Memtest86+。

首先,下载 Memtest86。 在此测试中使用了 v10.1.009 版本,请注意 v10.1 会在某些 Apple 机器(包括此 MacBook)上挂起,因此请使用较新版本。 (v10.1.009 是专门为修复此错误而构建的预发布版本)

让它运行几个小时,然后收集结果:

摘要页面也可以在最后显示。

在这种情况下,失败的位是 bit 11(二进制的 0x800 是 0b100000000000),因此它是具有数据总线 bit 11 的 4 个 IC 之一,即 U2310、U2410、U2510 或 U2610。 (稍后将对此进行更详细的解释。)

故障发生在内存地址 0x1D43EFDA8

将地址解码为通道和 rank

警告:这是不确定的部分,请自行决定是否继续

让我们分析 0x1D43EFDA8,以二进制表示:

A = 0b1 1101 0100 0011 1110 1111 1101 1010 1000

我们将依赖于一篇关注内存攻击的研究文章,该文章提供了对几个平台进行逆向工程的映射:https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_pessl.pdf

我们可以根据表 2.a 获取 Haswell 在 2 个通道中、每个通道 1 个 DIMM 配置的地址映射:

在上面链接的文章中,使用的所有内存 DIMM 都有 2 个 rank。 在同一通道上具有两个 2 rank 的 DIMM 意味着总共有 4 个 rank。 我们的主板没有离散的 DIMM,因为它使用焊接的 IC,但是它每个通道使用 2 个 rank(不是 4 个)。 因此,我们假设每个通道 1 个 DIMM、每个 DIMM 2 个 rank 的配置。

在此表中,每个数字都是地址中的一个位位置,并且将异或 (XOR,以下用 ⊕ 表示) 依次应用于每个位,顺序递增。 提醒一下,仅当两个操作数不同时,XOR 才输出 1。 如果两个操作数具有相同的值,则输出 0。

bank 地址位(BA0、BA1 和 BA2)用于寻址所有 RAM IC 内部的 bank,因此与我们的情况无关。

因此,让我们首先看一下 rank。 它是位 16 和 20 之间的简单 XOR:

A[16] ⊕ A[20] = 0 ⊕ 1
       = 1

该地址对应于 rank 1,这意味着 CS# 信号位 1。

通道计算更为复杂,因为它涉及 7 个不同的位:

 A[7] ⊕ A[8] ⊕ A[9] ⊕ A[12] ⊕ A[13] ⊕ A[18] ⊕ A[19]
=  1  ⊕  1  ⊕  0  ⊕  1  ⊕  1  ⊕  1  ⊕  1
=   0    ⊕  0  ⊕  1  ⊕  1  ⊕  1  ⊕  1
=       0    ⊕  1  ⊕  1  ⊕  1  ⊕  1
=          1    ⊕  1  ⊕  1  ⊕  1
=              0    ⊕  1  ⊕  1
=                  1    ⊕  1
=                      0

因此,受影响的通道是通道 0,也称为 A。

识别受影响的 IC

然后,我们看一下内存 IC 的原理图:

在此图中,通道以蓝色突出显示 (MEM_*),rank 的 CS# 信号以红色突出显示 (MEM_*_CS_L<*>),bank 选择位以紫色突出显示 (MEM_*_BA<*>),行/列地址位以黄色突出显示 (MEM_*_A<*>),最后,数据总线以绿色突出显示 (MEM_*_DQ<*>)。

我们确认内存 IC 位于通道 A 上(MEM_A_*,蓝色),由 CS# 信号位 1 选择(MEM_A_CS_L<1>,红色),并且具有数据位 11(MEM_A_DQ<11>,绿色):

我们使用 OpenBoardView 打开主板视图以找到 IC 的位置:

更换受影响的 RAM IC

我们移除并更换了 IC。 这需要微焊接设备和技能。 在这种情况下,IC 取自具有不相关问题的备用主板并重新植球。 RAM IC 对热敏感,因此请尽量不要使其过热。

使用 Memtest86 确认修复

然后我们再次运行 Memtest86,现在已成功通过:

Apple Service Diagnostic EFI 3S162 也是如此:

参考