web-dev-qa-db-ja.com

欠陥のあるWindowsの実行RAM

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

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

27
Bob

ボブ、あなたの質問には3つの部分があります。 1つずつ対処します。

不良メモリでWindowsを実行している

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

Windowsの不良メモリセクターのブロック

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

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

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

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

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

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

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

これが意味することは、BadMemは魅力的な命題であるのと同様に、実際には不良メモリの問題に対する解決策ではないということです。その場合、オペレーティングシステムが不良セクターを読み取ろうとして停止エラーでクラッシュする可能性は高くありません。悪いモジュールは悪いモジュールです悪いモジュールです.

14
A Dwarf

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

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

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

19
Bob

問題が発生しましたRAM。メモリがSoCに溶接または統合されており、交換できません。

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

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

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

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

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

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

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

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

PS私はその情報を"Windows Internals Book" chapter 10

13

ええと、もしあなたが悪い部分をロックアウトできたとしても、私が悪いと知っていた記憶を使うのは快適ではありません。安心のために新しい棒を買います。

7
Biosci3c

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

3
Oliver G

注意!!! 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

bcdedit /set badmemorylistまたはbcdedit /set {badmemory} badmemorylistの準備ができている.txtファイル内の連続したメモリアドレスリストを取得するC++コマンドプロンプトプログラム(ここでは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;
}
3
Birnd

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

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

3
osipxd

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

1
Nick Whaley

これを試してください Windows 7の機能ですが、どのチップが効果を発揮するのか、または各チップから同じ量をスキミングするのかどうかはわかりません。私はそれを見つけるために周りを見回す必要があります。

0
cutrightjm