可以在软件中检测内存中的位错误吗?

时间:2011-08-16 23:15:12

标签: c memory hardware ram hardware-interface

一位朋友和我很好奇你是否可以通过查看内存中单个位错误的比率来检测电离辐射的水平。我做了一些研究,我猜大多数错误都是在硬件级别上捕获并修复的。有没有办法检测软件中的错误(例如,在PC上的c代码中)?

3 个答案:

答案 0 :(得分:5)

我确定这取决于您运行的架构,但我很确定您不会很快检测到内存中的任何单个位错误。大多数(如果不是所有)RAM控制器都应该实现某种形式的ECC保护,以防止RAM芯片出现的罕见位问题。例如,与闪存等垃圾介质相比,DDR RAM非常可靠,在保证功能之前,它将指定要求ECC保护的X位数(大约在8到16之间)。只要您遇到一定数量的误码,就会纠正坏位,甚至可能在达到CPU软件级别之前没有报告。

从单个位错误这样简单的事件导致的静默(未报告)数据损坏在存储行业被认为是一个巨大的“禁忌”,因此您的内存制造商可能已经做了最糟糕的事情来阻止您的应用程序看到它减少让你处理它!

在任何情况下,检测任何类型内存中的问题的一种常见方法是在地址空间上运行简单的写入比较循环。将0写入所有内存并将其读回以检测卡住的'1'数据线,写入 - 读取 - 比较F到内存以检测卡住的'0'数据线,并运行数据斜坡以帮助检测寻址问题。数据斜坡的宽度应根据地址大小进行调整。 (即0x00,0x01,0x02 ......或0x0000,0x0001,0x0002等)。您可以使用Iometer或类似工具等存储性能基准测试工具轻松完成这些类型的操作,尽管编写自己可能同样容易。

答案 1 :(得分:3)

实际上,除非你要将很多时间专门用于解决问题,否则你最好在开始之前退出。即使您确实检测到错误,也可能是相当公平的,这是由于电源问题,而不是电离辐射(你通常无法分辨你遇到的情况)。

如果您决定继续进行,显而易见的测试方法是分配一些内存,为其写入值并将其读回。您希望遵循足够可预测的模式,您可以在不读取其他内存的情况下找出预期值(至少如果您希望能够隔离错误,而不仅仅是确定发生了错误的事情)。

如果你真的想区分电离辐射和其他错误,至少在理论上应该是可能的。同时在不同海拔高度的多台计算机上运行测试,看看你是否在更高的海拔高度看到更高的速率。

答案 2 :(得分:0)

如果错误频繁,你有机会发现它们,你就会遇到大麻烦 - 什么都行不通。或者至少你觉得你再次使用Win95。我怀疑你需要一个完整的数据中心来测量这种错误。