友人と私は、メモリ内のシングル ビット エラーの割合を調べることで、電離放射線のレベルを検出できるかどうかについて興味を持っていました。少し調べてみたところ、ほとんどのエラーはハードウェア レベルで検出され、修正されていると思います。ソフトウェア (PC の C コードなど) のエラーを検出する方法はありますか?
3 に答える
実行しているアーキテクチャに依存していると確信していますが、すぐにメモリ内のシングル ビット エラーを検出することはないと確信しています。すべてではないにしても、ほとんどの RAM コントローラは、RAM チップが持つまれなビットの問題から保護するために、何らかの形式の ECC 保護を実装する必要があります。たとえば、DDR RAM は、機能を保証する前に ECC 保護の X ビット数 (8 ~ 16 程度) を要求する仕様になっているフラッシュ メモリなどのがらくたメディアと比較して非常に信頼性があります。ビット エラーが一定数以下である限り、不良ビットは修正され、CPU ソフトウェア レベルに到達する前に報告されない可能性があります。
ストレージ業界では、単一のビット エラーのような単純な原因によるサイレント (報告されていない) データ破損は、非常に「ノーノー」と見なされているため、メモリ メーカーはおそらく、アプリケーションがそれを認識できないようにするために最善を尽くしています。対処してください!
In any case, one common way to detect problems in any sort of memory is to run simple write compare loops over the address space. Write 0's to all your memory and read it back to detect stuck '1' data lines, write-read-compare F's to memory to detect stuck '0' data lines, and run a data ramp to help detect addressing problems. The width of the data ramp should adjust according to the address size. (i.e. 0x00, 0x01, 0x02... or 0x0000, 0x0001, 0x0002, etc). You can easily do these types of things using storage performance benchmarking tools like Iometer or similar, although it may be just as easy to write yourself.
現実的には、問題に多くの時間を割くつもりでない限り、始める前にやめたほうがよいでしょう。エラーが検出されたとしても、電離放射線ではなく、電力の問題のようなものが原因である可能性はかなり高いです (通常、どちらに遭遇したかを知る方法はありません)。
とにかく先に進むことにした場合、テストする明らかな方法は、メモリを割り当て、それに値を書き込んで、それらを読み戻すことです。期待値が他のメモリから読み取ることなく把握できる、十分に予測可能なパターンに従う必要があります (少なくとも、何か悪いことが起こったことを特定するだけでなく、エラーを分離できるようにしたい場合)。
電離放射線と他のエラーを本当に区別したい場合は、少なくとも理論的には可能です。高度の異なる複数のコンピューターで同時にテストを実行し、高度が高いほどレートが高くなるかどうかを確認します。
エラーが頻繁に発生し、エラーを検出できる可能性がある場合は、すでに大きな問題に直面しています。何も機能しません。または、少なくとも、Win95 を最初から使用しているように感じるでしょう。この種のエラーを測定するには、データセンター全体が必要になると思います。