Memtest86+ เป็นตัวทดสอบหน่วยความจำโอเพ่นซอร์สแบบสแตนด์อโลนฟรีสำหรับคอมพิวเตอร์สถาปัตยกรรม x86 และ x86-64 ให้การตรวจสอบหน่วยความจำอย่างละเอียดมากกว่าการทดสอบหน่วยความจำ BIOS
นอกจากนี้ยังสามารถเข้าถึงหน่วยความจำของคอมพิวเตอร์เกือบทั้งหมด โดยไม่ถูกจำกัดโดยหน่วยความจำที่ใช้โดยระบบปฏิบัติการ และไม่ขึ้นอยู่กับซอฟต์แวร์พื้นฐานใดๆ เช่น ไลบรารี UEFI
Memtest86+ สามารถโหลดและรันได้โดยตรงด้วย PC BIOS (รุ่นเก่าหรือ UEFI) หรือผ่านทาง bootloader ระดับกลางที่รองรับ Linux 16 บิต, 32 บิต, 64 บิต หรือ EFI handover boot protocol ควรใช้งานได้กับคลาส Pentium หรือ CPU 32 บิตหรือ 64 บิตที่ใหม่กว่า
ไบนารี่รีลีส (ทั้งเวอร์ชันเสถียรและเวอร์ชันพัฒนาทุกคืน) มีอยู่ใน memtest.org
Memtest86+ v6.00 มีพื้นฐานมาจาก PCMemTest ซึ่งเป็นทางแยกและเขียนใหม่ของ Memtest86+ v5 รุ่นก่อนหน้า ซึ่งในทางกลับกันเป็นทางแยกของ MemTest-86 วัตถุประสงค์ของการเขียน PCMemTest ซ้ำคือ:
ในกระบวนการสร้าง PCMemTest คุณลักษณะหลายประการของ Memtest86+ v5 ที่ไม่จำเป็นสำหรับการทดสอบหน่วยความจำระบบอย่างเคร่งครัดได้หลุดออกไป โดยเฉพาะอย่างยิ่ง ไม่มีความพยายามในการวัดแคชและความเร็วหน่วยความจำหลัก หรือเพื่อระบุและรายงานประเภท DRAM คุณสมบัติเหล่านี้ถูกเพิ่มกลับและขยายใน Memtest86+ v6.0 เพื่อสร้างรุ่นที่เป็นหนึ่งเดียวและมีคุณลักษณะครบถ้วน
Memtest86+ ได้รับการเผยแพร่ภายใต้เงื่อนไขของ GNU General Public License เวอร์ชัน 2 (GPLv2) นอกเหนือจากข้อกำหนดของ GPL แล้ว ไม่มีข้อจำกัดสำหรับการใช้งาน ส่วนตัวหรือเชิงพาณิชย์ ดูไฟล์ใบอนุญาตสำหรับรายละเอียด
Build ได้รับการทดสอบบนระบบ Linux เท่านั้น แต่ควรเป็นไปได้บนระบบใด ๆ ที่ใช้ GNU toolchain และรูปแบบไฟล์ ELF เครื่องมือที่จำเป็นคือ:
หากต้องการสร้างอิมเมจ 32 บิต ให้เปลี่ยนไดเร็กทอรีเป็นไดเร็กทอรี build32
แล้วพิมพ์ make
ผลลัพธ์ที่ได้คือไฟล์อิมเมจไบนารี memtest.bin
ซึ่งสามารถบู๊ตได้โดยตรงด้วย BIOS รุ่นเก่า (ในโหมดฟล็อปปี้ดิสก์) หรือโดยบูทโหลดเดอร์ระดับกลางโดยใช้โปรโตคอลการบู๊ต Linux 16 บิต และไฟล์อิมเมจไบนารี memtest.efi
ซึ่งสามารถบู๊ตได้โดยตรง โดย UEFI BIOS 32 บิต อิมเมจทั้งสองสามารถบูตได้ด้วยโปรแกรมโหลดบูตระดับกลางโดยใช้โปรโตคอลการบูตการส่งมอบ Linux 32 บิตหรือ 32 บิต EFI
หากต้องการสร้างอิมเมจ 64 บิต ให้เปลี่ยนไดเร็กทอรีเป็นไดเร็กทอรี build64
แล้วพิมพ์ make
ผลลัพธ์ที่ได้คือไฟล์อิมเมจไบนารี memtest.bin
ซึ่งสามารถบู๊ตได้โดยตรงด้วย BIOS รุ่นเก่า (ในโหมดฟล็อปปี้ดิสก์) หรือโดยบูทโหลดเดอร์ระดับกลางโดยใช้โปรโตคอลการบู๊ต Linux 16 บิต และไฟล์อิมเมจไบนารี memtest.efi
ซึ่งสามารถบู๊ตได้โดยตรง โดย UEFI BIOS 64 บิต อิมเมจทั้งสองสามารถบูตได้ด้วยโปรแกรมโหลดบูตระดับกลางโดยใช้โปรโตคอลการบูตการส่งมอบ Linux 32 บิต, 64 บิต หรือ 64 บิต EFI
ไม่ว่าในกรณีใด หากต้องการสร้างอิมเมจ ISO ที่สามารถใช้สร้างซีดี ดีวีดี หรือแฟลชไดรฟ์ USB ที่สามารถบู๊ตได้ ให้พิมพ์ make iso
ผลลัพธ์ที่ได้คือไฟล์อิมเมจ ISO memtest.iso
จากนั้นสามารถเขียนลงในแผ่นซีดีหรือดีวีดีเปล่าได้โดยตรง หรือลงในแฟลชไดรฟ์ USB ซึ่งสามารถบู๊ตได้โดยตรงโดยใช้ BIOS รุ่นเก่าหรือ UEFI PC
โปรดทราบว่าเมื่อเขียนลงในแฟลชไดรฟ์ USB อิมเมจ ISO จะต้องถูกเขียนโดยตรง ('ทิ้ง') ลงในอุปกรณ์ดิบ ไม่ว่าจะโดยใช้คำสั่ง dd
หรือโดยใช้ยูทิลิตี้ที่มีฟังก์ชันการทำงานเดียวกัน
เมื่อใช้ bootloader ระดับกลาง ไฟล์ memtest.bin
หรือไฟล์ memtest.efi
ควรเก็บไว้ในพาร์ติชันดิสก์ที่ bootloader สามารถเข้าถึงได้ และควรอัปเดตการกำหนดค่า bootloader ให้บูตจากไฟล์นั้นราวกับว่าเป็นเคอร์เนล Linux ด้วย ไม่มีดิสก์ RAM เริ่มต้น รู้จักตัวเลือกบรรทัดคำสั่งการบูตหลายตัวเลือก ดังที่อธิบายไว้ด้านล่าง หากใช้โปรโตคอลการบูต 16 บิต Memtest86+ จะใช้การแสดงผลในโหมดข้อความ (640x400) หากใช้โปรโตคอลการบูตแบบ 32 บิตหรือ 64 บิต Memtest86+ จะใช้จอแสดงผลในโหมดข้อความหรือโหมดกราฟิก ตามที่ระบุไว้ในโครงสร้าง boot_params
ที่ส่งผ่านโดย bootloader หากอยู่ในโหมดกราฟิก framebuffer ที่ให้มาจะต้องมีขนาดอย่างน้อย 640x400 พิกเซล หากใหญ่กว่านี้ จอแสดงผลจะอยู่ตรงกลาง หากระบบบูตในโหมด UEFI จะต้องใช้โหมดกราฟิก
เพื่อการทดสอบ มีตัวเลือกในการสร้างอิมเมจ ISO ที่ใช้ GRUB เป็นโปรแกรมโหลดบูตระดับกลาง ดู Makefile
ในไดเร็กทอรี build32
หรือ build64
สำหรับรายละเอียด อิมเมจ ISO นั้นเป็นทั้งแบบดั้งเดิมและสามารถบูต UEFI ได้ ดังนั้นคุณต้องมีโมดูล GRUB สำหรับทั้งแบบดั้งเดิมและการบูต EFI ที่ติดตั้งบนระบบบิลด์ของคุณ (เช่นบน Debian โมดูล GRUB ที่จำเป็นจะอยู่ในแพ็คเกจ grub-pc-bin
, grub-efi-ia32-bin
และ grub-efi-amd64-bin
) คุณอาจต้องปรับพาธและชื่อไฟล์ใน Makefile ให้ตรงกับชื่อในระบบของคุณ
ไฟล์คอนฟิกูเรชัน GRUB ที่อยู่ในไดเร็กทอรี grub
นั้นมีไว้สำหรับใช้กับ ISO ทดสอบ แต่ยังเป็นตัวอย่างของการบูต Memtest86+ จาก GRUB
bootloader ระดับกลางอาจส่งผ่านบรรทัดคำสั่งการบูตไปที่ Memtest86+ บรรทัดคำสั่งอาจมีตั้งแต่หนึ่งตัวเลือกขึ้นไป โดยคั่นด้วยช่องว่าง แต่ละตัวเลือกประกอบด้วยชื่อตัวเลือก ตามด้วยเครื่องหมาย =
และพารามิเตอร์ตั้งแต่หนึ่งตัวขึ้นไป โดยคั่นด้วยเครื่องหมายจุลภาค รู้จักตัวเลือกต่อไปนี้:
0x
(เช่น 0xFEDC9000) Memtest86+ รองรับทั้งอินเทอร์เฟซคีย์บอร์ดแบบเดิม (ใช้พอร์ต I/O 0x60 และ 0x64) และคีย์บอร์ด USB (ใช้ไดรเวอร์อุปกรณ์ USB ของตัวเอง) สามารถเลือกอย่างใดอย่างหนึ่งหรือทั้งสองอย่างได้ผ่านทางบรรทัดคำสั่งการบูต หากไม่ได้ระบุไว้ในบรรทัดคำสั่ง ค่าเริ่มต้นคือการใช้ทั้งสองอย่างหากระบบบู๊ตในโหมด UEFI มิฉะนั้นจะใช้เฉพาะอินเทอร์เฟซดั้งเดิมเท่านั้น
โดยปกติ BIOS รุ่นเก่าจะรองรับการจำลองแป้นพิมพ์ USB แบบดั้งเดิม ซึ่งทำให้แป้นพิมพ์ USB ทำหน้าที่เหมือนกับแป้นพิมพ์รุ่นเก่าที่เชื่อมต่อกับพอร์ต 0x60 และ 0x64 ซึ่งมักจะสามารถเปิดหรือปิดใช้งานได้ในเมนูการตั้งค่า BIOS หากเปิดใช้งานไดรเวอร์อุปกรณ์ USB ของ Memtest86+ ไดรเวอร์เหล่านี้จะแทนที่สิ่งนี้และเข้าถึงคีย์บอร์ด USB ใด ๆ โดยตรง ข้อเสียคือคอนโทรลเลอร์ USB และไดรเวอร์อุปกรณ์จำเป็นต้องมีหน่วยความจำบางส่วนเพื่อสงวนไว้สำหรับการใช้งานส่วนตัว ซึ่งหมายความว่าการทดสอบหน่วยความจำจะไม่ครอบคลุมหน่วยความจำ ดังนั้น เพื่อเพิ่มความครอบคลุมการทดสอบให้สูงสุด หากได้รับการสนับสนุน ให้เปิดใช้งานการจำลองแป้นพิมพ์ USB รุ่นเก่า และหากบูตในโหมด UEFI ให้เพิ่ม keyboard=legacy
ในบรรทัดคำสั่งการบูต
หมายเหตุ : UEFI BIOS บางตัวรองรับเฉพาะการจำลองแป้นพิมพ์ USB แบบดั้งเดิมเมื่อคุณเปิดใช้งานความเข้ากันได้ระบบโมดูล (CSM) ในการตั้งค่า BIOS คนอื่นรองรับเฉพาะเมื่อทำการบูทในโหมดดั้งเดิมเท่านั้น
อุปกรณ์ USB จำนวนมากไม่สอดคล้องกับข้อกำหนด USB อย่างสมบูรณ์ หากโพรบแป้นพิมพ์ USB หยุดทำงานหรือตรวจไม่พบแป้นพิมพ์ของคุณ ให้ลองใช้วิธีแก้ไขปัญหาต่างๆ ที่ได้รับจากตัวเลือกการบูต "usbinit"
หมายเหตุ : ไดรเวอร์ Memtest86+ USB ยังไม่รองรับ Hot-plugging เมื่อใช้สิ่งเหล่านี้ ควรเสียบปลั๊กแป้นพิมพ์ USB ก่อนเรียกใช้ Memtest86+ และควรเสียบปลั๊กไว้ตลอดการทดสอบ
เครื่อง 2-in-1 บางรุ่นใช้แผง LCD ซึ่งเป็นจอแสดงผลโหมดแนวตั้งโดยกำเนิด แต่จะติดตั้งไว้ที่ด้านข้างเมื่อต่อเข้ากับคีย์บอร์ด เมื่อใช้จอแสดงผลในโหมดกราฟิก Memtest86+ สามารถหมุนจอแสดงผลให้ตรงกันได้ เพิ่มตัวเลือก "screen.rhs-up" หรือ "screen.lhs-up" บนบรรทัดคำสั่งการบูต ขึ้นอยู่กับการวางแนวของแผง LCD เมื่อใช้จอแสดงผลในโหมดข้อความ คาดว่า BIOS จะจัดการเรื่องนี้โดยอัตโนมัติ
เมื่อบูตในโหมดดั้งเดิม Memtest86+ จะใช้ความละเอียดหน้าจอที่กำหนดโดย BIOS หรือโดยตัวโหลดระดับกลาง เมื่อบูตในโหมด UEFI โดยปกติแล้ว Memtest86+ จะเลือกความละเอียดหน้าจอที่เล็กที่สุดที่มีอยู่ซึ่งครอบคลุมการแสดงผล 640x400 พิกเซล BIOS บางตัวส่งคืนข้อมูลที่ไม่ถูกต้องเกี่ยวกับโหมดการแสดงผลที่มีอยู่ ดังนั้นคุณจึงสามารถแก้ไขได้โดยการเพิ่มตัวเลือก "screen.mode=" บนบรรทัดคำสั่งการบูต
โปรดทราบว่าเมื่อใช้การหมุนจอแสดงผล ความละเอียดหน้าจอที่ระบุจะใช้สำหรับการแสดงผลที่ไม่ได้หมุน
เมื่อบูตแล้ว Memtest86+ จะเริ่มต้นการแสดงผล จากนั้นหยุดชั่วคราวสักครู่เพื่อให้ผู้ใช้สามารถกำหนดค่าการทำงานได้ หากไม่มีการกดปุ่มใดเลย การทดสอบทั้งหมดจะเริ่มโดยอัตโนมัติโดยใช้แกน CPU เดียว และดำเนินการต่อไปอย่างไม่มีกำหนดจนกว่าผู้ใช้จะรีบูตหรือหยุดเครื่อง
เมื่อเริ่มต้นและเมื่อทำการทดสอบ Memtest86+ จะตอบสนองต่อคีย์ต่อไปนี้:
โปรดทราบว่าการทดสอบจะหยุดลงเมื่อเปิดใช้งานการล็อคการเลื่อนและพื้นที่การเลื่อนเต็ม
เมนูการกำหนดค่าช่วยให้ผู้ใช้สามารถ:
ในทุกกรณี อาจใช้ปุ่มตัวเลขเป็นทางเลือกแทนปุ่มฟังก์ชัน (1 = F1, 2 = F2, ... 0 = F10)
โหมดการรายงานข้อผิดพลาดอาจเปลี่ยนแปลงได้ตลอดเวลาโดยไม่รบกวนลำดับการทดสอบปัจจุบัน สถิติข้อผิดพลาดจะถูกรวบรวมโดยไม่คำนึงถึงโหมดการรายงานข้อผิดพลาดปัจจุบัน (ดังนั้นการสลับไปยังโหมดสรุปข้อผิดพลาดจะแสดงสถิติที่สะสมตั้งแต่เริ่มลำดับการทดสอบปัจจุบัน) รูปแบบ BadRAM จะถูกสะสมเมื่ออยู่ในโหมด BadRAM เท่านั้น ขอบเขต memmap ของ Linux จะถูกสะสมเมื่ออยู่ในโหมด memmap เท่านั้น หมายเลขหน้าที่ไม่ถูกต้องจะถูกสะสมเมื่ออยู่ในโหมดเพจที่ไม่ดีเท่านั้น
การเปลี่ยนแปลงใดๆ ในการทดสอบ ช่วงที่อยู่ หรือโหมดการจัดลำดับ CPU ที่เลือก จะเป็นการเริ่มลำดับการทดสอบใหม่และรีเซ็ตสถิติข้อผิดพลาด
โหมดนับข้อผิดพลาดเท่านั้นจะแสดงจำนวนข้อผิดพลาดทั้งหมดที่พบตั้งแต่เริ่มลำดับการทดสอบปัจจุบัน
โหมดสรุปข้อผิดพลาดจะแสดงข้อมูลต่อไปนี้:
โหมดข้อผิดพลาดแต่ละรายการจะแสดงข้อมูลต่อไปนี้สำหรับอินสแตนซ์ข้อผิดพลาดแต่ละรายการ:
โหมดรูปแบบ BadRAM จะสะสมและแสดงรูปแบบข้อผิดพลาดเพื่อใช้กับคุณสมบัติ Linux BadRAM หรือคำสั่ง GRUB badram เส้นจะถูกพิมพ์ในรูปแบบ badram=F1,M1,F2,M2...
ในแต่ละคู่ F,M
นั้น F
แสดงถึงที่อยู่ข้อบกพร่อง และ M
คือบิตมาสก์สำหรับที่อยู่นั้น รูปแบบเหล่านี้ระบุว่ามีข้อผิดพลาดเกิดขึ้นในที่อยู่ที่เท่ากับ F บนทั้ง 1
บิตใน M รูปแบบดังกล่าวอาจจับข้อผิดพลาดได้มากกว่าที่มีอยู่จริง แต่อย่างน้อยข้อผิดพลาดทั้งหมดจะถูกบันทึกไว้ รูปแบบเหล่านี้ได้รับการออกแบบมาเพื่อจับรูปแบบปกติของข้อผิดพลาดที่เกิดจากโครงสร้างฮาร์ดแวร์ในรูปแบบสั้น ๆ
รูปแบบ BadRAM จะเพิ่มขึ้นทีละน้อยแทนที่จะคำนวณจากภาพรวมของข้อผิดพลาดทั้งหมด จำนวนคู่ถูกจำกัดไว้ที่ 20 ด้วยเหตุผลหลายประการในทางปฏิบัติ ด้วยเหตุนี้ รูปแบบงานฝีมือจากเอาต์พุตในโหมดการพิมพ์ที่อยู่อาจให้ผลลัพธ์ที่ดีกว่า ในบางกรณี
หมายเหตุ ตามที่กล่าวไว้ในคำอธิบายการทดสอบแต่ละรายการ การทดสอบที่อยู่ของคนเดิน (การทดสอบ 0) และการทดสอบการเคลื่อนที่ของบล็อก (การทดสอบ 7) ไม่มีส่วนสนับสนุนรูปแบบ BadRAM เนื่องจากการทดสอบเหล่านี้ไม่อนุญาตให้กำหนดที่อยู่ที่แน่นอนของข้อบกพร่อง .
โหมด Linux memmap จะสะสมและแสดงขอบเขตหน่วยความจำที่ผิดพลาดเพื่อใช้กับ [ตัวเลือกบรรทัดคำสั่งการบูต Linux memmap] (https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt) บรรทัดจะพิมพ์ในรูปแบบ memmap=S1$A1,S2,A2...
ในแต่ละคู่ S,A
นั้น A
แสดงถึงที่อยู่แรกในภูมิภาค และ S
คือขนาดของพื้นที่ (เป็นไบต์) บันทึกขอบเขตหน่วยความจำผิดพลาดได้สูงสุด 20 รายการ เมื่อพบภูมิภาคของตำแหน่งที่ผิดพลาดต่อเนื่องกันมากกว่า 20 ภูมิภาค ภูมิภาคต่างๆ จะถูกรวมเข้าด้วยกัน ซึ่งหมายความว่าบางภูมิภาคจะมีตำแหน่งที่ผิดพลาดรวมอยู่ด้วย โปรแกรมจะพยายามลดจำนวนตำแหน่งที่ไม่ผิดพลาดให้เหลือน้อยที่สุด
หมายเหตุ ตามที่กล่าวไว้ในคำอธิบายการทดสอบแต่ละรายการ การทดสอบที่อยู่ของคนเดิน (การทดสอบ 0) และการทดสอบการเคลื่อนที่ของบล็อก (การทดสอบ 7) ไม่ได้มีส่วนทำให้เกิดพื้นที่หน่วยความจำที่ผิดพลาด เนื่องจากการทดสอบเหล่านี้ไม่อนุญาตให้มีที่อยู่ที่แน่นอนของข้อบกพร่อง มุ่งมั่น.
โหมดเพจที่เสียหายจะสะสมและแสดงหมายเลขหน้าหน่วยความจำที่ผิดพลาด สิ่งเหล่านี้อาจใช้กับคำสั่ง Windows bcdedit เพื่อเพิ่มเพจเหล่านั้นลงในรายการหน่วยความจำ Windows PFA หมายเลขหน้าจะแสดงเป็นเลขฐานสิบหกตัวเดียว (เช่น 0x20
) หรือช่วงของหมายเลขหน้าเลขฐานสิบหก (เช่น 0x20..0x2a
) บันทึกหน้าที่ผิดพลาดได้สูงสุด 20 ช่วง เมื่อพบหน้าที่มีข้อผิดพลาดที่ต่อเนื่องกันมากกว่า 20 ช่วง ช่วงต่างๆ จะถูกรวมเข้าด้วยกัน ซึ่งหมายความว่าบางช่วงจะรวมหน้าที่ไม่มีข้อผิดพลาดด้วย โปรแกรมจะพยายามลดจำนวนหน้าที่ไม่มีข้อผิดพลาดให้เหลือน้อยที่สุด
หมายเหตุ ตามที่กล่าวไว้ในคำอธิบายการทดสอบแต่ละรายการ การทดสอบที่อยู่ของคนเดิน (การทดสอบ 0) และการทดสอบการเคลื่อนที่ของบล็อก (การทดสอบ 7) ไม่มีส่วนทำให้หมายเลขหน้าที่ผิดพลาด เนื่องจากการทดสอบเหล่านี้ไม่อนุญาตให้มีที่อยู่ที่แน่นอนของข้อบกพร่อง มุ่งมั่น.
โปรดทราบว่าข้อผิดพลาดทั้งหมดที่รายงานโดย Memtest86+ ไม่ใช่ว่าเกิดจากหน่วยความจำไม่ดี การทดสอบนี้เป็นการทดสอบ CPU, แคช และมาเธอร์บอร์ดโดยปริยาย เป็นไปไม่ได้ที่การทดสอบจะระบุได้ว่าอะไรเป็นสาเหตุของความล้มเหลว ความล้มเหลวส่วนใหญ่จะเกิดจากปัญหาเกี่ยวกับหน่วยความจำ เมื่อไม่เป็นเช่นนั้น ทางเลือกเดียวคือเปลี่ยนชิ้นส่วนจนกว่าข้อผิดพลาดจะได้รับการแก้ไข
เมื่อตรวจพบข้อผิดพลาดของหน่วยความจำแล้ว การพิจารณาโมดูลที่ล้มเหลวนั้นไม่ใช่ขั้นตอนที่ชัดเจน เนื่องจากมีผู้จำหน่ายมาเธอร์บอร์ดจำนวนมากและอาจมีสล็อตหน่วยความจำหลายช่องรวมกัน จึงอาจเป็นเรื่องยากหากไม่สามารถรวบรวมข้อมูลทั้งหมดเกี่ยวกับข้อผิดพลาดที่จะแมปกับโมดูลหน่วยความจำที่ชำรุดได้ อย่างไรก็ตาม มีขั้นตอนที่อาจต้องดำเนินการเพื่อระบุโมดูลที่ล้มเหลว นี่คือเทคนิคบางอย่างที่คุณอาจต้องการใช้:
การถอดโมดูล
โมดูลการหมุน
การเปลี่ยนโมดูล
บางครั้งข้อผิดพลาดของหน่วยความจำปรากฏขึ้นเนื่องจากความไม่เข้ากันของส่วนประกอบ โมดูลหน่วยความจำอาจทำงานได้ดีในระบบหนึ่งและไม่ใช่ในอีกระบบหนึ่ง นี่ไม่ใช่เรื่องแปลกและเป็นสาเหตุของความสับสน ส่วนประกอบต่างๆ ไม่จำเป็นต้องแย่เสมอไป แต่อาจจำเป็นต้องหลีกเลี่ยงส่วนผสมบางอย่าง
ในกรณีส่วนใหญ่ข้อผิดพลาดที่รายงานโดย Memtest86+ นั้นถูกต้อง มีบางระบบที่ทำให้ Memtest86+ สับสนเกี่ยวกับขนาดของหน่วยความจำ และจะพยายามทดสอบหน่วยความจำที่ไม่มีอยู่จริง ซึ่งจะทำให้ที่อยู่ติดกันจำนวนมากถูกรายงานว่าเสีย และโดยทั่วไปจะมีข้อผิดพลาดหลายบิต หากคุณมีที่อยู่ที่ล้มเหลวจำนวนค่อนข้างน้อยและมีข้อผิดพลาดเพียงหนึ่งหรือสองบิต คุณสามารถมั่นใจได้ว่าข้อผิดพลาดนั้นถูกต้อง ข้อผิดพลาดที่ไม่ต่อเนื่องก็มีผลเสมอเช่นกัน
ข้อผิดพลาดของหน่วยความจำที่ถูกต้องทั้งหมดควรได้รับการแก้ไข เป็นไปได้ว่าข้อผิดพลาดเฉพาะจะไม่ปรากฏขึ้นในการทำงานปกติ อย่างไรก็ตาม การทำงานโดยใช้หน่วยความจำส่วนเพิ่มนั้นมีความเสี่ยงและอาจส่งผลให้ข้อมูลสูญหายและแม้แต่ดิสก์เสียหายได้
Memtest86+ ไม่สามารถวินิจฉัยความล้มเหลวของพีซีได้หลายประเภท ตัวอย่างเช่น CPU ผิดพลาดที่ทำให้ระบบปฏิบัติการของคุณขัดข้อง มักจะทำให้ Memtest86+ ขัดข้องในลักษณะเดียวกัน
เวลาที่ต้องใช้ในการผ่าน Memtest86+ ทั้งหมดจะแตกต่างกันอย่างมาก ขึ้นอยู่กับความเร็วของ CPU ความเร็วหน่วยความจำ และขนาดหน่วยความจำ Memtest86+ ดำเนินการอย่างไม่มีกำหนด ตัวนับการผ่านจะเพิ่มขึ้นทุกครั้งที่รันการทดสอบที่เลือกทั้งหมด โดยทั่วไปการส่งผ่านเพียงครั้งเดียวก็เพียงพอแล้วที่จะตรวจจับข้อผิดพลาดทั้งหมดยกเว้นข้อผิดพลาดที่คลุมเครือที่สุด อย่างไรก็ตาม เพื่อความมั่นใจอย่างสมบูรณ์เมื่อสงสัยว่ามีข้อผิดพลาดเป็นระยะๆ แนะนำให้ทำการทดสอบเป็นระยะเวลานานขึ้น
มีแนวทางดีๆ มากมายในการทดสอบหน่วยความจำ อย่างไรก็ตาม การทดสอบจำนวนมากเพียงแค่ส่งรูปแบบบางอย่างไปที่หน่วยความจำโดยไม่ต้องคิดหรือมีความรู้เกี่ยวกับสถาปัตยกรรมหน่วยความจำมากนัก หรือจะตรวจจับข้อผิดพลาดได้ดีที่สุดอย่างไร วิธีนี้ใช้ได้ผลดีกับความล้มเหลวของหน่วยความจำในฮาร์ดดิสก์ แต่จะพบข้อผิดพลาดเป็นระยะๆ เพียงเล็กน้อย การทดสอบหน่วยความจำบน BIOS ไม่มีประโยชน์ในการค้นหาข้อผิดพลาดของหน่วยความจำที่ไม่ต่อเนื่อง
ชิปหน่วยความจำประกอบด้วยเซลล์หน่วยความจำที่อัดแน่นจำนวนมาก หนึ่งเซลล์สำหรับแต่ละบิตของข้อมูล ความล้มเหลวเป็นระยะๆ ส่วนใหญ่เป็นผลมาจากปฏิสัมพันธ์ระหว่างเซลล์หน่วยความจำเหล่านี้ การเขียนเซลล์หน่วยความจำบ่อยครั้งอาจทำให้เซลล์ใดเซลล์หนึ่งที่อยู่ติดกันถูกเขียนด้วยข้อมูลเดียวกัน การทดสอบหน่วยความจำที่มีประสิทธิผลจะพยายามทดสอบสภาวะนี้ ดังนั้น กลยุทธ์ในอุดมคติสำหรับการทดสอบหน่วยความจำจะเป็นดังนี้:
ควรชัดเจนว่ากลยุทธ์นี้ต้องการความรู้ที่แน่นอนเกี่ยวกับวิธีการวางเซลล์หน่วยความจำบนชิป นอกจากนี้ยังมีรูปแบบชิปที่เป็นไปได้จำนวนไม่สิ้นสุดสำหรับชิปประเภทต่างๆ และผู้ผลิต ซึ่งทำให้กลยุทธ์นี้ไม่สามารถใช้งานได้ อย่างไรก็ตาม มีอัลกอริธึมการทดสอบที่สามารถประมาณกลยุทธ์ในอุดมคตินี้ได้
Memtest86+ ใช้อัลกอริธึมสองตัวที่ให้การประมาณที่เหมาะสมของกลยุทธ์การทดสอบในอุดมคติข้างต้น กลยุทธ์แรกเหล่านี้เรียกว่าการพลิกกลับแบบเคลื่อนที่ การทดสอบการผกผันแบบเคลื่อนที่ทำงานดังนี้:
อัลกอริธึมนี้เป็นค่าประมาณที่ดีของการทดสอบหน่วยความจำในอุดมคติ แต่ก็มีข้อจำกัดบางประการ ชิปความหนาแน่นสูงส่วนใหญ่ในปัจจุบันจัดเก็บข้อมูลไว้กว้าง 4 ถึง 16 บิต ด้วยชิปที่มีความกว้างมากกว่าหนึ่งบิต จึงไม่สามารถเลือกอ่านหรือเขียนเพียงบิตเดียวได้ ซึ่งหมายความว่าเราไม่สามารถรับประกันได้ว่าเซลล์ที่อยู่ติดกันทั้งหมดได้รับการทดสอบสำหรับการโต้ตอบแล้ว ในกรณีนี้ วิธีที่ดีที่สุดที่เราสามารถทำได้คือใช้รูปแบบบางอย่างเพื่อให้แน่ใจว่าเซลล์ที่อยู่ติดกันทั้งหมดได้ถูกเขียนด้วยชุดค่าผสมหนึ่งและศูนย์ที่เป็นไปได้ทั้งหมด
นอกจากนี้ จะเห็นได้ว่าการแคช การบัฟเฟอร์ และการดำเนินการที่ไม่เป็นระเบียบจะรบกวนอัลกอริธึมการกลับด้านที่เคลื่อนที่ และทำให้มีประสิทธิภาพน้อยลง คุณสามารถปิดการแคชได้ แต่ไม่สามารถปิดใช้งานการบัฟเฟอร์หน่วยความจำในชิปประสิทธิภาพสูงตัวใหม่ได้ เพื่อแก้ไขข้อจำกัดนี้ อัลกอริธึมใหม่ที่เรียกว่า Modulo-20 จึงถูกสร้างขึ้น อัลกอริทึมนี้ไม่ได้รับผลกระทบจากการแคชหรือการบัฟเฟอร์ อัลกอริทึมทำงานดังนี้:
อัลกอริธึมนี้บรรลุผลการทดสอบ adjacency ในระดับเกือบเท่ากันกับการย้ายการกลับด้าน แต่ไม่ได้รับผลกระทบจากการแคชหรือการบัฟเฟอร์ เนื่องจากผ่านการเขียนแยก (1.1, 1.2) และผ่านการอ่าน (1.4) เสร็จสิ้นสำหรับหน่วยความจำทั้งหมด เราจึงมั่นใจได้ว่าบัฟเฟอร์และแคชทั้งหมดถูกล้างระหว่างรอบ การเลือกขนาดก้าวย่าง 20 อันนั้นค่อนข้างจะไร้เหตุผล ก้าวที่ใหญ่ขึ้นอาจมีประสิทธิภาพมากกว่า แต่จะใช้เวลาดำเนินการนานกว่า ตัวเลือก 20 รายการดูเหมือนจะเป็นการประนีประนอมที่สมเหตุสมผลระหว่างความเร็วและความละเอียดรอบคอบ
Memtest86+ ดำเนินการทดสอบตามหมายเลขชุดเพื่อตรวจสอบข้อผิดพลาด การทดสอบเหล่านี้ประกอบด้วยการผสมผสานระหว่างอัลกอริธึมการทดสอบ รูปแบบข้อมูล และการแคช ลำดับการดำเนินการสำหรับการทดสอบเหล่านี้ได้รับการจัดเตรียมเพื่อให้สามารถตรวจพบข้อผิดพลาดได้โดยเร็วที่สุด คำอธิบายของการทดสอบแต่ละครั้งดังต่อไปนี้
หากต้องการทดสอบหน่วยความจำมากกว่า 4GB บน CPU 32 บิต ช่วงที่อยู่จริงจะแบ่งออกเป็นหน้าต่างขนาด 1GB ซึ่งจะถูกแมปทีละรายการในหน้าต่างหน่วยความจำเสมือน หน้าต่างขนาด 1GB แต่ละหน้าต่างอาจมีขอบเขตหน่วยความจำที่ต่อเนื่องกันตั้งแต่หนึ่งขอบเขตขึ้นไป สำหรับการทดสอบส่วนใหญ่ การทดสอบจะดำเนินการกับพื้นที่หน่วยความจำแต่ละส่วนตามลำดับ การแคชถูกเปิดใช้งานสำหรับทุกคน ยกเว้นการทดสอบครั้งแรก
ในแต่ละขอบเขตหน่วยความจำ ให้ทดสอบบิตที่อยู่ทั้งหมดโดยใช้รูปแบบที่อยู่แบบเดิน ข้อผิดพลาดจากการทดสอบนี้ไม่ส่งผลต่อรูปแบบ BadRAM ขอบเขต memmap หรือขอบเขตเพจที่ไม่ถูกต้อง
ในแต่ละขอบเขตหน่วยความจำ แต่ละที่อยู่จะถูกเขียนด้วยที่อยู่ของตัวเอง จากนั้นแต่ละที่อยู่จะถูกตรวจสอบความสอดคล้องกัน การทดสอบนี้ดำเนินการตามลำดับกับ CPU แต่ละตัวที่มีอยู่ โดยไม่คำนึงถึงโหมดการจัดลำดับ CPU โดยผู้ใช้
ทั่วทั้งขอบเขตหน่วยความจำ แต่ละที่อยู่จะถูกเขียนด้วยที่อยู่เสมือนของตัวเอง บวกกับหมายเลขหน้าต่าง (สำหรับภาพ 32 บิต) หรือที่อยู่ทางกายภาพของตัวเอง (สำหรับภาพ 64 บิต) จากนั้นแต่ละที่อยู่จะถูกตรวจสอบความสอดคล้องกัน ซึ่งจะตรวจจับข้อผิดพลาดใดๆ ในบิตที่อยู่ลำดับสูงที่อาจพลาดเมื่อทดสอบแต่ละหน้าต่างตามลำดับ การทดสอบนี้ดำเนินการตามลำดับกับ CPU แต่ละตัวที่มีอยู่ โดยไม่คำนึงถึงโหมดการจัดลำดับ CPU โดยผู้ใช้
ในแต่ละขอบเขตหน่วยความจำตามลำดับ และสำหรับแต่ละรูปแบบตามลำดับ ให้ใช้อัลกอริธึมการกลับด้านแบบเคลื่อนที่พร้อมกับรูปแบบของค่าทั้งหมดและศูนย์ทั้งหมด
ในแต่ละขอบเขตหน่วยความจำตามลำดับ และสำหรับแต่ละรูปแบบตามลำดับ ให้ใช้อัลกอริธึมการผกผันการเคลื่อนที่ที่มีรูปแบบของการเดินแบบกว้าง 8 บิตและศูนย์การเดิน
ในแต่ละขอบเขตหน่วยความจำตามลำดับ และสำหรับแต่ละรูปแบบตามลำดับ ให้ใช้อัลกอริธึมการกลับตัวแบบเคลื่อนที่พร้อมรูปแบบของตัวเลขสุ่มและส่วนเสริม จำนวนสุ่มจะแตกต่างกันในแต่ละการทดสอบ ดังนั้นการส่งหลายครั้งจึงเพิ่มประสิทธิภาพ
ในแต่ละขอบเขตหน่วยความจำในทางกลับกัน และสำหรับแต่ละรูปแบบตามลำดับ ให้ใช้อัลกอริธึมการกลับตัวแบบเคลื่อนที่ด้วยรูปแบบความกว้าง 32 บิต (บนบิลด์ 32 บิต) หรือความกว้าง 64 บิต (บนบิลด์ 64 บิต) ตัวเดินและศูนย์เดิน . ไม่เหมือนกับการทดสอบครั้งก่อน รูปแบบจะหมุน 1 บิตในแต่ละที่อยู่ต่อเนื่องกัน
การทดสอบนี้เน้นหน่วยความจำโดยใช้คำสั่งการย้ายบล็อก (movs) และอิงตามการทดสอบ burnBX ของ Robert Redelmeier
ในแต่ละขอบเขตหน่วยความจำ หน่วยความจำจะถูกเตรียมใช้งานด้วยรูปแบบการเลื่อนที่จะกลับทุกๆ 8 ไบต์ จากนั้นบล็อกหน่วยความจำจะถูกย้ายไปรอบๆ โดยใช้คำสั่ง movs หลังจากการย้ายเสร็จสิ้น รูปแบบข้อมูลจะถูกตรวจสอบ เนื่องจากข้อมูลจะถูกตรวจสอบหลังจากที่ย้ายหน่วยความจำเสร็จสิ้นแล้วเท่านั้น จึงไม่สามารถทราบได้ว่าข้อผิดพลาดเกิดขึ้นที่ใด ที่อยู่ที่รายงานมีไว้สำหรับตำแหน่งที่พบรูปแบบที่ไม่ดีเท่านั้น ด้วยเหตุนี้ ข้อผิดพลาดจากการทดสอบนี้จึงไม่ส่งผลต่อรูปแบบ BadRAM ขอบเขต memmap หรือขอบเขตเพจที่ไม่ถูกต้อง
ในแต่ละขอบเขตหน่วยความจำ แต่ละที่อยู่จะถูกเขียนด้วยตัวเลขสุ่ม จากนั้นแต่ละที่อยู่จะถูกตรวจสอบความสอดคล้องและเขียนโดยใช้ส่วนเสริมของข้อมูลต้นฉบับ จากนั้นแต่ละที่อยู่จะถูกตรวจสอบความสอดคล้องอีกครั้ง
ในแต่ละขอบเขตหน่วยความจำตามลำดับ และสำหรับแต่ละรูปแบบตามลำดับ ให้ใช้อัลกอริธึม Modulo-20 พร้อมรูปแบบของตัวเลขสุ่มและส่วนเสริม จำนวนสุ่มจะแตกต่างกันในแต่ละการทดสอบ ดังนั้นการส่งหลายครั้งจึงเพิ่มประสิทธิภาพ
ทั่วทั้งขอบเขตหน่วยความจำทั้งหมด และสำหรับแต่ละรูปแบบตามลำดับ ให้เริ่มต้นตำแหน่งหน่วยความจำแต่ละตำแหน่งด้วยรูปแบบ พักการทำงานเป็นระยะเวลาหนึ่ง จากนั้นตรวจสอบตำแหน่งหน่วยความจำแต่ละตำแหน่งเพื่อความสอดคล้องกัน การทดสอบจะดำเนินการโดยใช้รูปแบบของศูนย์ทั้งหมดและทั้งหมด
โปรดดูรายการปัญหาที่เปิดอยู่และคำขอการปรับปรุงบน GitHub
อย่าลังเลที่จะส่งรายงานข้อผิดพลาด!
ยินดีสนับสนุนโค้ดเพื่อแก้ไขข้อบกพร่องหรือปรับปรุง ดู README_DEVEL.md ในไดเร็กทอรี doc สำหรับหลักเกณฑ์พื้นฐานบางประการ
Memtest86+ v6.0 มีพื้นฐานมาจาก PCMemTest ซึ่งพัฒนาโดย Martin Whitaker ซึ่งมีพื้นฐานมาจาก Memtest86+ v5.01 พัฒนาโดย Samuel Demeulemeester ซึ่งในทางกลับกันมีพื้นฐานมาจาก Memtest86 ซึ่งพัฒนาโดย Chris Brady โดยมีทรัพยากรและความช่วยเหลือตามรายการด้านล่าง:
เวอร์ชันเริ่มต้นของไฟล์ต้นฉบับ bootsect.S, setup.S, head.S และ build.c มาจากเคอร์เนล Linux 1.2.1 และได้รับการแก้ไขอย่างหนัก
Doug Sisk จัดเตรียมโค้ดเพื่อรองรับคอนโซลที่เชื่อมต่อผ่านพอร์ตอนุกรม (ปัจจุบันไม่ได้ใช้)
รหัสเพื่อสร้างรูปแบบ BadRAM จัดทำโดย Rick van Rein
การทดสอบการเคลื่อนที่ของบล็อกอิงจากการทดสอบ BurnBX ของ Robert Redelmeier
รหัสบัฟเฟอร์หน้าจอจัดทำโดย Jani Averbach (ไม่ได้ใช้โดย Memtest86+ v6.0)
Eric Biederman มอบเนื้อหาฟีเจอร์ทั้งหมดสำหรับเวอร์ชัน 3.0 พร้อมการแก้ไขข้อบกพร่องมากมายและการล้างโค้ดที่สำคัญ
การปรับปรุงที่สำคัญในการตรวจจับฮาร์ดแวร์และการรายงานในเวอร์ชัน 3.2, 3.3 และ 3.4 จัดทำโดย Samuel Demeulemeester (จาก Memtest86+ v1.11, v1.60 และ v1.70)
นอกจากนี้ การแก้ไขข้อบกพร่องหลายประการสำหรับ Memtest86+ ยังถูกนำเข้าจาก anphsw/memtest86