Memtest86+ は、x86 および x86-64 アーキテクチャのコンピューター用の無料のオープンソースのスタンドアロン メモリ テスターです。 BIOS メモリ テストよりもはるかに徹底的なメモリ チェックが行われます。
また、オペレーティング システムが使用するメモリに制限されず、UEFI ライブラリなどの基盤となるソフトウェアに依存せず、コンピュータのほぼすべてのメモリにアクセスできます。
Memtest86+ は、PC BIOS (レガシーまたは UEFI) によって直接ロードすることも、Linux 16 ビット、32 ビット、64 ビット、または EFI ハンドオーバー ブート プロトコルをサポートする中間ブートローダー経由でロードして実行することもできます。 Pentium クラス以降の 32 ビットまたは 64 ビット CPU で動作するはずです。
バイナリ リリース (安定版と夜間の開発ビルドの両方) は memtest.org で入手できます。
Memtest86+ v6.00 は PCMemTest をベースにしており、以前の Memtest86+ v5 をフォークして書き直したもので、これは MemTest-86 のフォークでした。 PCMemTest の書き換えの目的は次のとおりです。
PCMemTest の作成過程で、システム メモリのテストに厳密には必要のなかった Memtest86+ v5 の多くの機能が削除されました。特に、キャッシュとメインメモリの速度を測定したり、DRAM タイプを特定して報告したりする試みは行われていません。これらの機能は Memtest86+ v6.0 で再度追加および拡張され、統合された完全な機能を備えたリリースが作成されました。
Memtest86+ は、GNU General Public License バージョン 2 (GPLv2) の条件に基づいてリリースされています。 GPL の規定以外には、私的または商業的使用に制限はありません。詳細については、LICENSE ファイルを参照してください。
ビルドは Linux システムでのみテストされていますが、GNU ツールチェーンと ELF ファイル形式を使用するどのシステムでも実行できるはずです。必要なツールは次のとおりです。
32 ビット イメージをビルドするには、ディレクトリをbuild32
ディレクトリに変更し、 make
入力します。その結果、レガシー BIOS (フロッピー モード) によって直接ブートできるmemtest.bin
バイナリ イメージ ファイル、または Linux 16 ビット ブート プロトコルを使用する中間ブートローダーによって直接ブートできるmemtest.efi
バイナリ イメージ ファイルが生成されます。 32 ビット UEFI BIOS による。どちらのイメージも、Linux 32 ビットまたは 32 ビット EFI ハンドオーバー ブート プロトコルを使用して中間ブートローダーによってブートできます。
64 ビット イメージをビルドするには、ディレクトリをbuild64
ディレクトリに変更し、 make
入力します。その結果、レガシー BIOS (フロッピー モード) によって直接ブートできるmemtest.bin
バイナリ イメージ ファイル、または Linux 16 ビット ブート プロトコルを使用する中間ブートローダーによって直接ブートできるmemtest.efi
バイナリ イメージ ファイルが生成されます。 64 ビット UEFI BIOS による。どちらのイメージも、Linux 32 ビット、64 ビット、または 64 ビット EFI ハンドオーバー ブート プロトコルを使用して中間ブートローダーによってブートできます。
どちらの場合も、起動可能な CD、DVD、または USB フラッシュ ドライブの作成に使用できる ISO イメージを構築するには、 make iso
と入力します。結果として、 memtest.iso
ISO イメージ ファイルが作成されます。これは、空の CD または DVD、または USB フラッシュ ドライブに直接書き込むことができ、レガシーまたは UEFI PC BIOS によって直接起動できます。
USB フラッシュ ドライブに書き込む場合は、 dd
コマンドを使用するか、同じ機能を提供するユーティリティを使用して、ISO イメージを RAW デバイスに直接書き込む (「ダンプ」する) 必要があることに注意してください。
中間ブートローダーを使用する場合は、 memtest.bin
ファイルまたはmemtest.efi
ファイルをブートローダーがアクセスできるディスク パーティションに保存し、Linux カーネルであるかのようにそのファイルからブートするようにブートローダー構成を更新する必要があります。初期RAMディスクがありません。以下で説明するように、いくつかのブート コマンド ライン オプションが認識されます。 16 ビット ブート プロトコルを使用する場合、Memtest86+ はディスプレイをテキスト モード (640x400) で使用します。 32 ビットまたは 64 ビットのブート プロトコルを使用する場合、Memtest86+ は、ブートローダーによって渡されるboot_params
構造体の指定に従って、テキスト モードまたはグラフィック モードのいずれかでディスプレイを使用します。グラフィックス モードの場合、提供されるフレームバッファは少なくとも 640x400 ピクセルである必要があります。大きい場合、ディスプレイは中央に表示されます。システムが UEFI モードで起動された場合は、グラフィック モードを使用する必要があります。
テスト目的で、GRUB を中間ブートローダーとして使用する ISO イメージを構築するオプションもあります。詳細については、 build32
またはbuild64
ディレクトリのMakefile
参照してください。 ISO イメージはレガシーと UEFI の両方でブート可能であるため、レガシーと EFI ブートの両方の GRUB モジュールがビルド システムにインストールされている必要があります (たとえば、Debian では、必要な GRUB モジュールはパッケージgrub-pc-bin
、 grub-efi-ia32-bin
にあります) grub-efi-ia32-bin
およびgrub-efi-amd64-bin
)。システム上の名前と一致するように、Makefile 内の一部のパスとファイル名を調整する必要がある場合があります。
grub
ディレクトリに含まれる GRUB 設定ファイルは、テスト ISO で使用するために存在しますが、GRUB から Memtest86+ を起動する方法の例としても機能します。
中間ブートローダーはブート コマンド ラインを Memtest86+ に渡す場合があります。コマンドラインには、スペースで区切られた 1 つ以上のオプションを含めることができます。各オプションは、オプション名とそれに続く=
記号と 1 つ以上のパラメータで構成され、カンマで区切られます。次のオプションが認識されます。
0x
プレフィックス付き (例: 0xFEDC9000) Memtest86+ は、レガシー キーボード インターフェイス (I/O ポート 0x60 および 0x64 を使用) と USB キーボード (独自の USB デバイス ドライバーを使用) の両方をサポートします。どちらか一方、または両方をブート コマンド ラインで選択できます。コマンド ラインで指定しない場合、デフォルトでは、システムが UEFI モードでブートされている場合は両方が使用され、それ以外の場合はレガシー インターフェイスのみが使用されます。
古い BIOS は通常、USB レガシー キーボード エミュレーションをサポートしており、USB キーボードはポート 0x60 および 0x64 に接続されたレガシー キーボードのように動作します。多くの場合、これは BIOS セットアップ メニューで有効または無効にできます。 Memtest86+ の USB デバイス ドライバーが有効になっている場合、ドライバーはこれをオーバーライドし、USB キーボードに直接アクセスします。その欠点は、USB コントローラーとデバイス ドライバーが私的使用のために一部のメモリを予約する必要があるため、メモリをメモリ テストでカバーできないことです。したがって、テスト カバレッジを最大化するには、サポートされている場合は USB レガシー キーボード エミュレーションを有効にし、UEFI モードで起動する場合は起動コマンド ラインにkeyboard=legacy
を追加します。
メモ: 一部の UEFI BIOS は、BIOS セットアップで互換性システム モジュール (CSM) を有効にした場合にのみ、USB レガシー キーボード エミュレーションをサポートします。実際にレガシー モードで起動する場合にのみサポートするものもあります。
多くの USB デバイスは USB 仕様に完全には準拠していません。 USB キーボード プローブがハングするかキーボードの検出に失敗する場合は、「usbinit」ブート オプションで提供されるさまざまな回避策を試してください。
注: ホットプラグは、現在、Memtest86+ USB ドライバーではサポートされていません。これらを使用する場合、Memtest86+ を実行する前に USB キーボードを接続し、テスト中は接続したままにしておく必要があります。
一部の 2-in-1 マシンでは、ネイティブではポートレート モード ディスプレイである LCD パネルが使用されていますが、キーボードに接続すると側面に取り付けられます。ディスプレイをグラフィックス モードで使用する場合、Memtest86+ はそれに合わせてディスプレイを回転できます。 LCD パネルの向きに応じて、起動コマンド ラインに「screen.rhs-up」または「screen.lhs-up」オプションを追加します。ディスプレイをテキスト モードで使用する場合、BIOS がこれを自動的に処理することが期待されます。
レガシー モードで起動すると、Memtest86+ は BIOS または中間ブートローダーによって設定された画面解像度を使用します。 UEFI モードで起動すると、Memtest86+ は通常、640x400 ピクセルのディスプレイを含む利用可能な最小の画面解像度を選択します。一部の BIOS は、使用可能な表示モードに関する誤った情報を返すため、ブート コマンド ラインに「screen.mode=」オプションを追加することでこれを上書きできます。
ディスプレイの回転を使用する場合、指定された画面解像度は回転されていないディスプレイに対するものであることに注意してください。
起動すると、Memtest86+ は表示を初期化し、ユーザーが操作を設定できるように数秒間一時停止します。キーが押されない場合、単一の CPU コアを使用してすべてのテストの実行が自動的に開始され、ユーザーがマシンを再起動するか停止するまで無期限に継続されます。
起動時およびテストの実行時、Memtest86+ は次のキーに応答します。
スクロール ロックが有効でスクロール領域がいっぱいの場合、テストは停止することに注意してください。
設定メニューを使用すると、ユーザーは次のことができます。
いずれの場合も、ファンクション キーの代わりに数字キーを使用できます (1 = F1、2 = F2、... 0 = F10)。
エラー報告モードは、現在のテスト シーケンスを中断することなくいつでも変更できます。エラー統計は、現在のエラー報告モードに関係なく収集されます (したがって、エラー概要モードに切り替えると、現在のテスト シーケンスの開始以降に蓄積された統計が表示されます)。 BadRAM パターンは、BadRAM モードの場合にのみ蓄積されます。 Linux memmap 領域は、memmap モードの場合にのみ蓄積されます。不良ページ番号は、不良ページ モードの場合にのみ蓄積されます。
選択したテスト、アドレス範囲、または CPU シーケンス モードを変更すると、新しいテスト シーケンスが開始され、エラー統計がリセットされます。
エラー数のみモードでは、現在のテスト シーケンスの開始以降に検出されたエラーの総数が表示されるだけです。
エラー概要モードでは、次の情報が表示されます。
個別エラー モードでは、エラー インスタンスごとに次の情報が表示されます。
BadRAM パターン モードは、Linux BadRAM 機能または GRUB badram コマンドで使用するエラー パターンを蓄積および表示します。行はbadram=F1,M1,F2,M2...
の形式で出力されます。各F,M
ペアでは、 F
障害アドレスを表し、 M
そのアドレスのビットマスクです。これらのパターンは、M のすべての1
ビットが F に等しいアドレスで障害が発生したことを示します。このようなパターンでは、実際に存在するよりも多くのエラーがキャプチャされる可能性がありますが、少なくともすべてのエラーがキャプチャされます。これらのパターンは、ハードウェア構造によって引き起こされるエラーの規則的なパターンを簡潔な構文で捕捉するように設計されています。
BadRAM パターンは、すべてのエラーの概要から計算されるのではなく、段階的に増加します。多くの実際的な理由から、ペアの数は 20 に制限されています。その結果、宛名印刷モードで出力からパターンを手作りすると、例外的に、より良い結果が得られる場合があります。
注意個々のテストの説明で述べたように、ウォーキング ワン アドレス テスト (テスト 0) とブロック移動テスト (テスト 7) は、BadRAM パターンには影響しません。これらのテストでは障害の正確なアドレスを決定できないためです。 。
Linux memmap モードは、[Linux memmap ブート コマンド ライン オプション] (https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt) で使用するために、障害のあるメモリ領域を蓄積して表示します。行はmemmap=S1$A1,S2,A2...
の形式で出力されます。各S,A
ペアでは、 A
領域内の最初のアドレスを表し、 S
領域のサイズ (バイト単位) を表します。最大 20 個の不良メモリ領域が記録されます。連続した障害箇所が 20 個を超える領域で検出されると、領域が結合されます。これは、一部の領域に障害のない場所が含まれることを意味します。プログラムは、含まれる障害のない場所の数を最小限に抑えようとします。
注個々のテストの説明で述べたように、ウォーキング 1 アドレス テスト (テスト 0) とブロック移動テスト (テスト 7) は、障害の正確なアドレスを特定できないため、障害のあるメモリ領域には影響しません。決定した。
不良ページ モードでは、不良メモリ ページ番号が蓄積されて表示されます。これらを Windows bcdedit コマンドで使用して、これらのページを Windows PFA メモリ リストに追加できます。ページ番号は、単一の 16 進数 (例: 0x20
) または 16 進数のページ番号の範囲 (例: 0x20..0x2a
) として表示されます。最大 20 範囲の欠陥ページが記録されます。連続した欠陥ページの範囲が 20 を超えて見つかると、範囲がマージされます。これは、一部の範囲に欠陥のないページが含まれていることを意味します。プログラムは、含まれる欠陥のないページの数を最小限に抑えようとします。
注個々のテストの説明で述べたように、ウォーキング ワン アドレス テスト (テスト 0) とブロック移動テスト (テスト 7) は、欠陥の正確なアドレスを特定できないため、欠陥のあるページ番号には影響しません。決定した。
Memtest86+ によって報告されるすべてのエラーがメモリ不良によるものではないことに注意してください。このテストでは、CPU、キャッシュ、マザーボードが暗黙的にテストされます。テストでは、障害が発生する原因を特定することはできません。ほとんどの失敗はメモリの問題が原因です。そうでない場合、唯一の選択肢は、障害が修正されるまで部品を交換することです。
メモリ エラーが検出された後、障害が発生したモジュールを特定することは明確な手順ではありません。マザーボードのベンダーが多数あり、メモリ スロットの組み合わせが考えられるため、特定のエラーが障害のあるメモリ モジュールにどのようにマッピングされるかについて完全な情報を収集することは、不可能ではないにしても困難です。ただし、障害のあるモジュールを特定するために実行できる手順があります。以下に、使用するとよいテクニックをいくつか示します。
モジュールの削除
回転モジュール
モジュールの交換
コンポーネントの互換性がないためにメモリ エラーが発生することがあります。メモリ モジュールは、あるシステムでは正常に動作しても、別のシステムでは正常に動作しない場合があります。これは珍しいことではなく、混乱の原因となります。コンポーネントが必ずしも悪いわけではありませんが、特定の組み合わせは避ける必要がある場合があります。
ほとんどの場合、Memtest86+ によって報告されるエラーは有効です。一部のシステムでは、Memtest86+ がメモリのサイズについて混乱し、存在しないメモリをテストしようとします。これにより、多数の連続したアドレスが不良として報告され、一般に多くのビットがエラーになります。失敗したアドレスの数が比較的少なく、エラーが 1 ビットまたは 2 ビットだけであれば、エラーが有効であると確信できます。また、断続的なエラーは常に有効です。
有効なメモリ エラーはすべて修正する必要があります。通常の操作では特定のエラーが発生しない可能性があります。ただし、余裕のあるメモリで操作するのは危険であり、データ損失やディスク破損につながる可能性があります。
Memtest86+ では、多くの種類の PC 障害を診断できません。たとえば、CPU に欠陥があり、OS がクラッシュした場合、Memtest86+ も同じようにクラッシュする可能性が高くなります。
Memtest86+ の完全なパスに必要な時間は、CPU 速度、メモリ速度、メモリ サイズによって大きく異なります。 Memtest86+ は無期限に実行されます。パス カウンタは、選択したテストがすべて実行されるたびに増加します。一般に、最もわかりにくいエラーを除くすべてのエラーを検出するには、1 回のパスで十分です。ただし、断続的なエラーが疑われる場合は、完全に確信を得るために、より長い期間テストすることをお勧めします。
メモリをテストするための優れたアプローチは数多くあります。ただし、多くのテストでは、メモリ アーキテクチャやエラーを最適に検出する方法について深く考えたり知識を持たずに、単にいくつかのパターンをメモリにスローします。これはハード メモリ障害にはうまく機能しますが、断続的なエラーを見つけるにはほとんど効果がありません。 BIOS ベースのメモリ テストは、断続的なメモリ エラーの検出には役に立ちません。
メモリ チップは、データの各ビットに 1 つずつ、密に詰め込まれたメモリ セルの大きなアレイで構成されます。断続的な障害の大部分は、これらのメモリ セル間の相互作用の結果です。多くの場合、メモリ セルに書き込みを行うと、隣接するセルの 1 つに同じデータが書き込まれることがあります。効果的なメモリ テストでは、この状態をテストしようとします。したがって、メモリをテストするための理想的な戦略は次のようになります。
この戦略には、メモリ セルがチップ上でどのようにレイアウトされているかについての正確な知識が必要であることは明らかです。さらに、さまざまなチップの種類やメーカーごとに考えられるチップ レイアウトの数は無限にあり、この戦略は現実的ではありません。ただし、この理想的な戦略に近似できるテスト アルゴリズムがあります。
Memtest86+ は、上記の理想的なテスト戦略の合理的な近似を提供する 2 つのアルゴリズムを使用します。これらの戦略の最初の戦略は、移動反転と呼ばれます。移動反転テストは次のように機能します。
このアルゴリズムは理想的なメモリ テストによく近似していますが、いくつかの制限があります。現在、ほとんどの高密度チップは 4 ~ 16 ビット幅のデータを保存します。 1 ビット幅を超えるチップでは、1 ビットだけを選択的に読み書きすることは不可能です。これは、隣接するすべてのセルの相互作用がテストされていることを保証できないことを意味します。この場合、私たちができる最善の方法は、いくつかのパターンを使用して、すべての隣接するセルに、少なくとも可能なすべての 1 と 0 の組み合わせが書き込まれていることを確認することです。
また、キャッシュ、バッファリング、アウトオブオーダー実行が移動反転アルゴリズムに干渉し、効率が低下することもわかります。キャッシュをオフにすることは可能ですが、新しい高性能チップのメモリ バッファリングを無効にすることはできません。この制限に対処するために、Modulo-20 と呼ばれる新しいアルゴリズムが作成されました。このアルゴリズムは、キャッシュやバッファリングの影響を受けません。アルゴリズムは次のように機能します。
このアルゴリズムは、移動反転とほぼ同じレベルの隣接テストを実行しますが、キャッシュやバッファリングの影響を受けません。個別の書き込みパス (1.1、1.2) と読み取りパス (1.4) がすべてのメモリに対して実行されるため、すべてのバッファとキャッシュがパス間でフラッシュされることが保証されます。歩幅サイズとして 20 を選択したのは、やや恣意的です。ストライドを大きくすると効果的になる可能性がありますが、実行には時間がかかります。 20 という選択は、速度と徹底性の間の合理的な妥協点であると思われます。
Memtest86+ は、番号付きの一連のテストを実行してエラーをチェックします。これらのテストは、テスト アルゴリズム、データ パターン、キャッシュの組み合わせで構成されます。これらのテストの実行順序は、エラーができるだけ早く検出されるように調整されています。各テストについては以下で説明します。
32 ビット CPU で 4 GB を超えるメモリのテストを可能にするために、物理アドレス範囲は 1 GB のウィンドウに分割され、一度に 1 つずつ仮想メモリ ウィンドウにマップされます。各 1GB ウィンドウには、1 つ以上の連続したメモリ領域が含まれる場合があります。ほとんどのテストでは、テストは各メモリ領域で順番に実行されます。最初のテストを除くすべてのテストでキャッシュが有効になります。
各メモリ領域で、ウォーキング 1 アドレス パターンを使用してすべてのアドレス ビットを順番にテストします。このテストのエラーは、BadRAM パターン、memmap 領域、または不良ページ領域には影響しません。
各メモリ領域では、各アドレスに独自のアドレスが書き込まれ、各アドレスの整合性がチェックされます。このテストは、ユーザーが選択した CPU シーケンス モードに関係なく、使用可能な各 CPU で順番に実行されます。
すべてのメモリ領域にわたって、各アドレスには、独自の仮想アドレスとウィンドウ番号 (32 ビット イメージの場合) または独自の物理アドレス (64 ビット イメージの場合) が書き込まれ、その後、各アドレスの整合性がチェックされます。これにより、各ウィンドウを順番にテストするときに見逃される上位アドレス ビットのエラーが捕捉されます。このテストは、ユーザーが選択した CPU シーケンス モードに関係なく、使用可能な各 CPU で順番に実行されます。
各メモリ領域で順番に、各パターンに対して、すべて 1 とすべて 0 のパターンを持つ移動反転アルゴリズムを使用します。
各メモリ領域で、各パターンに対して順番に、8 ビット幅のウォーキング 1 とウォーキング 0 のパターンを使用した移動反転アルゴリズムを使用します。
各メモリ領域で、各パターンに対して順番に、乱数とその補数のパターンを使用した移動反転アルゴリズムを使用します。乱数はテスト パスごとに異なるため、複数のパスで効率が向上します。
各メモリ領域で順番に、各パターンに対して、32 ビット幅 (32 ビット ビルドの場合) または 64 ビット幅 (64 ビット ビルドの場合) のウォーキング 1 とウォーキング 0 のパターンを持つ移動反転アルゴリズムを使用します。 。以前のテストとは異なり、パターンは連続するアドレスごとに 1 ビット回転されます。
このテストは、ブロック移動 (movs) 命令を使用してメモリに負荷を与え、Robert Redelmeier の burnBX テストに基づいています。
各メモリ領域では、8 バイトごとに反転するシフト パターンでメモリが初期化されます。次に、movs 命令を使用してメモリのブロックが移動されます。移動が完了したら、データ パターンがチェックされます。データはメモリの移動が完了した後にのみチェックされるため、どこでエラーが発生したかを知ることはできません。報告されるアドレスは、不正なパターンが見つかった場所のみのものです。したがって、このテストのエラーは、BadRAM パターン、memmap 領域、または不良ページ領域の原因にはなりません。
各メモリ領域では、各アドレスに乱数が書き込まれ、その後、各アドレスの整合性がチェックされ、元のデータの補数が書き込まれ、その後、各アドレスの整合性が再度チェックされます。
各メモリ領域で、各パターンに対して順番に、乱数とその補数のパターンを使用した Modulo-20 アルゴリズムを使用します。乱数はテスト パスごとに異なるため、複数のパスで効率が向上します。
すべてのメモリ領域にわたって、パターンごとに、各メモリ位置をパターンで初期化し、一定期間スリープしてから、各メモリ位置の整合性をチェックします。テストは、すべて 0 とすべて 1 のパターンで実行されます。
GitHub で未解決の問題と機能拡張リクエストのリストをご覧ください。
バグレポートはお気軽にどうぞ!
バグの修正または機能強化を目的としたコードの貢献は歓迎されます。基本的なガイドラインについては、doc ディレクトリの README_DEVEL.md を参照してください。
Memtest86+ v6.0 は Martin Whitaker が開発した PCMemTest をベースにしており、この PCMemTest は Samuel Demeulemeester が開発した Memtest86+ v5.01 をベースにしており、さらに Memtest86+ v5.01 は、Chris Brady が以下に示すリソースと支援を得て開発した Memtest86 をベースにしています。
ソース ファイルの初期バージョンの bootsect.S、setup.S、head.S、および build.c は Linux 1.2.1 カーネルからのものであり、大幅に変更されています。
Doug Sisk は、シリアル ポート経由で接続されたコンソールをサポートするコードを提供しました。 (現在は使用されていません)
BadRAM パターンを作成するコードは、Rick van Rein によって提供されました。
ブロック移動テストは、Robert Redelmeier の burnBX テストに基づいています。
画面バッファ コードは Jani Averbach によって提供されました。 (Memtest86+ v6.0 では使用されません)
Eric Biederman は、バージョン 3.0 のすべての機能コンテンツに加えて、多くのバグ修正と大幅なコードのクリーンアップを提供しました。
Samuel Demeulemeester によって提供されるバージョン 3.2、3.3、および 3.4 でのハードウェア検出とレポートの大幅な機能強化 (Memtest86+ v1.11、v1.60、および v1.70 以降)。
さらに、Memtest86+ のいくつかのバグ修正が anphsw/memtest86 からインポートされました。