欠陥のあるRAMモジュールでWindows(7、x64)を実行することは可能ですか?より正確には、既知の不良アドレスまたはアドレスブロックを割り当てないようにWindowsに指示する方法はありますか?
Linuxの場合、BadRAMがあります。Windowsの既存の実装はありますか?Windowsのカーネル(NT 6.1)でも可能ですか?たぶんカーネルモードドライバーですか?
欠陥のあるRAMモジュールでWindows(7、x64)を実行することは可能ですか?より正確には、既知の不良アドレスまたはアドレスブロックを割り当てないようにWindowsに指示する方法はありますか?
Linuxの場合、BadRAMがあります。Windowsの既存の実装はありますか?Windowsのカーネル(NT 6.1)でも可能ですか?たぶんカーネルモードドライバーですか?
回答:
ボブ、あなたの質問には3つの部分があります。一度に1つずつ説明します。
欠陥のあるモジュールでWindows 7を実行することは確かに可能です。不良セクタの場所とモジュールがDIMMバンクのどこにあるかによって、Windows 7はメモリの不良部分に触れない限り何も実行されません。したがって、理想的には、欠陥のあるモジュールをバンク0から可能な限り遠くに移動します。当然、これが唯一のモジュールである場合は、運がありません。
x86(32ビットおよび64ビット)オペレーティングシステムでは、メモリはカーネルによって管理されます。おっしゃるように、BadMemはLinuxの不良メモリセクタをブロックできます。指定したメモリアドレスをロックするようカーネルに指示することで機能します。これにより、メモリの割り当て(および割り当て解除)時にLinuxがこれらのアドレスをアドレス指定することが事実上停止します。ただし、これを行うには、BadMemがカーネルにパッチを適用する必要があります。BadMemは、適用する前に設定するカーネルパッチにすぎません。
今、あなたはWindows上でその能力を持っていません。カーネルにパッチを適用することはできません。カーネルモードドライバーを開発しても、Windowsカーネルではドライバーがそのメモリ管理アーキテクチャよりも優先されることはありません(当然のことながら)、何の役にも立ちません。
このため、特定のメモリアドレスを使用しないようにウィンドウを指示することはできません。唯一の方法は、Microsoftが特定のケースに合わせてカーネルにパッチを適用することです。ありそうもない。
メモリモジュールに不正なアドレスが含まれる理由は多くありません。最終的には、コンピューターに入る前に損傷を受けなかったと仮定すると、すべて生産ラインのエラーになります。ご存じのように、ハードドライブとは異なり、メモリモジュールには可動部品はありません。そのため、ハードドライブセクターの場合のように、不良セクターが広がる傾向はありません。
ただし、メモリテストソフトウェアは万全ではありません。実際には不良な特定のアドレスを渡すことは可能です(そして一般的です)。したがって、不良メモリは、より多くのアドレスが不良であることが明らかになるにつれて、「拡散」の印象を与える可能性があります。このため、BadMemのようなツールは弱点を露呈します。なぜなら、当然、それらはあなたが指示したアドレスしか処理できないからです。
誰もがメモリモジュールの徹底的なテストを実施し、すべての不良メモリアドレスを特定し、それらをロックして、「良好な」メモリモジュールになる可能性はほとんどありません。最も簡単なことは、不良アドレスを持つモジュールを全体的に欠陥のあるモジュールと見なし、その結果信頼されないようにすることです。
これが意味することは、BadMemは魅力的な命題であると同時に、実際には悪い記憶の問題の解決策ではないということです。おそらく、不良セクタを読み取ろうとし、停止エラーでクラッシュするオペレーティングシステムになってしまいます。不良モジュールは不良モジュールです。不良モジュールは不良モジュールです。
Windows BCD(ブート構成データ)には実際に{badmemory}
オブジェクトがあります。ECCメモリによって「障害が予測される」メモリアドレスがここにリストされ、オペレーティングシステムによって使用されていないようです。
{badmemory}
オブジェクトが受け付けるBadMemoryList
(BCD型0x1700000a
スペースで区切られた、六角形として入力することができる整数のリストである)要素を、。memtest86で見つかった不良メモリアドレスをこの要素に手動で挿入することは可能だと思いますが、これはテストしていません。どうやら、それは4096で割った実際のアドレスである「ページフレーム番号」を受け入れます。残念ながら、これらのアドレス/ PFNはメモリ診断によって報告されたものと一致しない場合があります。Visual BCD Editorを使用して手動で編集できます。
いずれの場合も、他の回答に示されているように、不良のメモリスティックを交換する必要があります。これは、問題を回避するための可能な方法に関するメモです(一時的に?)。
Windows BCDにはオブジェクトが{badmemorylist}
あり{badmemoryaccess}
ます。スペース(たとえばbcdedit /set badmemorylist 1499543 1434007
)で区切られた不良メモリページに最初の値を設定し、No
(bcdedit /set badmemoryaccess No
)に2番目の値を設定する必要があります。
通常、Windowsのメモリページサイズは 4KB
Windows 7でテストされ、うまく機能します
SysinternalsのRammapで設定をテストできます
PS私はその情報を持っています "Windows Internals Book" chapter 10
SoCを搭載したタブレットでRAMのトラブルが発生しました。メモリはSoCに溶接または統合されており、交換することはできません。
私はアルゼンチンにいます、そして、売り手は中国にいます、そして、送料と時間、保証で送ることは意味がありません。
私はいくつかのヒットを管理しました。
破損したメモリパラメータを渡す鍵は次のとおりです。
0x10000000
Windowsの0x10000に対応0x00001000
Windowsの0x1に対応bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
、0x000B7000から0x000BAFFFのmemtestのエラーです。一連の思い出を置くことはできませんが、すべてのページを1つずつ置くことができますbcdedit /enum {badmemory}
、マークされたページのリストを表示します。bcdedit /set badmemoryaccess no
マークされたページが使用されないようにする/
仕事にそれのために、コマンドを、その代わりに、bcdedit / enum {badmemory}
それになりますbcdedit /enum {badmemory}
他の人のための同じ
私の知る限り、これを行う唯一の方法は、RAMウィンドウの使用量を人為的に制限できるBurnMemコマンドを使用することです。
maxmem
、burnmem
そうする一方で、最大物理アドレスを制限しmaxmem
ないようです。Vistaと7の同等物はになりますtruncatememory
。これは可能な解決策ですが、欠陥のあるメモリがアドレススペースの中央または先頭にあり、不要になった後にすべてをブロックする場合のより正確な方法はありますか?
このユーティリティを見てください:https : //github.com/prsyahmi/BadMemory
非常に使いやすく、アドレス範囲のブロックをサポートしています。また、MemTest86から受け取った完全なアドレスを、最後の3桁を削除せずに使用できます。
注意!!!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;
}