欠陥のあるRAMでWindowsを実行する


25

欠陥のあるRAMモジュールでWindows(7、x64)を実行することは可能ですか?より正確には、既知の不良アドレスまたはアドレスブロックを割り当てないようにWindowsに指示する方法はありますか?

Linuxの場合、BadRAMがあります。Windowsの既存の実装はありますか?Windowsのカーネル(NT 6.1)でも可能ですか?たぶんカーネルモードドライバーですか?


4
@ekaj購入から1週間しか経っていない場合は、保証期間内に交換してください。;)
ボブ

3
実は賢いアイデア、その壊れ、EMはそれを修正するために得る厥
ジャーニーマンオタク

回答:


15

ボブ、あなたの質問には3つの部分があります。一度に1つずつ説明します。

不良メモリでWindowsを実行する

欠陥のあるモジュールでWindows 7を実行することは確かに可能です。不良セクタの場所とモジュールがDIMMバンクのどこにあるかによって、Windows 7はメモリの不良部分に触れない限り何も実行されません。したがって、理想的には、欠陥のあるモジュールをバンク0から可能な限り遠くに移動します。当然、これが唯一のモジュールである場合は、運がありません。

Windowsで不良メモリセクターをブロックする

x86(32ビットおよび64ビット)オペレーティングシステムでは、メモリはカーネルによって管理されます。おっしゃるように、BadMemはLinuxの不良メモリセクタをブロックできます。指定したメモリアドレスをロックするようカーネルに指示することで機能します。これにより、メモリの割り当て(および割り当て解除)時にLinuxがこれらのアドレスをアドレス指定することが事実上停止します。ただし、これを行うには、BadMemがカーネルにパッチを適用する必要があります。BadMemは、適用する前に設定するカーネルパッチにすぎません。

今、あなたはWindows上でその能力を持っていません。カーネルにパッチを適用することはできません。カーネルモードドライバーを開発しても、Windowsカーネルではドライバーがそのメモリ管理アーキテクチャよりも優先されることはありません(当然のことながら)、何の役にも立ちません。

このため、特定のメモリアドレスを使用しないようにウィンドウを指示することはできません。唯一の方法は、Microsoftが特定のケースに合わせてカーネルにパッチを適用することです。ありそうもない。

不良メモリアドレスの拡散

メモリモジュールに不正なアドレスが含まれる理由は多くありません。最終的には、コンピューターに入る前に損傷を受けなかったと仮定すると、すべて生産ラインのエラーになります。ご存じのように、ハードドライブとは異なり、メモリモジュールには可動部品はありません。そのため、ハードドライブセクターの場合のように、不良セクターが広がる傾向はありません。

ただし、メモリテストソフトウェアは万全ではありません。実際には不良な特定のアドレスを渡すことは可能です(そして一般的です)。したがって、不良メモリは、より多くのアドレスが不良であることが明らかになるにつれて、「拡散」の印象を与える可能性があります。このため、BadMemのようなツールは弱点を露呈します。なぜなら、当然、それらはあなたが指示したアドレスしか処理できないからです。

誰もがメモリモジュールの徹底的なテストを実施し、すべての不良メモリアドレスを特定し、それらをロックして、「良好な」メモリモジュールになる可能性はほとんどありません。最も簡単なことは、不良アドレスを持つモジュールを全体的に欠陥のあるモジュールと見なし、その結果信頼されないようにすることです。

これが意味することは、BadMemは魅力的な命題であると同時に、実際には悪い記憶の問題の解決策ではないということです。おそらく、不良セクタを読み取ろうとし、停止エラーでクラッシュするオペレーティングシステムになってしまいます。不良モジュールは不良モジュールです。不良モジュールは不良モジュールです。


たくさんの良い答えがありますが、そうしない理由を説明するためにこれを受け入れます。他の人が指摘しているように、Windowsカーネルは特定のアドレスを過ぎて使用しないように指示することができますが、エラーがアドレス空間の真ん中にある場合、スケープをしたいときにxを使用するようなものです...より細かい制御が望まれますが、どうやら、不可能です。それは残念だ。
ボブ

8
まったく正しくありません。特定のアドレス(より正確には、特定のページフレーム番号)を避けるようにWindowsに指示することできます。この機能はECCメモリ用に設計されており、Windowsで発生する可能性のある障害を検出し、それらのPFNを不良としてマークできますが、リストにPFNを手動で追加することは可能です:superuser.com/a/490522/117590-あまり実用的ではありません。だから、ええ、交換は最良の選択肢のままです:P-
ボブ

17

Windows BCD(ブート構成データ)には実際に{badmemory}オブジェクトがあります。ECCメモリによって「障害が予測される」メモリアドレスがここにリストされ、オペレーティングシステムによって使用されていないようです。

{badmemory}オブジェクトが受け付けるBadMemoryList(BCD型0x1700000aスペースで区切られた、六角形として入力することができる整数のリストである)要素を、。memtest86で見つかった不良メモリアドレスをこの要素に手動で挿入することは可能だと思いますが、これはテストしていません。どうやら、それは4096で割った実際のアドレスである「ページフレーム番号」を受け入れます。残念ながら、これらのアドレス/ PFNはメモリ診断によって報告されたものと一致しない場合があります。Visual BCD Editorを使用して手動で編集できます。

いずれの場合も、他の回答に示されているように、不良のメモリスティックを交換する必要があります。これは、問題を回避するための可能な方法に関するメモです(一時的に?)。


あなたが言ったすべてのより良い形式のチュートリアルがここにあります。とにかく素晴らしい仕事。
mirh

13

Windows BCDにはオブジェクトが{badmemorylist}あり{badmemoryaccess}ます。スペース(たとえばbcdedit /set badmemorylist 1499543 1434007)で区切られた不良メモリページに最初の値を設定し、Nobcdedit /set badmemoryaccess No)に2番目の値を設定する必要があります。

通常、Windowsのメモリページサイズは 4KB

Windows 7でテストされ、うまく機能します

SysinternalsのRammapで設定をテストできます

PS私はその情報を持っています "Windows Internals Book" chapter 10


13

SoCを搭載したタブレットでRAMのトラブルが発生しました。メモリはSoCに溶接または統合されており、交換することはできません。

私はアルゼンチンにいます、そして、売り手は中国にいます、そして、送料と時間、保証で送ることは意味がありません。

私はいくつかのヒットを管理しました。

破損したメモリパラメータを渡す鍵は次のとおりです。

  1. memtest86のアドレスは、Windowsで使用されるアドレスと一致します。
  2. 4Kバイトの全ページをマークする必要があります。
  3. memtestの0x10000000Windowsの0x10000に対応
  4. memtestの0x00001000Windowsの0x1に対応
  5. 意味:Windowsのページ番号は、最後の3つのmemtest 16進数を削除します。
  6. つまり、ウィンドウは左側のゼロを削除します。
  7. ページ番号のエラーを避けるために、5と6を検討してください。
  8. 正しいステートメントはbcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA、0x000B7000から0x000BAFFFのmemtestのエラーです。一連の思い出を置くことはできませんが、すべてのページを1つずつ置くことができます
  9. ページを追加できません。すべてのページを同じコマンドでマークする必要があります。新しいページの場合、追加すると古いものが上書きされます。onlyコマンドで4096ページを追加できました。まだ試したことがありません。
  10. bcdedit /enum {badmemory}、マークされたページのリストを表示します。
  11. bcdedit /set badmemoryaccess no マークされたページが使用されないようにする
  12. ページをマークした後、再起動してアクセスを削除する必要があります。

1
私は間の空白削除する必要がありました/仕事にそれのために、コマンドを、その代わりに、bcdedit / enum {badmemory}それになりますbcdedit /enum {badmemory}他の人のための同じ
flagg19

動作しますが、残念ながらWindowsのcmd制限は8191に制限されており、すべての不良メモリページをブロックできませんでした。これを解決する良い回避策が見つかりませんでした。ページの範囲を記録する方法はありますか?0x714bc8から0x71cbd0までのすべてのページをブロックする必要がありますが、これはページが多すぎます!何を作ったの?最も簡単なテスト(#0および#1)を実行しましたが、より限られた範囲のメモリエラーが発生しました。これまでのところ順調に稼働しており、ブルースクリーンはこれ以上ありません。しかし、必要なすべてをブロックしなかったことがわかります。
フェリペ

3

私の知る限り、これを行う唯一の方法は、RAMウィンドウの使用量を人為的に制限できるBurnMemコマンドを使用することです。


2
うーん、それは面白いオプションです。おそらくmaxmemburnmemそうする一方で、最大物理アドレスを制限しmaxmemないようです。Vistaと7の同等物はになりますtruncatememory。これは可能な解決策ですが、欠陥のあるメモリがアドレススペースの中央または先頭にあり、不要になった後にすべてをブロックする場合のより正確な方法はありますか?
ボブ

@Bob-不良メモリモーダルを単純に交換できない理由はなぜですか?
ラムハウンド

@Ramhoundできれば、できた。しかし、それには時間がかかります。現在、元のメモリの半分で実行していますが、VMには適していません。実際に機能する新しいモジュールまたは交換モジュールを入手するには、数週間かかる場合があります。ソフトウェアソリューションで2時間以内にこれを行うことができれば、時間を十分に費やし、何か新しいことを学んだと思います。私はこの答えを受け入れます(私の記憶はアドレス空間の最後でたまたま失敗しました)。
ボブ

@Bob-これを非常に広範囲にわたって読んだだけで、不可能なようです。これは、BadRamがmemtestを使用してカーネルに不正なアドレスをブートローダーから除外するよう指示するためです。現在、BadRamのパッチを適用したカーネルと同じ方法で除外する不正なアドレスを解決する方法がないため、Windowsはこれを行うことができません。
オリバーG

3

このユーティリティを見てください:https : //github.com/prsyahmi/BadMemory

非常に使いやすく、アドレス範囲のブロックをサポートしています。また、MemTest86から受け取った完全なアドレスを、最後の3桁を削除せずに使用できます。


2

注意!!!Windowsの起動に失敗する場合があります。BCDを再構築する準備をしてください。その場合は、高度な起動オプションのコマンドプロンプトを使用します。なぜ起動しないのか、ランダムに発生するように見える、またはbadmemorylistにあまりにも多くのアドレスを入力した場合は、どうしてかわかりません。

bootrec /rebuild bcd
bcdedit /export c:\bcdbackup
attrib c:\boot\bcd -h -r -s
ren c:\boot\bcd bcd.old
bootrec /rebuild bcd

準備ができ.txtファイル内の連続メモリアドレスのリストを取得する相続人はC ++コマンドプロンプトのprogramm bcdedit /set badmemorylistまたはbcdedit /set {badmemory} badmemorylist(私のためにwin7の上で作業しませんでした)

bcdedit /set badmemoryaccess 0アクセスを拒否するために使用します。

[表示設定]-> [詳細]でEasyBCDを確認できます。物理アドレススペースが消失した場合、Rammapでチェックして再起動した後。

#include <cstdlib>
#include <iostream>
#include <fstream>

//converts hex into base10
unsigned long convertHexToIntBase10(char* inputHex)
{
    unsigned long hexValue = std::strtoul(inputHex, 0, 16);
    return hexValue;
}

int main(int argc, char* argv[])
{
    if(argc < 3){
        std::cerr << "Usage: MemoryPageListHex [Low Memory Adress] [High Memory Adress] in 4k Pages i.e. MemoryPageListHex 1bae50 1bb0e7 for 0x1bae50148 to 0x1bb0e7fe8" << std::endl;
        return 0;
    }
    auto lowAdr = convertHexToIntBase10(argv[1]);
    auto highAdr = convertHexToIntBase10(argv[2]);
    std::ofstream myfile;
    myfile.open ("MemoryAdress4k.txt");
    for (auto i=lowAdr; i<highAdr; i++){
        myfile << std::hex << "0x" << i << " ";
    }
    myfile.close();
    return 0;
}

1

はい。Windowsが使用できるメモリの量を制御するブートパラメータがあります。ただし、メモリスペースの最後からのみ削除できます。ブートパラメータを制御するには、このmsdnの記事を参照してください。興味のあるパラメータがあるtruncatememoryremovememory


メモリを切り捨てて削除すると、RAMアクセスが切断されるように見えます(所定のしきい値から開始するか、最後から逆方向に作業します)。この質問は、範囲の提供に関するものでした。
mirh

0

Windows 7でこの機能を試すこともできますが、どのチップが効果を発揮するのか、または各チップから同じ量がスキムされるのかはわかりません。私はそれを見つけるために見回す必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.