为什么 memtest 会在多个地址上显示同一位的位翻转?

为什么 memtest 会在多个地址上显示同一位的位翻转?

今天我不幸未能通过内存测试,但结果似乎有点奇怪,我对此有几个疑问。当然,这可能会导致我退回内存,但我仍然想了解到底出了什么问题。

Memtest 日志 pastebin。

我注意到一个奇怪的现象,即在多个地址中,总是第一个字节的最后一位失败。以下是日志的一部分,显示了这种情况。

2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 1, Address: 252A019F8, Expected: FEF7FFFF, Actual: FFF7FFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 1, Address: 253201A38, Expected: FEFEFFFF, Actual: FFFEFFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 255641A98, Expected: FEF7FFFF, Actual: FFF7FFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 255E41CB8, Expected: 00000000, Actual: 01000000
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 257641A78, Expected: FEF7FFFF, Actual: FFF7FFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 257E41C98, Expected: 00000000, Actual: 01000000
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 259201A58, Expected: FEFEFFFF, Actual: FFFEFFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 259201B58, Expected: FEEFFFFF, Actual: FFEFFFFF
2018-01-27 07:19:35 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 259645310, Expected: 01004000, Actual: 00004000
2018-01-27 07:19:36 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 259A01A18, Expected: FEFFF7FF, Actual: FFFFF7FF
2018-01-27 07:19:36 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 259A01AD8, Expected: FEFFBFFF, Actual: FFFFBFFF
2018-01-27 07:19:36 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 25B201A38, Expected: FEFEFFFF, Actual: FFFEFFFF
2018-01-27 07:19:36 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 25B201B38, Expected: FEEFFFFF, Actual: FFEFFFFF

我在两台不同的计算机上测试了 RAM,结果出现了相同的错误。这些结果是否能告诉我内部逻辑中正在发生的错误?我认为这是因为一组字节共享相同的寻址逻辑,但我认为故障在内存字节中是连续的。或者可能是所有这些地址的故障位都是相同的,并且由于某种原因,每次重新运行时同一个字节都会被赋予不同的地址?

其次,内存测试只失败了几个测试,具体来说,即使经过多次内存测试,它也没有失败测试 0 到 2。我只对每个测试的作用有基本的了解,但令我惊讶的是,前几个测试从未导致错误。有什么原因吗?

答案1

这可能是因为这篇维基百科文章中描述的布局:排锤

在动态 RAM (DRAM) 中,存储的每一位数据都占据一个单独的存储单元 […]

存储单元(图中蓝色方块)进一步组织成矩阵,并通过行和列进行寻址。应用于矩阵的存储地址分为行地址和列地址,由行和列地址解码器(图中分别为垂直和水平绿色矩形)处理。在行地址选择要执行读取操作的行(该选择也称为行激活)后,行中所有单元的位都会传输到形成行缓冲器(图中红色方块)的感测放大器中,然后使用列地址从中选择精确的位。

图像

图片来源(公共领域)

假设:某个行缓冲区的某个位出现问题(红色方块);它会影响缓冲区对应的任何行的读取。我并不是说每次都会发生这种情况,对于每一行和任何写入的数据都会发生这种情况;但我相信这个矩阵形式和行缓冲区(或类似的东西)与第一个字节的最后一位总是失败的事实有关。


其次,memtest 只失败了几个测试,具体来说,它没有失败测试 0 到 2 […]。我很惊讶前几个测试从未导致错误。有什么原因吗?

本手册解释测试是什么:

  • 测试 0 [地址测试,步行,无缓存]

使用步行地址模式测试所有存储库中的所有地址位。

  • 测试 1 [地址测试,自身地址,顺序]

每个地址都写入自己的地址,然后检查一致性。理论上,之前的测试应该已经发现任何内存寻址问题。此测试应该可以发现之前未检测到的任何寻址错误。此测试按顺序在每个可用 CPU 上进行。

  • 测试2[地址测试,自身地址,并行]

与测试 1 相同,但使用所有 CPU 和重叠地址并行进行测试。

我知道测试 0-2 旨在捕获寻址错误,不一定是实际数据错误。请注意,如果他们能够捕获所有错误,那么就不需要进一步测试了。

相关内容