Ejecutar Windows con RAM defectuosa

25

¿Es posible ejecutar Windows (7, x64) con un módulo RAM defectuoso? Más precisamente, ¿hay alguna forma de decirle a Windows que no asigne una dirección incorrecta conocida o un bloque de direcciones?

Para Linux, hay BadRAM . ¿Existe una implementación existente para Windows? ¿Es eso posible con el kernel de Windows (NT 6.1)? Tal vez un controlador de modo kernel?

Mover
fuente
44
@ekaj Si solo fue una semana después de la compra, ¿tal vez lo reemplace bajo garantía? ;)
Bob
3
En realidad esa es la idea más inteligente, está rota, haz que la arreglen
Journeyman Geek

Respuestas:

15

Bob, hay tres partes en tu pregunta. Me dirigiré a uno a la vez.

Ejecutar Windows con mala memoria

De hecho, es posible ejecutar Windows 7 con un módulo defectuoso. Dependiendo de la ubicación de los sectores defectuosos y de dónde se encuentra el módulo en sus bancos DIMM, Windows 7 se ejecutará como si no hubiera nada mientras no intente tocar las porciones defectuosas de la memoria. Por lo tanto, lo ideal sería mover el módulo defectuoso lo más lejos posible del banco 0. Naturalmente, si este es su único módulo, no tiene suerte.

Bloqueo de sectores de mala memoria en Windows

En los sistemas operativos x86 (32 y 64 bits), la memoria es administrada por el núcleo. Como mencionas, BadMem puede bloquear sectores de memoria defectuosos en Linux. Funciona instruyendo al núcleo para que bloquee las direcciones de memoria que especificó. Esto impide que Linux aborde esas direcciones cuando asigna (y desasigna) memoria. Pero para hacer esto, BadMem necesita parchear el núcleo. BadMem no es más que un parche de kernel que configura antes de aplicar.

Ahora, no tienes esa capacidad en Windows. No puedes parchear el kernel. Desarrollar un controlador en modo kernel tampoco le servirá de nada, ya que el kernel de Windows nunca permitirá que su controlador tenga prioridad sobre su arquitectura de administración de memoria (lo que es comprensible).

Por esta razón, no puede indicar a Windows de ninguna manera que no use ciertas direcciones de memoria. La única forma sería que Microsoft parchee el kernel específicamente para su caso. Improbable.

La difusión de direcciones de memoria incorrecta

No hay muchas razones por las cuales un módulo de memoria puede contener direcciones incorrectas. En última instancia, todo se reduce a un error en la línea de producción, suponiendo que no sufrió daños antes de ingresar a su computadora. Al contrario de los discos duros, no hay partes móviles en los módulos de memoria, como bien saben. Por lo tanto, los sectores defectuosos no tienden a extenderse, como es el caso de los sectores del disco duro.

Sin embargo, el software de prueba de memoria no es infalible. Es posible (y común) que pase ciertas direcciones que de hecho son malas. Por lo tanto, la mala memoria puede dar la impresión de "propagación" a medida que más y más direcciones se revelan como malas. Por esta razón, herramientas como BadMem revelan su debilidad, porque, naturalmente, solo pueden manejar las direcciones que usted les indique.

Es poco probable que alguien pueda realizar una prueba exhaustiva de un módulo de memoria e identificar todas las direcciones de memoria defectuosas, luego bloquearlas y terminar con un módulo de memoria "bueno". Lo más fácil es considerar un módulo con direcciones erróneas como un módulo defectuoso y, por lo tanto, no es confiable.

Lo que esto significa es que, aunque BadMem es una propuesta atractiva, en realidad no es una solución al problema de la mala memoria. Lo más probable es que no termines con un sistema operativo que intente leer un sector defectuoso y se bloquee con un error de detención. Un módulo defectuoso es un módulo defectuoso es un módulo defectuoso.

Un enano
fuente
Hay bastantes buenas respuestas, pero aceptaré esto por dar una buena razón para no hacerlo. Se le puede decir al kernel de Windows que no use más allá de una determinada dirección, como han señalado otros, pero cuando el error está en el medio del espacio de direcciones es como usar un hacha cuando desea un scapel ... se desea un control más fino pero, Al parecer, imposible. Es una lástima.
Bob
8
No del todo correcto; que es posible indicar a Windows para evitar ciertas direcciones (más exactamente, ciertos números de página con montura). La funcionalidad está diseñada para memoria ECC, con el que Windows puede detectar posibles fallos y marcar los PFN como mala, pero es posible añadir manualmente PFN a la lista: superuser.com/a/490522/117590 - pero no es muy práctico. Entonces, sí, el reemplazo sigue siendo la mejor opción: P
Bob
17

El BCD de Windows (datos de configuración de arranque) en realidad tiene un {badmemory}objeto. Parece que las direcciones de memoria que la memoria ECC "predice que fallarán" se enumerarán aquí y no serán utilizadas por el sistema operativo.

El {badmemory}objeto acepta un elemento BadMemoryList(tipo BCD 0x1700000a), que es una lista de enteros que se pueden ingresar como hexadecimales, separados por espacios. Supongo que sería posible insertar manualmente direcciones de memoria incorrecta como se encuentran en memtest86 a este elemento, pero no lo he probado. Aparentemente, acepta 'números de marco de página, que es la dirección real dividida por 4096. Desafortunadamente, estas direcciones / PFN pueden no coincidir con las informadas por los diagnósticos de memoria. La edición manual se puede hacer con Visual BCD Editor .

En cualquier caso, las tarjetas de memoria defectuosas deben reemplazarse como lo indican las otras respuestas. Esto es simplemente una nota sobre una posible forma de solucionar el problema (¿temporalmente?).

Mover
fuente
Un tutorial mejor formateado de todo lo que dijo está disponible aquí . Buen trabajo a pesar de todo.
mirh
13

Windows BCD tiene {badmemorylist}y {badmemoryaccess}objetos. Debe establecer la primera en páginas con mala memoria separadas por espacios (por ejemplo bcdedit /set badmemorylist 1499543 1434007) y la segunda en No( bcdedit /set badmemoryaccess No)

Tenga en cuenta que el tamaño de página de memoria en Windows generalmente 4KB

Probado en Windows 7 y funciona bien

Puede probar su configuración con Rammap by Sysinternals

PD: tengo esa información de "Windows Internals Book" chapter 10

Vyacheslav Dorzhiev
fuente
13

Tuve problemas RAM en una tableta con SoC. La memoria está soldada o integrada en el SoC y no se puede reemplazar.

Estoy en Argentina y el vendedor está en China, y los costos de envío y el tiempo, no tiene sentido enviar la garantía.

Logré algunos golpes.

La clave para pasar los parámetros de memoria dañados son:

  1. las direcciones en memtest86 coinciden con las direcciones utilizadas en Windows.
  2. debe marcar páginas completas de 4KBytes.
  3. en memtest 0x10000000corresponde a 0x10000 en Windows
  4. en memtest 0x00001000corresponde a 0x1 en Windows
  5. significa: El número de página en Windows elimina los últimos 3 números hexadecimales de memtest.
  6. significa que: windows elimina los ceros a la izquierda.
  7. considere 5 y 6, para evitar errores en los números de página.
  8. la declaración correcta es: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAa errores en memtest de 0x000B7000 a 0x000BAFFF. Tenga en cuenta que no puede colocar una variedad de recuerdos, sino todas las páginas una por una
  9. no puede agregar páginas, todas las páginas deben estar marcadas con el mismo comando. Si se trata de una página nueva, la sobrescribe sobrescribe más antigua Logré agregar 4096 páginas en un solo comando. No lo he intentado más.
  10. bcdedit /enum {badmemory}, muestra la lista de páginas marcadas.
  11. bcdedit /set badmemoryaccess no evitar que se usen las páginas marcadas
  12. Es necesario reiniciar después de marcar las páginas y eliminar el acceso.
jgustavo
fuente
1
Tuve que eliminar el espacio en blanco entre el /y el comando para que funcione, por lo que en lugar de bcdedit / enum {badmemory}ser el bcdedit /enum {badmemory}mismo para los demás
flagg19
Funciona, pero desafortunadamente el límite de cmd en Windows está limitado a 8191 y no pude bloquear todas las páginas con mala memoria. No pude encontrar una buena solución para resolver esto. ¿Hay alguna manera de registrar el rango de páginas? ¡Debería bloquear todas las páginas de 0x714bc8 a 0x71cbd0, que es demasiadas páginas! ¿Qué hice, entonces? Ejecuté la prueba más simple (# 0 y # 1) y obtuve un rango más limitado de error de memoria. Funciona bien hasta ahora, no más pantallas azules. Pero sé que no bloqueé todo lo que sería necesario.
Felipe
3

Hasta donde sé, la única forma de hacerlo es usando el comando BurnMem, que puede limitar artificialmente la cantidad de RAM que utiliza Windows.

Oliver G
fuente
2
Hmm ... esa es una opción interesante. Quizás maxmem, ya que aparentemente burnmemno limita la dirección física máxima mientras lo maxmemhace. El Vista y 7 equivalentes serían truncatememory. Si bien esta es una posible solución, ¿existe un método más preciso para los casos en que la memoria defectuosa está en el medio o al comienzo del espacio de direcciones y bloquea todo después de que no se desea?
Bob
@Bob: la razón por la que no puedes simplemente reemplazar el módulo de mala memoria es por qué.
Ramhound
@Ramhound podría, si quisiera. Pero eso llevaría tiempo. En este momento, estoy ejecutando con la mitad de mi memoria original, no es genial para mis máquinas virtuales. Obtener un módulo nuevo o de reemplazo que realmente funcione podría llevar algunas semanas. Si una solución de software me permite hacer esto en dos horas o menos, lo consideraría un tiempo bien empleado y algo nuevo aprendido. Aceptaría esta respuesta (mi memoria falló justo al final del espacio de direcciones) pero si alguien tiene una solución más versátil, preferiría eso para futuras referencias.
Bob
@Bob: habiendo leído esto bastante extensamente, parece que no es posible. Esto se debe a que BadRam utiliza memtest para indicar al núcleo que excluya las direcciones incorrectas del cargador de arranque, Windows no puede hacer esto, ya que actualmente no hay forma de determinar qué direcciones incorrectas excluir de la misma manera que un núcleo parcheado BadRam puede .
Oliver G
3

Mira esta utilidad: https://github.com/prsyahmi/BadMemory

Es muy fácil de usar y admite el bloqueo de rangos de direcciones. Y puede usar la dirección completa recibida de MemTest86 sin eliminar los últimos tres dígitos.

osipxd
fuente
2

¡¡¡PRECAUCIÓN!!! Windows puede fallar al arrancar, esté listo para reconstruir el BCD. Para ese caso, use el símbolo del sistema en Opciones de inicio avanzadas. No sé por qué ya no arranca, parece suceder al azar o si pones demasiadas direcciones en badmemorylist.

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

Aquí hay un programa de símbolo del sistema de C ++ que obtiene una lista continua de direcciones de memoria en un archivo .txt listo para ( bcdedit /set badmemorylisto bcdedit /set {badmemory} badmemorylistno funcionó en Win7 para mí)

Use bcdedit /set badmemoryaccess 0para denegar el acceso.

Puede verificar con EasyBCD en Ver configuración -> Detallado. Después de reiniciar, verifique con Rammap si el Espacio de direcciones físicas desapareció.

#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;
}
Birnd
fuente
1

Sí. Hay parámetros de arranque para controlar la cantidad de memoria que Windows puede usar. Sin embargo, solo puede eliminar del final del espacio de memoria. Consulte este artículo de msdn para controlar los parámetros de arranque. Los parámetros de interés son truncatememoryy removememory.

Nick Whaley
fuente
Truncar y eliminar la memoria parece simplemente cortar el acceso a la RAM (comenzando desde un umbral determinado o trabajando hacia atrás desde el final). Esta pregunta fue más acerca de proporcionar rangos.
mirh
0

Puede probar esta función en Windows 7, pero no estoy seguro de qué chip afectará, o si elimina la misma cantidad de cada uno. Tendré que mirar alrededor para descubrirlo.

cutrightjm
fuente