¿Memtest86 + prueba la memoria que se usa para ejecutarse?

65

Uno de los escenarios comunes de falla del servidor es una DRAM incorrecta, a veces incluso cuando se usa memoria ECC.

memtest86+Es una de las herramientas más útiles para diagnosticar problemas de DRAM. Como se carga al comienzo de la memoria, me he estado preguntando si memtest86+verifica la parte de la memoria que memtest86+está cargada.

¿La memoria está asignada a un memtest86+tamaño tan pequeño que no importa, o es posible que memtest86+se pierda un defecto en la DRAM porque no puede probar las ubicaciones de memoria en las que reside?

Robin
fuente
8
Si bien esta pregunta es relevante para un servidor, también lo es para una PC ordinaria, por lo que he votado para trasladar esta pregunta a Super User, donde puede llegar a más personas.
Cristian Ciupitu

Respuestas:

78

Obviamente, memtest86 + no puede probar la región de memoria que actualmente contiene el código ejecutable memtest86 + (pero si hay errores de memoria en esa región, es muy probable que la prueba en sí se bloquee). Sin embargo, memtest86 + puede reubicar su propio código a una dirección diferente en tiempo de ejecución, y al usar este truco puede probar toda la memoria que el firmware (BIOS) puede usar, solo que no todo de una vez.

Esta reubicación de código se describe en README.background dentro del archivo de código fuente memtest86 + (el archivo está un poco desactualizado; por ejemplo, indica que las direcciones utilizadas para el código memtest86 + son 0x2000 y 0x200000, pero la dirección baja como se define en la fuente es en realidad 0x10000, y la dirección alta es 0x2000000 o 0x300000 dependiendo de la cantidad de memoria en la máquina).

Pero incluso con este truco de reubicación memtest86 + no puede probar toda la memoria por las siguientes razones:

  • Por lo general, el firmware (BIOS) reserva algunas regiones RAM para su propio uso (por ejemplo, tablas ACPI). Si bien la CPU puede acceder a estas regiones RAM, escribir cualquier cosa en ellas puede generar un comportamiento impredecible.

  • Parte del RAM se usa para el modo de administración del sistema y ni siquiera se puede acceder desde la CPU fuera del código SMM privilegiado.

  • El rango de direcciones RAM entre 640K y 1M es inaccesible debido a las peculiaridades del diseño de la memoria de la PC heredada (parte de esta RAM se puede utilizar como una sombra para BIOS ROM y para SMM, otras partes pueden ser completamente inaccesibles).

Sergey Vlasov
fuente
1
Interesante, extrañé su capacidad de reubicación. Obviamente, SMM y los gustos están fuera de rango (aparte del soporte específico de BIOS).
shodanshok
Esas regiones mapeadas generalmente excluyen la DRAM ya que se está abordando algo más "fuera del módulo"? ROM y dispositivos periféricos dicen.
mckenzm
3
si tiene varios módulos ram, realice una segunda prueba después de haberlos intercambiado ...
JFL
¿Es posible que la memoria falle de la manera correcta para que memtest informe incorrectamente el éxito debido a que se han reescrito sus instrucciones? O más bien, ¿cuántas fallas se necesitan?
John Dvorak
3
@ JanDvorak: En teoría, es posible, por supuesto. En la práctica, diría que es solo un poco más probable que golpearse la cabeza con el teclado y escribir al azar un soneto de Shakespeare.
Ilmari Karonen
5

No, memtest no puede probar su propia memoria. Sin embargo, es tan pequeño (solo algunos KB) que apenas importa. EDITAR: esta declaración es incorrecta ya que, como se indica en la respuesta seleccionada, memtest puede reubicarse dinámicamente para probar toda la memoria direccionable por el usuario.

-

En teoría, el procesador moderno puede, en el momento del arranque, configurar parte de su caché como memoria programable, desde dentro de programas muy pequeños (como memtest) se puede ejecutar sin tocar DRAM en absoluto.

Sin embargo, es una característica específica del modelo (que requiere soporte de BIOS) y no creo que memtest la esté usando.

shodanshok
fuente
Gracias por su respuesta. memtesttambién está probando el caché de la CPU. Entonces, si memtestse cargara en este caché, entonces esta parte del caché no podría probarse, lo cual es más problemático, porque es mucho más pequeño que la memoria.
Robin
2
Incluido en la documentación de memtest86 , no prueba la memoria caché del procesador, al menos de manera directa. Además, los procesadores modernos tienen instrucciones separadas y caché de datos (I $ y D $). El código ejecutable se carga en la caché de instrucciones y no se puede modificar / sobrescribir directamente
shodanshok
1
memtest86 + definitivamente prueba el caché de datos de la CPU, pero eso no importa para esta pregunta. Gracias de nuevo por tu respuesta.
Robin
3
¿Estas seguro acerca de esto? Pensé que se copió a sí mismo en otro lugar mientras probaba la memoria en la que normalmente vive. Es por eso que cada prueba tiene una parte lenta (la mayor parte de la memoria) y una parte muy rápida (el bit donde se almacena su código / datos).
Peter Cordes
1
@DmitryGrigoryev: Ah, está bien ... así que he aprendido algo más :-) ¡Genial, gracias!
Robin