Does memtest86+ test memory which is used to run itself?
One of the common server failure scenarios is bad DRAM, sometimes even when ECC memory is used.
memtest86+
is one of the most useful tools to diagnose DRAM problems. As it loads itself at the start of the memory, I've been wondering if memtest86+
checks the part of the memory which memtest86+
is loaded into.
Is the memory allocated to memtest86+
so small that it doesn't matter, or is it possible that memtest86+
could miss a defect in the DRAM because it can't test the memory locations it's residing in?
Solution 1:
Obviously, memtest86+ cannot test the memory region which currently contains the memtest86+ executable code (but if there are memory errors in that region, it is very likely that the test itself will crash). However, memtest86+ is able to relocate its own code to a different address at runtime, and by using this trick it is able to test all memory which it is allowed to use by the firmware (BIOS) — just not all at once.
This code relocation is described in README.background inside the memtest86+ source code archive (the file is slightly out of date — e.g., it states that the addresses used for memtest86+ code are 0x2000 and 0x200000, but the low address as defined in the source is actually 0x10000, and the high address is either 0x2000000 or 0x300000 depending on the amount of memory in the machine).
But even with this relocation trick memtest86+ is not able to test all memory for the following reasons:
Usually the firmware (BIOS) reserves some RAM regions for its own use (e.g., ACPI tables). While these RAM regions can be accessed by CPU, writing anything into them can result in unpredictable behavior.
Some part of RAM is used for the System Management Mode and is not even accessible from the CPU outside of the privileged SMM code.
The RAM address range between 640K and 1M is inaccessible due to quirks of the legacy PC memory layout (some of this RAM may be used as a shadow for BIOS ROM and for SMM, other parts may be completely inaccessible).
Solution 2:
No, memtest can't test its own memory. However, it is so small (only some KB) that it hardly matters. EDIT: this statement is wrong since, as stated in the selected answer, memtest can dynamically relocate itself to test all user addressable memory.
--
In theory, modern processor can, at boot time, configure part of their cache as programmable memory, from within very small programs (as memtest) can be run without touching DRAM at all.
However, it is a model-specific feature (which require BIOS support) and I don't think memtest is using it.