Vraag Doet memtest86 + testgeheugen dat wordt gebruikt om zichzelf uit te voeren?


Een van de meest voorkomende scenario's voor serverstoringen is slechte DRAM, soms zelfs wanneer ECC-geheugen wordt gebruikt.

memtest86+ is een van de handigste hulpmiddelen om DRAM-problemen te diagnosticeren. Omdat het zichzelf laadt aan het begin van het geheugen, heb ik me afgevraagd of memtest86+ controleert het deel van het geheugen dat memtest86+wordt geladen in.

Is het geheugen toegewezen aan memtest86+zo klein dat het er niet toe doet, of is het mogelijk dat memtest86+ zou een defect in de DRAM kunnen missen omdat het de geheugenlocaties waarin het zich bevindt niet kan testen?


62
2018-01-21 07:45


oorsprong


Hoewel deze vraag relevant is voor een server, is deze ook relevant voor een gewone pc, dus ik heb gestemd om deze vraag te verplaatsen naar Super gebruiker waar het meer mensen kan bereiken. - Cristian Ciupitu


antwoorden:


Het is duidelijk dat memtest86 + het geheugengebied dat momenteel de uitvoerbare code memtest86 + bevat niet kan testen (maar als er geheugenfouten in dat gebied zijn, is de kans groot dat de test zelf crasht). Memtest86 + is echter in staat om zijn eigen code tijdens runtime naar een ander adres te verplaatsen, en door deze truc te gebruiken, kan het alle geheugen testen dat het door de firmware (BIOS) mag gebruiken - alleen niet allemaal tegelijk.

Deze code-verplaatsing wordt beschreven in README.background in het memtest86 + broncodearchief (het bestand is enigszins verouderd - het geeft bijvoorbeeld aan dat de adressen die worden gebruikt voor memtest86 + -code 0x2000 en 0x200000 zijn, maar het lage adres zoals gedefinieerd in de bron is eigenlijk 0x10000, en het hoge adres is 0x2000000 of 0x300000 afhankelijk van de hoeveelheid geheugen in de machine).

Maar zelfs met deze relocatietruc kan memtest86 + niet alle geheugen testen om de volgende redenen:

  • Gewoonlijk reserveert de firmware (BIOS) enige RAM-gebieden voor zijn eigen gebruik (bijvoorbeeld ACPI-tabellen). Hoewel deze RAM-regio's toegankelijk zijn voor de CPU, kan het schrijven van iets daarin een onvoorspelbaar gedrag tot gevolg hebben.

  • Een deel van RAM wordt gebruikt voor de Systeembeheermodus en is zelfs niet toegankelijk vanaf de CPU buiten de gepriviligeerde SMM-code.

  • Het RAM-adresbereik tussen 640K en 1M is ontoegankelijk vanwege de eigenaardigheden van de oudere pc-geheugenlay-out (een deel van dit RAM-geheugen kan worden gebruikt als schaduw voor BIOS ROM en voor SMM kunnen andere delen volledig ontoegankelijk zijn).


78
2018-01-21 11:59



Interessant, ik miste zijn verhuiscapaciteit. Uiteraard zijn SMM en dergelijke buiten bereik (behalve specifieke BIOS-ondersteuning). - shodanshok
In die toegewezen gebieden wordt de DRAM over het algemeen uitgesloten omdat iets anders "off module" wordt aangepakt? ROM en randapparatuur zeggen. - mckenzm
als je meerdere rammodules hebt, voer dan een tweede test uit nadat je ze hebt geruild ... - JFL
Is het mogelijk om het geheugen te laten falen op de juiste manier om memtest verkeerd te melden, omdat de instructies herschreven zijn? Of liever, hoeveel fouten heeft het? - John Dvorak
@JanDvorak: In theorie is het natuurlijk mogelijk. In de praktijk zou ik zeggen dat het maar iets waarschijnlijker is dan met je hoofd op het toetsenbord slaan en willekeurig een Shakespeares sonnet uittypen. - Ilmari Karonen


Nee, memtest kan zijn eigen geheugen niet testen. Het is echter zo klein (slechts enkele KB) dat het er nauwelijks toe doet. BEWERK: deze uitspraak klopt niet, aangezien memtest, zoals vermeld in het geselecteerde antwoord, zichzelf dynamisch kan verplaatsen om te testen allemaal gebruiker adresseerbaar geheugen.

-

In theorie kan de moderne processor tijdens het opstarten een deel van hun cache configureren als programmeerbaar geheugen, vanuit zeer kleine programma's (als memtest) kan worden uitgevoerd zonder DRAM aanraken.

Het is echter een modelspecifieke functie (waarvoor BIOS-ondersteuning vereist is) en ik denk niet dat memtest deze gebruikt.


5
2018-01-21 10:02



Bedankt voor je antwoord. memtest is ook de CPU-cache aan het testen. Dus indien memtest zou in deze cache worden geladen, dan kon dit deel van de cache niet worden getest, wat problematischer is, omdat het veel kleiner is dan het geheugen? - Robin
Besed op memtest86 documentatie het doet niet test de processor cache, althans op een directe manier. Bovendien hebben moderne processors afzonderlijke instructies en datacache (I $ en D $). Uitvoerbare code wordt in de instructiecache geladen en kan niet direct worden gewijzigd / overschreven - shodanshok
memtest86 + test zeker de datacache van de CPU, maar dat doet er niet toe voor deze vraag. Nogmaals bedankt voor je antwoord. - Robin
Weet je dit zeker? Ik dacht dat het zichzelf ergens anders had gekopieerd tijdens het testen van het geheugen waarin het normaal leeft. Daarom heeft elke test een traag gedeelte (het grootste deel van het geheugen) en een echt snel onderdeel (het kleine stukje waar de code / gegevens zijn opgeslagen). - Peter Cordes
@DmitryGrigoryev: Ah oke .. dus ik heb iets meer geleerd :-) Cool bedankt! - Robin