我和一个朋友很好奇你是否可以通过查看内存中的单比特错误率来检测电离辐射水平。我做了一些研究,我猜大多数错误都在硬件级别被捕获和修复。是否有任何方法可以检测软件中的错误(例如,在 PC 上的 c 代码中)?
3 回答
我确定这取决于您运行的架构,但我很确定您不会很快检测到内存中的任何单个位错误。大多数(如果不是全部)RAM 控制器都应该实施某种形式的 ECC 保护,以防止 RAM 芯片出现罕见的位问题。例如,与闪存等垃圾介质相比,DDR RAM 非常可靠,闪存将被指定为在保证功能之前需要 X 位数的 ECC 保护(大约在 8 到 16 位左右)。只要您有一定数量的位错误,坏位就会被纠正,甚至在达到 CPU 软件级别之前可能不会报告。
像单个位错误这样简单的事情导致的无声(未报告)数据损坏在存储行业被认为是一个巨大的“禁忌”,因此您的内存制造商可能已经尽了最大的努力来阻止您的应用程序看到它,更不用说让您处理它!
在任何情况下,检测任何类型内存中的问题的一种常见方法是在地址空间上运行简单的写比较循环。将 0 写入所有内存并将其读回以检测卡住的“1”数据线,将 F 写入内存以检测卡住的“0”数据线,并运行数据斜坡以帮助检测寻址问题。数据斜坡的宽度应根据地址大小进行调整。(即 0x00、0x01、0x02... 或 0x0000、0x0001、0x0002 等)。您可以使用 Iometer 或类似的存储性能基准测试工具轻松完成这些类型的事情,尽管您自己编写可能同样容易。
实际上,除非您要花大量时间解决问题,否则您最好在开始之前退出。即使您确实检测到错误,也很有可能是由于电源问题,而不是电离辐射(而且您通常无法判断遇到了什么问题)。
如果您决定继续进行,显而易见的测试方法是分配一些内存,向其中写入值,然后将它们读回。您希望遵循足够可预测的模式,无需从其他内存中读取即可计算出预期值(至少如果您希望能够隔离错误,而不仅仅是确定发生了不好的事情)。
如果你真的想区分电离辐射和其他错误,至少理论上应该是可能的。同时在不同高度的多台计算机上运行您的测试,看看您是否在更高的高度看到更高的速率。
如果错误足够频繁,以至于您有任何机会检测到它们,那么您已经遇到了大麻烦-没有任何作用。或者至少你会觉得你在重新使用 Win95。我怀疑你需要一个完整的数据中心才能有机会测量这种错误。