9

AndroidデバイスのRAMで完全なメモリテストを行う方法はありますか?

私はドライバーを開発していますが、ランダムな時間に、ドライバーが間違った状態になる原因となる間違った値を持つ特定の物理アドレスを取得します。問題が発生したときにRAMから読み込もうとしています。デバイスの RAM の特定の部分が破損していると思います。

4

3 に答える 3

7

完全はあいまいな言葉です。これは、さまざまな温度、電圧、およびさまざまなコンポーネントの許容範囲を持つさまざまなデバイスを意味する場合があります。MemTest86のサイトとして、私は理解していると思います。私が見たほとんどのプロジェクトはCベースであり、すべてをテストすることはできません。

これはLinuxで実行されているものです- http://www.madsgroup.org/~quintela/memtest/

ウォーキング ビットなどの文書化されたアルゴリズムがあります。多くは RAM の種類によって異なります。あなたはある種のSDRAMを持っていると思います。SDRAMにはさまざまなサイクルがあります。シングル ビートの読み取り/書き込み、バンク間転送、ターミネート バーストなどがあります。

個人的には、Ethernet (DMA) 経由で SSH 転送を行うと、ボードの 5% で問題が発生するシステムがありました。SSH には、CPU/メモリを集中的に使用する暗号化が含まれており、DMA エンジンは、多くの場合、CPU (キャッシュあり) とは異なる SDRAM サイクルを実行します。

ここにいくつかの要件があります。

  1. コードが常駐するための非 SDRAM メモリ。
  2. ベアメタル フレームワーク (キャッシュ、割り込み、DMA などなし)
  3. Dキャッシュをオフにします。
  4. コードの ICache をオンにします。

もう 1 つの制限要件は、実行時間です。完全なSDRAMテストを 1 つのボードで実行するには、何年もかかる可能性があります。疑似ランダム アドレス/データ テストがうまく機能することがわかりました。SDRAM のサイズに対して素数である数値を取得し、それをインクリメントとして使用するだけです。最も単純なケースは1. 他のものを常に変更したりrowsbanksデバイスのサイズを変更したりすることをお勧めします。bank size-1例えば; ただし、常に変化するビットの量が異なるため、素数の方がうまく機能します。キャッシュをオフにすると、 、 、 、およびポインターを使用してcharshortいくつintlong longの異なるバースト長をテストできます。これらのテストは遅くなります。ldm/stm完全にシミュレートするには、ペアを使用する必要があります。SDRAM バースト、これらはキャッシュがオンの場合により一般的であるため、 でシミュレートする必要がありますldm/stm。これも最速のテストの 1 つです。

typedef unsigned char b8;
typedef unsigned short b16;
typedef unsigned long b32;
typedef unsigned long long b64;

/* マクロを使用してコードを高速化します。コンパイラは定数を使用します
 * スピルを引き起こすレジスタの代わりに _incr と _wrap。あ
 * マクロはメモリ テスト ロジックを一元化します。
 */
#define MEMTEST(name,type,_incr,_wrap) ...

/* 順次テスト。*/
MEMTEST(do_mem_seq8, b8, 97, 1)
MEMTEST(do_mem_seq16, b16, 50839, 1)
MEMTEST(do_mem_seq32, b32, 3999971, 1)
MEMTEST(do_mem_seq64, b64, 3999971, 1)

/* ランダム テスト。これらのテストは、データと
 *アドレスアクセス。
 */

/* char の場合は 97/0x61 素数、64MB の場合は 9999991/0x989677 素数。*/
MEMTEST(do_mem_rnd8,b8,97,9999991)
/* 64k の場合は 50839/C697 ラージ プライム、64MB の場合は 9999991/0x989677 プライム。*/
MEMTEST(do_mem_rnd16,b16,50839,9999991)
/* 64MB の場合は 3999971/3D08E3 プライムおよび 9999991/0x989677 プライム。*/
MEMTEST(do_mem_rnd32,b32,3999971,9999991)
/* 64MB の場合は 3999971/3D08E3 プライムおよび 9999991/0x989677 プライム。*/
MEMTEST(do_mem_rnd64,b64,3999971,9999991)

incrはデータの増分で、wrapはアドレスの増分です。バーストのアルゴリズムは同じです。ここにいくつかのインライン gcc アセンブラがあります。

    register ulong t1 asm ("r0")  = 0;                              \
    register ulong t2 asm ("r4")  = t1 + incr;                      \
    register ulong t3 asm ("r6")  = t2 + incr;                      \
    register ulong t4 asm ("r8")  = t3 + incr;                      \
        /* Run an entire burst line. */                             \
        __asm__ (" stmia  %[ptr], {%0,%1,%2,%3}\r\n" : :            \
                 "r" (t1), "r" (t2), "r" (t3), "r" (t4),            \
                 [ptr]"r" (start + (addr<<2)) :                     \
                 "memory" );                                        \
        /* Read four 32 bits values. */                             \
        __asm__ (" ldmia   %[ptr], {%0, %1, %2, %3}\r\n" :          \
                 "=r" (t1), "=r" (t2), "=r" (t3), "=r" (t4) :       \
                 [ptr]"r" (start + (addr<<2)) );                    \

これらのテストは単純で、RAM への負荷を最大化するコード キャッシュに収まる必要があります。主な問題は DQS 遅延でした。これは DDR-SDRAM にとって重要であり、温度と電圧に依存する可能性があり、PCB レイアウトと材料によって異なります。

SDRAM チップでメモリ コントローラ レジスタを最適化する場合は、Cachbenchを使用できます。テストにも役立つかもしれません。

参照: Unix Stack Exchange (same question)。これらのCベースのテスト スイートを Linux で使用しましたが、このケースでは問題は発生しませんでした。memtest86 アルゴリズムは、上で説明したほど (PCB の不具合の場合) ストレスが少ないかもしれません。テスト7またはburnBXテストは近いですが。memtest86は、ボード設計の問題ではなく、DRAM チップの問題を見つけるのに適していると思います。

編集:もう 1 つの問題は、SDRAM チップとのトランジェント/クロストークです。デバイス ドライバが高電流デバイスまたは高周波数デバイスの場合、SDRAM インターフェイスがクロストークを拾ったり、電源の変動により2 倍のクロックが得られたりする可能性があります。そのため、 RAM テストでは問題が表示されず、SDRAM エラーはハードウェアの特定の部分が使用されている場合にのみ発生します。また、Android デバイスは動的クロックを使用せず、SDRAM 周波数を変更しないことに注意してください。クロックが変化すると、信号が共鳴を横切ることがあります。

于 2013-01-28T15:33:09.103 に答える
0

2021 年 2 月現在、 MemTest86の ARM ベースのバージョンがあります。x86 ディスク イメージと同じパッケージに入っています。

ただし、起動するには UEFI BIOS を搭載したマシンが必要です。そのため、ほとんどのデスクトップおよびサーバー グレードのマシンでは問題ありませんが、BIOS が組み込まれていない小型の ARM ベースのデバイスでは問題があります。

于 2021-02-10T05:44:12.270 に答える