システム:組み込み、arm64(4xCortexA53)、2GB LPDDR3、eMMCメモリ、Linux、カーネル5.4.17。
デバイスや設定によっては、通常の操作で2日ごとまたは「週」ごとに発生するランダムなシステムクラッシュが発生します。根本原因を引き起こす可能性がある次のテストシナリオに範囲を絞り込みました。
- ファイルシステム(rootfs、読み取り専用パーティション)からファイルを読み取る:/usr/bin/、/etc/、/usr/libなど
- ファイルからmd5sumを計算してtmp / logファイルに書き込みます。
- ループを繰り返します。次回実行するときにmd5sumが異なる場合は、「修正済み」ファイルを保存してください。
多くのループの後、ファイルが異なって見えるようになり、これはバイナリ、libs、スクリプトなどの任意のファイルで発生する可能性があります。この違いは完全にランダムではありません。他のすべてのバイトだけが間違っています。奇数または偶数バイトにすることができますが、完全にランダムに混乱するわけではありません。不良バイトのパターン(たとえば、単一ビットの反転、他のファイルとの混合など)を追跡できませんでした。無効なブロックのサイズもランダムです(とにかく1ページ以上)。
ファイルを「正常な状態」に復元するには、/proc/sys/vm/drop_cachesのエコーを使用してページキャッシュまたはinodeキャッシュを消去します。したがって、これはeMMCメモリの問題ではありません。定期的にキャッシュを消去することも役に立ちません。各実行は多少独立しており、問題を引き起こす可能性があります。
DDR設定/レイアウトに関連する低レベルの問題、ページキャッシュの問題(可能性は低い)、または重大なメモリリークが疑われます。
質問:
一部のLinuxツールを使用して、割り当てられた誤ったページの物理アドレスを取得できますか?ファイルのmmpedメモリブロックを取得し、仮想ページを見つけ、仮想アドレスを物理アドレスに変換することが可能であると思います。これに役立つ単一のツールはありますか?
DDRリフレッシュタイミングはここで機能しますか?
DDRの「生のハンマー」の問題について読みましたが、これは非常に具体的で可能性が低いようです。誰でも経験がありますか?
どんなアドバイスにも感謝します。ありがとう
答え1
DDR セルフリフレッシュを無効にすると役に立ちます。一般的なDDR問題ではなく、CPUおよび/またはDDRベンダーに関連しているようです。 DDRセットアップフェーズ中にブートローダで実行する必要があります。