दोषपूर्ण रैम के साथ विंडोज चलाना


25

क्या दोषपूर्ण रैम मॉड्यूल के साथ विंडोज (7, x64) चलाना संभव है? अधिक सटीक रूप से, क्या किसी को पता है कि विंडोज को किसी ज्ञात खराब पते या पते के ब्लॉक को आवंटित नहीं करना है?

लिनक्स के लिए, BadRAM है । क्या विंडोज के लिए मौजूदा कार्यान्वयन है? क्या यह विंडोज के कर्नेल (NT 6.1) के साथ भी संभव है? शायद एक कर्नेल मोड ड्राइवर?


4
@ केकज अगर खरीद के बाद केवल एक सप्ताह था, तो शायद वारंटी के तहत इसे बदल दें? ;)
बॉब

3
वास्तव में यह सबसे चतुर विचार है, इसके टूटे हुए हैं, इसे ठीक करने के लिए उन्हें प्राप्त करें
जर्नीमैन गीक

जवाबों:


15

बॉब, आपके प्रश्न के तीन भाग हैं। मैं एक बार में एक को संबोधित करूंगा।

खराब मेमोरी के साथ विंडोज चलाना

दोषपूर्ण मॉड्यूल के साथ विंडोज 7 चलाना वास्तव में संभव है। खराब क्षेत्रों के स्थान पर निर्भर करता है और जहां मॉड्यूल आपके डीआईएमएम बैंकों में बैठता है, विंडोज 7 ऐसे ही चलेगा, जब तक कि यह मेमोरी के खराब हिस्सों को छूने की कोशिश नहीं करता। इसलिए, आदर्श रूप से आप दोषपूर्ण मॉड्यूल को बैंक 0. से दूर ले जाएंगे। स्वाभाविक रूप से, यदि यह आपका एकमात्र मॉड्यूल है, तो आप भाग्य से बाहर हैं।

विंडोज में खराब मेमोरी सेक्टर को ब्लॉक करना

X86 (32 और 64 बिट्स) ऑपरेटिंग सिस्टम पर, मेमोरी को कर्नेल द्वारा प्रबंधित किया जाता है। जैसा कि आप उल्लेख करते हैं, BadMem लिनक्स में खराब मेमोरी सेक्टर को ब्लॉक करने में सक्षम है। यह कर्नेल को आपके द्वारा निर्दिष्ट मेमोरी पतों को लॉक करने का निर्देश देकर काम करता है। यह प्रभावी रूप से लिनक्स को उन पते को संबोधित करने से रोकता है जब स्मृति (आवंटित और डीलिंग) को आवंटित करते हैं। लेकिन ऐसा करने के लिए, BadMem को कर्नेल को पैच करना होगा। बैडमेम एक कर्नेल पैच से अधिक कुछ नहीं है जिसे आप आवेदन करने से पहले कॉन्फ़िगर करते हैं।

अब, आपके पास विंडोज़ पर वह क्षमता नहीं है। आप कर्नेल को पैच नहीं कर सकते हैं। कर्नेल मोड ड्राइवर विकसित करने से आप कोई भी अच्छा काम नहीं करेंगे, क्योंकि विंडोज कर्नेल आपके ड्राइवर को कभी भी इसकी मेमोरी मैनेजमेंट आर्किटेक्चर (उदाहरण के लिए) से पूर्वता नहीं लेने देगा।

इस कारण से, आप कुछ मेमोरी पतों का उपयोग नहीं करने के लिए किसी भी तरह से विंडोज़ को निर्देश नहीं दे सकते हैं। विशेष रूप से Microsoft के लिए आपके मामले के लिए कर्नेल को पैच करने का एकमात्र तरीका होगा। संभावना नहीं है।

खराब मेमोरी पते का प्रसार

एक मेमोरी मॉड्यूल में खराब पते क्यों हो सकते हैं, इसके कई कारण नहीं हैं। अंततः यह सब उत्पादन लाइन में एक त्रुटि को उबालता है, यह मानते हुए कि यह आपके कंप्यूटर में आने से पहले क्षति को बनाए नहीं रखता है। हार्ड ड्राइव के विपरीत, मेमोरी मॉड्यूल में कोई भी चलने योग्य भाग नहीं है, जैसा कि आप अच्छी तरह से जानते हैं। इसलिए, खराब सेक्टर फैलने की प्रवृत्ति नहीं रखते हैं, जैसा कि हार्ड ड्राइव सेक्टरों में होता है।

हालाँकि, स्मृति परीक्षण सॉफ़्टवेयर मूर्ख नहीं है। यह संभव है (और आम) इसके लिए कुछ निश्चित पतों को पारित करना जो वास्तव में खराब हैं। तो खराब मेमोरी "फैलने" की धारणा दे सकती है क्योंकि अधिक से अधिक पते खराब होने का पता चलता है। इस कारण से BadMem जैसे उपकरण उनकी कमजोरी को प्रकट करते हैं, क्योंकि स्वाभाविक रूप से वे केवल उन पते को संभाल सकते हैं जिन्हें आप उन्हें निर्देश देते हैं।

यह संभावना नहीं है कि कोई भी एक मेमोरी मॉड्यूल का पूरी तरह से परीक्षण कर सकता है और सभी खराब मेमोरी पतों की पहचान कर सकता है, फिर उन्हें लॉक कर सकता है और "अच्छा" मेमोरी मॉड्यूल के साथ समाप्त कर सकता है। सबसे आसान काम यह है कि खराब पते वाले एक मॉड्यूल को एक दोषपूर्ण मॉड्यूल के रूप में माना जाता है और परिणामस्वरूप उस पर भरोसा नहीं किया जाता है।

इसका अर्थ यह है कि, बैडमेम एक आकर्षक प्रस्ताव है, यह वास्तव में खराब स्मृति की समस्या का समाधान नहीं है। अधिक संभावना है कि आप अभी भी एक ऑपरेटिंग सिस्टम के साथ समाप्त नहीं होंगे जो एक खराब सेक्टर को पढ़ने की कोशिश करता है और एक स्टॉप एरर के साथ क्रैश होता है। एक बुरा मॉड्यूल एक बुरा मॉड्यूल है एक बुरा मॉड्यूल है।


काफी कुछ अच्छा जवाब हैं, लेकिन मैं एक अच्छा कारण देने के लिए इस को स्वीकार करेंगे क्यों ऐसा करने के लिए नहीं। विंडोज कर्नेल को एक निश्चित पते का उपयोग नहीं करने के लिए कहा जा सकता है, जैसा कि अन्य ने नोट किया है, लेकिन जब पता स्थान के बीच में त्रुटि होती है, तो यह एक कुल्हाड़ी का उपयोग करने जैसा होता है जब आप एक स्कैपल चाहते हैं ... महीन नियंत्रण वांछित है, लेकिन, स्पष्ट रूप से, असंभव। बड़े अफ़सोस की बात है।
बॉब

8
बिल्कुल सही नहीं; यह है निश्चित पते (अधिक सही, कुछ पेज फ्रेम संख्या) से बचने के लिए विंडोज निर्देश देने के लिए संभव। कार्यक्षमता ईसीसी मेमोरी के लिए डिज़ाइन की गई है, जिसके साथ विंडोज़ संभावित दोषों का पता लगा सकता है और उन PFNs को खराब के रूप में चिह्नित कर सकता है, लेकिन मैन्युअल रूप से PFNs को सूची में जोड़ना संभव है: superuser.com/a/490522/117590 - बस बहुत व्यावहारिक है। तो, हाँ, प्रतिस्थापन सबसे अच्छा विकल्प बना हुआ है: पी
बॉब

17

Windows BCD (बूट कॉन्फ़िगरेशन डेटा) वास्तव में एक {badmemory}ऑब्जेक्ट है। ऐसा लगता है कि ईसीसी मेमोरी द्वारा "विफल होने की भविष्यवाणी की गई" स्मृति पते यहां सूचीबद्ध होंगे, और ऑपरेटिंग सिस्टम द्वारा उपयोग नहीं किए जाएंगे।

{badmemory}वस्तु एक को स्वीकार करता है BadMemoryList(बीसीडी प्रकार 0x1700000a) तत्व है, जो कि हेक्स के रूप में दर्ज किया जा सकता है की रिक्ति द्वारा अलग पूर्णांकों की एक सूची है। मुझे लगता है कि मैन्युअल रूप से खराब स्मृति पते सम्मिलित करना संभव होगा जैसा कि इस तत्व के लिए memtest86 द्वारा पाया गया है - लेकिन मैंने इसका परीक्षण नहीं किया है। जाहिरा तौर पर, यह 'पेज फ्रेम नंबरों को स्वीकार करता है, जो कि 4096 द्वारा विभाजित वास्तविक पता है। दुर्भाग्य से, ये पते / पीएफएन मेमोरी डायग्नोस्टिक्स द्वारा रिपोर्ट किए गए लोगों से मेल नहीं खा सकते हैं। विजुअल बीसीडी एडिटर के साथ मैनुअल एडिटिंग की जा सकती है ।

किसी भी मामले में, दोषपूर्ण मेमोरी स्टिक्स को अन्य उत्तरों द्वारा संकेत के रूप में प्रतिस्थापित किया जाना चाहिए। यह मुद्दे के चारों ओर काम करने के लिए एक संभव तरीके पर केवल एक नोट है (अस्थायी रूप से?)।


आपके द्वारा कही गई हर चीज का एक बेहतर स्वरूपित ट्यूटोरियल यहां उपलब्ध है । हालांकि अच्छा काम।
मिर

13

Windows BCD {badmemorylist}और {badmemoryaccess}ऑब्जेक्ट हैं। आपको पहले खराब मेमोरी पेज को रिक्त स्थान (जैसे। bcdedit /set badmemorylist 1499543 1434007) और दूसरे से No( bcdedit /set badmemoryaccess No) तक अलग करना चाहिए

ध्यान रखें कि विंडोज़ में मेमोरी पेज का आकार आमतौर पर होता है 4KB

विंडोज 7 में परीक्षण किया गया और यह अच्छी तरह से काम करता है

आप Sysinternals द्वारा Rammap द्वारा अपनी सेटिंग्स का परीक्षण कर सकते हैं

PS मुझे वह जानकारी मिल गई है "Windows Internals Book" chapter 10


13

मुझे SoC वाली टैबलेट में रैम की दिक्कत थी। मेमोरी को SoC में वेल्डेड या इंटीग्रेट किया जाता है और उसे बदला नहीं जा सकता।

मैं अर्जेंटीना में हूं और विक्रेता चीन में है, और शिपिंग लागत और समय, यह वारंटी में भेजने के लिए कोई मतलब नहीं है।

मैंने कुछ हिट फ़िल्में कीं।

क्षतिग्रस्त मेमोरी मापदंडों को पारित करने की कुंजी हैं:

  1. विंडोज़ में उपयोग किए जाने वाले यादगार पतों के पते।
  2. 4KBytes के पूर्ण पृष्ठों को चिह्नित करना चाहिए।
  3. memtest में 0x10000000Windows में 0x10000 से मेल खाती है
  4. memtest में 0x00001000Windows में 0x1 से मेल खाती है
  5. का अर्थ है: खिड़कियों में पृष्ठ संख्या पिछले 3 यादगार हेक्साडेसिमल संख्याओं को हटा देती है।
  6. इसका मतलब है कि: खिड़कियां बाईं ओर शून्य को समाप्त करती हैं।
  7. पृष्ठ संख्या में त्रुटियों से बचने के लिए 5 और 6 पर विचार करें।
  8. सही कथन है: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA0x000B7000 से 0x000BAFFF के लिए मेमोरेस्ट में त्रुटियां। ध्यान दें कि आप यादों की एक सीमा नहीं रख सकते हैं, लेकिन सभी पृष्ठ एक-एक करके
  9. पृष्ठों को नहीं जोड़ा जा सकता है, सभी पृष्ठों को एक ही कमांड में चिह्नित किया जाना चाहिए। यदि एक नया पृष्ठ, पुराने को अधिलेखित करता है। मैं एक ही कमांड में 4096 पेज जोड़ने में कामयाब रहा। मैंने इसे ज्यादा आजमाया नहीं है।
  10. bcdedit /enum {badmemory}, चिह्नित पृष्ठों की सूची दिखाता है।
  11. bcdedit /set badmemoryaccess no रोकने के लिए चिह्नित पृष्ठों का उपयोग किया जाता है
  12. पृष्ठों को चिह्नित करने और पहुंच को हटाने के बाद रिबूट करना आवश्यक है।

1
मुझे /इसके लिए काम करने के लिए और उसके बीच की सफेद जगह को हटाना पड़ा , इसलिए इसके बजाय दूसरों के लिए समान bcdedit / enum {badmemory}होगाbcdedit /enum {badmemory}
flagg19

यह काम करता है, लेकिन दुर्भाग्य से विंडोज पर cmd की सीमा 8191 तक सीमित है और मैं सभी खराब मेमोरी पेजों को ब्लॉक करने में सक्षम नहीं था। मुझे इसे हल करने के लिए एक अच्छा समाधान नहीं मिला। क्या पृष्ठों की श्रेणी रिकॉर्ड करने का कोई तरीका है? मुझे सभी पेजों को 0x714bc8 से 0x71cbd0 तक ब्लॉक करना चाहिए जो बहुत अधिक पृष्ठ हैं! मैंने क्या बनाया, इसलिए मैंने सबसे सरल परीक्षण (# 0 और # 1) चलाया और इसे मेमोरी त्रुटि की अधिक सीमित श्रेणी मिली। यह अब तक अच्छी तरह से चल रहा है, कोई और नीली स्क्रीन नहीं। लेकिन मुझे पता है कि मैंने वह सब कुछ ब्लॉक नहीं किया जो जरूरी होगा।
फेलिप

3

जहां तक ​​मुझे पता है, ऐसा करने का एकमात्र तरीका BurnMem कमांड का उपयोग करना है जो कृत्रिम रूप से रैम विंडो के उपयोग की मात्रा को सीमित कर सकता है।


2
हम्म .. यह एक दिलचस्प विकल्प है। शायद maxmem, चूंकि स्पष्ट burnmemरूप से अधिकतम भौतिक पते को सीमित नहीं करता है , जबकि maxmemकरता है। विस्टा और 7 समकक्ष होगा truncatememory। हालांकि यह एक संभव समाधान है, क्या उन मामलों के लिए एक अधिक सटीक तरीका है जहां दोषपूर्ण मेमोरी पता स्थान के मध्य या शुरुआत में है और वांछित नहीं होने के बाद सब कुछ अवरुद्ध कर देता है?
बॉब

@ थोबे - इस कारण से आप केवल खराब मेमोरी को बदल नहीं सकते हैं क्यों?
रामहाउंड

@ रामध्वज, अगर मैं चाहता। लेकिन इसमें समय लगेगा। अभी, मैं अपने मूल स्मृति के साथ भाग रहा हूं, अपने वीएम के लिए महान नहीं। एक नया या प्रतिस्थापन मॉड्यूल प्राप्त करना जो वास्तव में काम करेगा कुछ सप्ताह लग सकते हैं। यदि कोई सॉफ़्टवेयर सॉल्यूशन मुझे दो घंटे या उससे कम समय में ऐसा करने देता है, तो मैं इसे अच्छी तरह से समय बिताने और कुछ नया सीखने पर विचार करूंगा। मैं इस उत्तर को स्वीकार करूंगा (मेरी याददाश्त पते की जगह के अंत में विफल हो गई) लेकिन अगर किसी के पास अधिक बहुमुखी समाधान है तो मैं भविष्य के प्रतिफल के लिए पसंद करूंगा।
बॉब

@ थोबा - यह काफी व्यापक रूप से पढ़ने के बाद, ऐसा प्रतीत होता है कि यह संभव नहीं है। इसका कारण यह है कि BadRam ने कर्नेल को बूटलोडर से खराब एडेक्ट्स को बाहर करने के निर्देश देने के लिए मेमोरेस्ट का उपयोग किया है, विंडोज ऐसा करने में असमर्थ है क्योंकि वर्तमान में इसके लिए कोई तरीका नहीं है जिससे कि खराब एड्रेस को उसी तरह से बाहर निकाला जा सके जिस तरह से BadRam पैच किए गए कर्नेल को निकाल सकता है ।
ओलिवर जी

3

इस उपयोग को देखें : https://github.com/prsyahmi/BadMemory

पता सीमाओं को अवरुद्ध करने का उपयोग करना और उनका समर्थन करना बहुत आसान है। और आप पिछले तीन अंकों को हटाए बिना MemTest86 से प्राप्त पूर्ण पते का उपयोग कर सकते हैं।


2

सावधान!!! Windows बूट करने में विफल हो सकता है, BCD के पुनर्निर्माण के लिए तैयार हो। उस स्थिति के लिए उन्नत स्टार्टअप विकल्पों में कमांड प्रॉम्प्ट का उपयोग करें। मुझे नहीं पता कि यह अब क्यों बूट नहीं करता, बेतरतीब ढंग से घटित होता है या यदि यू को बहुत से एड्रेमीस को बैडमिमोरीलिस्ट में डाल दिया जाता है।

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

Heres एक C ++ कमांड प्रॉम्प्ट प्रोग्राम है जो एक .txt फ़ाइल में एक निरंतर मेमोरी एड्रेस लिस्ट तैयार करता है ( bcdedit /set badmemorylistया bcdedit /set {badmemory} badmemorylistमेरे लिए Win7 पर काम नहीं करता है)।

उपयोग bcdedit /set badmemoryaccess 0से इनकार करने के लिए उपयोग करें।

आप ईज़ीबीसीडी को सेटिंग्स में देखें -> विस्तृत के साथ देख सकते हैं। यदि भौतिक पता स्थान गायब हो गया है, तो रम्मप के साथ चेक को पुनरारंभ करने के बाद।

#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

हाँ। मेमोरी की मात्रा को नियंत्रित करने के लिए बूट पैरामीटर हैं जो विंडोज़ उपयोग कर सकते हैं। आप केवल मेमोरी स्पेस के अंत से हटा सकते हैं। बूट मापदंडों को नियंत्रित करने के लिए यह एमएसडीएन लेख देखें । ब्याज के पैरामीटर हैं truncatememoryऔर removememory


ट्रंकट और मेमोरी को हटाने के लिए लगता है कि केवल रैम एक्सेस को काट दिया जाता है (किसी दिए गए थ्रेसहोल्ड से शुरू, या अंत से पीछे की ओर काम करना)। यह सवाल रेंज प्रदान करने के बारे में अधिक था।
मिरह

0

आप इस सुविधा को विंडोज 7 में आजमा सकते हैं , लेकिन मुझे यकीन नहीं है कि यह किस चिप पर प्रभाव डालेगा, या यदि यह समान राशि को प्रत्येक को बंद कर दे। मुझे पता लगाने के लिए चारों ओर देखना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.