ใช้ Windows กับ RAM ที่มีข้อบกพร่อง


25

เป็นไปได้หรือไม่ที่จะเรียกใช้ Windows (7, x64) ด้วยโมดูล RAM ที่มีข้อบกพร่อง? แม่นยำกว่ามีวิธีใดบ้างที่จะบอกให้ Windows ไม่จัดสรรที่อยู่หรือบล็อกที่อยู่ที่ไม่รู้จักที่รู้จัก

สำหรับลินุกซ์มีBadRAM มีการใช้งานที่มีอยู่สำหรับ Windows หรือไม่? เป็นไปได้ด้วยเคอร์เนลของ Windows (NT 6.1)? อาจเป็นไดรเวอร์โหมดเคอร์เนล


4
@ekaj หากมันเป็นเพียงหนึ่งสัปดาห์หลังจากการซื้ออาจแทนที่ด้วยการรับประกัน? ;)
Bob

3
ที่จริงแล้วมันเป็นความคิดที่ฉลาดที่สุดมันพังแล้วลองเอามันมาแก้ไข
Journeyman Geek

คำตอบ:


15

บ๊อบคำถามของคุณมีสามส่วน ฉันจะพูดทีละครั้ง

ใช้ Windows กับหน่วยความจำไม่ดี

เป็นไปได้แน่นอนที่จะเรียกใช้ Windows 7 ด้วยโมดูลที่มีข้อบกพร่อง ขึ้นอยู่กับตำแหน่งของเซกเตอร์เสียและที่ที่โมดูลอยู่ใน DIMM ธนาคารของคุณ Windows 7 จะทำงานเหมือนไม่มีอะไรตราบเท่าที่มันไม่พยายามสัมผัสส่วนที่ไม่ดีของหน่วยความจำ ดังนั้นคุณควรจะย้ายโมดูลที่มีข้อบกพร่องให้ไกลที่สุดเท่าที่จะเป็นไปได้จากธนาคาร 0 โดยธรรมชาติถ้านี่เป็นเพียงโมดูลเดียวของคุณคุณจะโชคไม่ดี

การบล็อกเซกเตอร์หน่วยความจำไม่ดีใน Windows

บนระบบปฏิบัติการ x86 (32 และ 64 บิต) หน่วยความจำได้รับการจัดการโดยเคอร์เนล ดังที่คุณพูดถึง BadMem สามารถบล็อกเซกเตอร์หน่วยความจำไม่ดีใน Linux มันทำงานได้โดยสั่งให้เคอร์เนลล็อคที่อยู่หน่วยความจำที่คุณระบุ สิ่งนี้จะหยุดลีนุกซ์ไม่ให้แอดเดรสแอดเดรสเหล่านั้นอย่างมีประสิทธิภาพเมื่อทำการจัดสรรหน่วยความจำ แต่เพื่อที่จะทำสิ่งนี้ BadMem จำเป็นต้องแก้ไขเคอร์เนล BadMem ไม่มีอะไรมากไปกว่าเคอร์เนลแพตช์ที่คุณกำหนดค่าก่อนที่จะใช้

ตอนนี้คุณไม่มีความสามารถนั้นบน Windows คุณไม่สามารถแก้ไขเคอร์เนลได้ การพัฒนาไดรเวอร์โหมดเคอร์เนลจะไม่ทำให้คุณดีเช่นกันเนื่องจากเคอร์เนล Windows จะไม่ปล่อยให้ไดรเวอร์ของคุณมีความสำคัญเหนือกว่าสถาปัตยกรรมการจัดการหน่วยความจำ (เข้าใจได้)

ด้วยเหตุผลนี้คุณไม่สามารถสั่งให้หน้าต่างไม่สามารถใช้ที่อยู่หน่วยความจำบางอย่างได้ วิธีเดียวที่ Microsoft จะทำการแก้ไขเคอร์เนลสำหรับเคสของคุณเป็นการเฉพาะ ไม่แน่

การกระจายที่อยู่หน่วยความจำไม่ดี

มีหลายเหตุผลที่โมดูลหน่วยความจำอาจมีที่อยู่ไม่ถูกต้อง ท้ายที่สุดแล้วมันจะเดือดร้อนถึงข้อผิดพลาดในสายการผลิตโดยสมมติว่ามันไม่ได้รับความเสียหายก่อนที่จะเข้าสู่คอมพิวเตอร์ของคุณ ตรงกันข้ามกับฮาร์ดไดรฟ์ไม่มีชิ้นส่วนที่เคลื่อนย้ายได้ในโมดูลหน่วยความจำอย่างที่คุณรู้ ดังนั้นเซกเตอร์ที่ไม่ดีมักจะไม่แพร่กระจายอย่างเช่นในกรณีของเซกเตอร์ฮาร์ดไดรฟ์

อย่างไรก็ตามซอฟต์แวร์ทดสอบหน่วยความจำนั้นไม่สามารถป้องกันความผิดพลาดได้ เป็นไปได้ (และทั่วไป) เพื่อให้ผ่านที่อยู่บางอย่างที่ไม่ดี ดังนั้นหน่วยความจำที่ไม่ดีอาจให้การแสดงผลของ "การแพร่กระจาย" เนื่องจากที่อยู่จำนวนมากถูกเปิดเผยว่าไม่ดี ด้วยเหตุนี้เครื่องมืออย่าง BadMem จะเปิดเผยจุดอ่อนของพวกเขาเพราะโดยธรรมชาติแล้วพวกเขาสามารถจัดการที่อยู่เหล่านั้นที่คุณสั่งการเท่านั้น

ไม่น่าเป็นไปได้ที่ทุกคนจะสามารถทำการทดสอบหน่วยความจำได้อย่างละเอียดและระบุที่อยู่หน่วยความจำไม่ดีทั้งหมดจากนั้นล็อคพวกเขาและจบลงด้วยโมดูลหน่วยความจำ "ดี" สิ่งที่ง่ายที่สุดที่ต้องทำคือพิจารณาโมดูลที่มีที่อยู่ไม่ดีเป็นโมดูลที่มีข้อบกพร่องตลอดจนไม่น่าเชื่อถือ

สิ่งนี้หมายความว่าเท่าที่ BadMem เป็นข้อเสนอที่น่าสนใจจริงๆแล้วมันไม่ใช่วิธีแก้ปัญหาของหน่วยความจำไม่ดี มีโอกาสมากกว่าที่คุณจะไม่ได้จบลงด้วยระบบปฏิบัติการที่พยายามอ่านเซกเตอร์เสียและล้มเหลวด้วยข้อผิดพลาดที่ทำให้หยุดชะงัก โมดูลที่ไม่ดีคือโมดูลที่ไม่ดีคือโมดูลที่ไม่ดี


มีคำตอบที่ดีอยู่สองสามข้อ แต่ฉันจะยอมรับสิ่งนี้เพื่อให้เหตุผลที่ดีว่าทำไมไม่ทำเช่นนั้น เคอร์เนลของ Windows สามารถบอกได้ว่าจะไม่ใช้ที่อยู่บางที่ผ่านมาตามที่คนอื่น ๆ ระบุไว้ แต่เมื่อข้อผิดพลาดอยู่ตรงกลางของพื้นที่ที่อยู่มันก็เหมือนกับการใช้ขวานเมื่อคุณต้องการ scapel ... ต้องการการควบคุมที่ละเอียดยิ่งขึ้น เห็นได้ชัดว่าเป็นไปไม่ได้ มันน่าเสียดาย
บ๊อบ

8
ไม่ค่อยถูกต้องนัก มันเป็นไปได้ที่จะสั่งให้ Windows เพื่อหลีกเลี่ยงการอยู่บางอย่าง (ถูกต้องมากขึ้นบางหมายเลขกรอบหน้า) ฟังก์ชั่นที่ถูกออกแบบสำหรับหน่วยความจำ ECC กับที่ Windows สามารถตรวจสอบความผิดพลาดที่เป็นไปได้และทำเครื่องหมาย PFNs เหล่านั้นเป็นที่ไม่ดี แต่ก็เป็นไปได้ที่จะเพิ่ม PFNs ด้วยตนเองเพื่อให้รายการ: superuser.com/a/490522/117590 - เพียงแค่ไม่ได้ในทางปฏิบัติมาก ดังนั้นการเปลี่ยนยังคงเป็นตัวเลือกที่ดีที่สุด: P
Bob

17

Windows BCD (ข้อมูลการกำหนดค่าการบู๊ต) จริงมี{badmemory}วัตถุ ดูเหมือนว่าที่อยู่หน่วยความจำที่ "คาดการณ์ว่าจะล้มเหลว" โดยหน่วยความจำ ECC จะปรากฏที่นี่และไม่ได้ใช้โดยระบบปฏิบัติการ

{badmemory}วัตถุยอมรับBadMemoryList(BCD ประเภท0x1700000a) องค์ประกอบซึ่งเป็นรายการของจำนวนเต็มที่สามารถป้อนเป็นฐานสิบหกคั่นด้วยช่องว่าง ฉันเดาว่ามันจะเป็นไปได้ที่จะใส่ที่อยู่หน่วยความจำไม่ดีด้วยตนเองโดยพบว่า memtest86 ในองค์ประกอบนี้ - แต่ฉันยังไม่ได้ทดสอบนี้ เห็นได้ชัดว่ามันยอมรับหมายเลขเฟรมของหน้าซึ่งเป็นที่อยู่ที่แท้จริงหารด้วย 4096แต่น่าเสียดายที่อยู่ / PFN เหล่านี้อาจไม่ตรงกับที่รายงานโดยการวินิจฉัยหน่วยความจำ คู่มือการแก้ไขสามารถทำได้ด้วยภาพ BCD แก้ไข

ไม่ว่าในกรณีใด ๆ หน่วยความจำผิดปกติควรถูกเปลี่ยนใหม่ตามที่ระบุโดยคำตอบอื่น ๆ นี่เป็นเพียงหมายเหตุเกี่ยวกับวิธีที่เป็นไปได้ในการแก้ไขปัญหา (ชั่วคราวหรือไม่)


รูปแบบที่ดีกว่าการกวดวิชาของทุกอย่างที่คุณกล่าวว่าสามารถใช้ได้ที่นี่ งานที่ดีโดยไม่คำนึงว่า
mirh

13

Windows BCD มี{badmemorylist}และ{badmemoryaccess}วัตถุ คุณควรตั้งค่าหน้าแรกเป็นหน้าหน่วยความจำไม่ดีคั่นด้วยช่องว่าง (เช่น. bcdedit /set badmemorylist 1499543 1434007) และหน้าสองเป็นNo( bcdedit /set badmemoryaccess No)

จำไว้ว่าขนาดหน้าหน่วยความจำใน windows มักจะเป็น 4KB

ผ่านการทดสอบใน windows 7 และใช้งานได้ดี

คุณสามารถทดสอบการตั้งค่าของคุณโดย Rammap โดย Sysinternals

ป.ล. ฉันได้รับข้อมูลนั้นจาก "Windows Internals Book" chapter 10


13

ฉันมีปัญหา RAM ในแท็บเล็ตที่มี SoC หน่วยความจำเชื่อมหรือรวมเข้ากับ SoC และไม่สามารถเปลี่ยนได้

ฉันอยู่ในอาร์เจนตินาและผู้ขายอยู่ในประเทศจีนและค่าจัดส่งและเวลามันไม่สมเหตุสมผลที่จะส่งรับประกัน

ฉันจัดการความนิยมไม่กี่

กุญแจสำคัญในการผ่านพารามิเตอร์หน่วยความจำที่เสียหายคือ:

  1. ที่อยู่ในการแข่งขัน memtest86 ที่อยู่ที่ใช้ใน Windows
  2. ต้องทำเครื่องหมายหน้าเต็มของ 4KBytes
  3. ใน memtest 0x10000000สอดคล้องกับ 0x10000 ใน Windows
  4. ใน memtest 0x00001000สอดคล้องกับ 0x1 ใน Windows
  5. หมายถึง: หมายเลขหน้าใน windows จะลบเลขฐานสิบหก memtest 3 ตัวสุดท้าย
  6. หมายความว่า: windows กำจัดค่าศูนย์ทางด้านซ้าย
  7. พิจารณา 5 และ 6 เพื่อหลีกเลี่ยงข้อผิดพลาดในหมายเลขหน้า
  8. คำสั่งที่ถูกต้องคือ: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAถึงข้อผิดพลาดใน memtest จาก 0x000B7000 ถึง 0x000BAFFF โปรดทราบว่าคุณไม่สามารถใส่ช่วงของความทรงจำ แต่ทุกหน้าทีละคน
  9. ไม่สามารถเพิ่มหน้าทุกหน้าควรทำเครื่องหมายในคำสั่งเดียวกัน หากหน้าใหม่ให้เพิ่มการเขียนทับแบบเก่ากว่า ฉันจัดการเพื่อเพิ่ม 4096 หน้าในคำสั่งเดียว ฉันไม่ได้ลองอีกแล้ว
  10. bcdedit /enum {badmemory}, แสดงรายการหน้าเว็บที่ทำเครื่องหมายไว้
  11. bcdedit /set badmemoryaccess no ป้องกันการใช้หน้าเว็บที่ทำเครื่องหมายไว้
  12. จำเป็นต้องรีบูตหลังจากทำเครื่องหมายหน้าเว็บและลบการเข้าถึง

1
ฉันต้องลบช่องว่างสีขาวระหว่าง/คำสั่งและคำสั่งให้ทำงานดังนั้นแทนที่จะbcdedit / enum {badmemory}เป็นbcdedit /enum {badmemory}แบบเดียวกันสำหรับคนอื่น ๆ
flagg19

มันใช้งานได้ แต่น่าเสียดายที่ขีด จำกัด cmd บน Windows นั้น จำกัด ที่ 8191 และฉันไม่สามารถบล็อกหน้าหน่วยความจำที่ไม่ดีทั้งหมดได้ ฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีในการแก้ปัญหานี้ มีวิธีบันทึกช่วงของหน้าหรือไม่ ฉันควรบล็อกทุกหน้าจาก 0x714bc8 ถึง 0x71cbd0 ซึ่งเป็นหน้ามากเกินไป! ฉันทำอะไรไปแล้ว ฉันรันการทดสอบที่ง่ายที่สุด (# 0 และ # 1) และได้รับข้อผิดพลาดของหน่วยความจำในช่วงที่ จำกัด มากขึ้น มันใช้งานได้ดีจนถึงไม่มีหน้าจอสีน้ำเงินอีกต่อไป แต่ฉันรู้ว่าฉันไม่ได้ปิดกั้นทุกสิ่งที่จำเป็น
เฟลิเป้

3

เท่าที่ฉันทราบวิธีเดียวในการทำเช่นนี้คือการใช้คำสั่ง BurnMem ซึ่งสามารถ จำกัด ปริมาณการใช้งาน Windows RAM


2
อืม .. นั่นเป็นตัวเลือกที่น่าสนใจ บางทีmaxmemเนื่องจากดูเหมือนburnmemจะไม่ได้ จำกัด ที่อยู่ทางกายภาพสูงสุดmaxmemไว้ วิสต้าและ 7 truncatememoryจะเทียบเท่า ขณะนี้เป็นวิธีแก้ปัญหาที่เป็นไปได้มีวิธีที่แม่นยำกว่าสำหรับกรณีที่หน่วยความจำที่มีข้อบกพร่องอยู่ตรงกลางหรือจุดเริ่มต้นของพื้นที่ที่อยู่และปิดกั้นทุกอย่างหลังจากที่มันไม่ต้องการ?
Bob

@Bob - เหตุผลที่คุณไม่สามารถแทนที่ modual หน่วยความจำไม่ดีเป็นเพราะเหตุใด
Ramhound

@ ค้อนฉันทำได้ถ้าฉันต้องการ แต่นั่นจะต้องใช้เวลา ตอนนี้ฉันทำงานด้วยหน่วยความจำดั้งเดิมของฉันครึ่งหนึ่งซึ่งไม่เหมาะสำหรับ VMs ของฉัน การได้รับโมดูลใหม่หรือโมดูลทดแทนที่ใช้งานได้จริงอาจใช้เวลาสองสามสัปดาห์ หากโซลูชันซอฟต์แวร์ให้ฉันทำสิ่งนี้ภายในสองชั่วโมงหรือน้อยกว่านั้นฉันจะพิจารณาว่าใช้เวลาอย่างคุ้มค่าและมีสิ่งใหม่ที่เรียนรู้ ฉันจะยอมรับคำตอบนี้ (หน่วยความจำของฉันล้มเหลวในตอนท้ายของพื้นที่ที่อยู่) แต่ถ้าใครบางคนมีวิธีแก้ปัญหาที่หลากหลายมากขึ้นฉันจะชอบมันสำหรับการอ้างอิงในอนาคต
บ๊อบ

@Bob - หลังจากที่ได้อ่านสิ่งนี้อย่างกว้างขวางดูเหมือนว่ามันเป็นไปไม่ได้ นี่เป็นเพราะ BadRam ใช้ memtest เพื่อสั่งให้เคอร์เนลเพื่อแยก adresses ที่ไม่ดีออกจาก bootloader, Windows ไม่สามารถทำเช่นนี้เนื่องจากขณะนี้ยังไม่มีวิธีที่จะทำให้ที่อยู่ที่ไม่ดีที่จะแยกออกในลักษณะเดียวกับที่ BadRam patched kernel สามารถ .
Oliver G

3

ดูการใช้ประโยชน์นี้: https://github.com/prsyahmi/BadMemory

มันใช้งานง่ายมากและรองรับการปิดกั้นช่วงที่อยู่ และคุณสามารถใช้ที่อยู่แบบเต็มที่ได้รับจาก MemTest86 โดยไม่ต้องลบตัวเลขสามหลักสุดท้าย


2

ข้อควรระวัง !!! Windows อาจไม่สามารถบู๊ตได้พร้อมที่จะสร้าง BCD ใหม่ สำหรับกรณีนั้นให้ใช้ Command Promt ในตัวเลือก Advanced Startup ฉันไม่รู้ว่าทำไมมันถึงไม่สามารถบู๊ตได้อีกต่อไปดูเหมือนว่าจะเกิดขึ้นแบบสุ่มหรือถ้าคุณใส่ที่อยู่จำนวนมากเกินไปในรายการบันทึกที่ไม่ดี

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

เป็นโปรแกรมพร้อมรับคำสั่ง C ++ ที่ได้รับรายการที่อยู่หน่วยความจำอย่างต่อเนื่องในไฟล์. txt พร้อม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.