Hackear DDR3 SPD

Actualicé mi vieja computadora portátil con dos módulos de memoria DDR3-1333 de 4GB, pero resultó que la computadora portátil es compatible con un máximo de DDR3-1066. ¿Qué hará un hombre de verdad? ¡Por supuesto, actualizará la EEPROM para volver a unir DDR3 a un modelo más lento!


Lugar de trabajo A la derecha está el Thinkpad para flashear, y a la izquierda está el problemático MacBook Pro

Ten mucho cuidado. Obviamente, puede corromper o bloquear permanentemente la grabación en su DIMM. Posibles problemas más sutiles, incluida una falla del circuito lógico de la batería, o la placa base se convertirá en un ladrillo .

Como empezó todo


Tengo una MacBook Pro de 13 pulgadas a mediados de 2010. Su sistema de archivos se dañó durante un reinicio regular, y la utilidad de disco (desde la partición de recuperación) no pudo hacer nada al respecto. Bueno, he estado esperando esto durante mucho tiempo: es hora de poner un SSD y agregar algo de RAM.

Compré un SSD y tuve la suerte de encontrar un par de computadoras portátiles rotas con módulos RAM adecuados en la montaña de basura electrónica. Insertamos el SSD y dos módulos de 4 GB, lanzamos Internet Recovery, y en una hora deberíamos tener un sistema que funcione. Pero no La descarga simplemente se congela. ¿Por qué? La mayor sospecha es causada por estos módulos RAM, después de todo, son de basura. Por lo tanto, hacemos lo que cualquiera haría: crear una unidad flash USB con memtest86 y ejecutarla durante la noche. Genial, la memoria está bien. Después de muchas horas de probar diferentes métodos de instalación para diferentes versiones de macOS, finalmente se descubre que todo funciona bien simplemente reinsertando la memoria anterior. 1

Verdadera razón


Al darme cuenta del problema, aprendí rápidamente que el MacBook 2009–2010 en realidad no funcionaba con la memoria más rápido que el PC3-8500 , y que podía solucionar el problema modificando los metadatos de RAM utilizando un programa de Windows llamado Thaiphoon Burner .

La verdadera causa de la falla es el procesador gráfico integrado GeForce 320M, que utiliza memoria compartida, es decir, RAM normal. Puede funcionar con un máximo de PC3-8500 (también conocido como DDR3-1066, es decir, con una frecuencia de reloj de 533 MHz DRAM), pero el controlador de memoria del sistema no es consciente de esto y aumenta la velocidad máxima disponible a 667 MHz (es decir, PC3-10600 también conocido como DDR3 -1333). Los componentes restantes no tienen problemas con esto, al igual que la GPU en modo VESA (creo).

No he oído hablar de ningún otro equipo que falle en la operación de RAM capaz de velocidades más altas que las que puede usar el equipo. Por supuesto, al comprar módulos de memoria en el mercado, los vendedores habrían advertido sobre este matiz. Esto sigue siendo mucho mejor que una RAM soldada, como en las computadoras portátiles Apple desde 2012.

Configuración de firmware


Habiendo descubierto la razón, instalé un módulo PC3-8500 original en 2 GB y un nuevo módulo de 4 GB, y funcionó. Pero el reinicio de DDR3 parecía un buen proyecto, así que decidí probarlo.

Por supuesto, no voy a instalar Windows solo para el firmware EEPROM, y no voy a comprar software sofisticado, si todo se puede hacer manualmente. Pensé que la tarea obviamente debería hacerse en Linux, tal vez con algunas herramientas adicionales. Tampoco quería instalar Linux en un macbook solo por eso. Por lo tanto, mi viejo y confiable Thinkpad X220 con NixOS se ha convertido en una plataforma ideal para el trabajo. Me tomó un poco de tiempo actualizarlo, porque no cargué el automóvil durante un año más o menos.

Luego fue el turno de elegir qué módulo probar primero. El Thinkpad ya tenía dos 4 GB cada uno, y encontré cuatro módulos de 4 GB, así que tenía mucho para elegir. Decidí comenzar con la producción más extraña de Micron. Todo lo demás eran Samsung. Uno tenía una pegatina de Lenovo.

Leer SPD


Los módulos de memoria vienen con un chip EEPROM que contiene metadatos sobre el módulo Detección de presencia en serie (SPD). El formato en sí es simple, y el acceso a la EEPROM se puede organizar a través del bus SMBus , que es esencialmente el mismo que I²C . 2

Afortunadamente, hay controladores de kernel y software listo para interactuar con SMBus e incluso leer EEPROM DDR3.

En primer lugar, para ver dispositivos en el bus se i2c-tools y algunos módulos del núcleo.

$ nix-shell -p i2c-tools
$ modprobe i2c-dev
$ modprobe i2c-i801
$ i2cdetect -l
i2c-0 unknown i915 gmbus ssc N/A
i2c-1 unknown i915 gmbus vga N/A
i2c-2 unknown i915 gmbus panel N/A
i2c-3 unknown i915 gmbus dpc N/A
i2c-4 unknown i915 gmbus dpb N/A
i2c-5 unknown i915 gmbus dpd N/A
i2c-6 unknown DPDDC-B N/A
i2c-7 unknown DPDDC-C N/A
i2c-8 unknown DPDDC-D N/A
i2c-9 unknown SMBus I801 adapter at efa0 N/A


El adaptador SMBus es de interés aquí, en mi caso i2c-9 .

El i2c-tools incluso viene con una decode-dimms para leer información de RAM en un formato legible. Esto requiere el módulo eeprom kernel.

$ modprobe eeprom
$ decode-dimms
$ modprobe -r eeprom


Aquí está la salida para un módulo de memoria:

  Decodificador de detección de presencia en serie de memoria
 Por Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
 Jean Delvare, Trent Piepho y otros


 Decodificación EEPROM: / sys / bus / i2c / drivers / eeprom / 9-0050
 Adivina dimm está en el banco 1

 --- === SPD EEPROM Información === ---
 EEPROM CRC de bytes 0-116 OK (0xAEA4)
 N. ° de bytes escritos en SDRAM EEPROM 176
 Número total de bytes en EEPROM 256
 Memoria fundamental tipo DDR3 SDRAM
 Tipo de módulo SO-DIMM

 --- === Características de la memoria === ---
 Velocidad máxima del módulo 1333 MHz (PC3-10600)
 Size 4096 MB
 Bancos x Filas x Columnas x Bits 8 x 15 x 10 x 64
 Rangos 2
 Ancho del dispositivo SDRAM 8 bits
 Extensión de ancho de bus 0 bits
 tCL-tRCD-tRP-tRAS 9-9-9-24
 Latencias CAS compatibles (tCL) 10T, 9T, 8T, 7T, 6T, 5T

 --- === Tiempos a velocidades estándar === ---
 tCL-tRCD-tRP-tRAS como DDR3-1333 9-9-9-24
 tCL-tRCD-tRP-tRAS como DDR3-1066 7-7-7-20
 tCL-tRCD-tRP-tRAS como DDR3-800 6-6-6-15

 --- === Parámetros de tiempo === ---
 Tiempo de ciclo mínimo (tCK) 1.500 ns
 Tiempo de latencia CAS mínimo (tAA) 13.125 ns
 Tiempo mínimo de recuperación de escritura (tWR) 15,000 ns
 Retardo mínimo de RAS # a CAS # (tRCD) 13.125 ns
 Retardo mínimo activo de fila a fila activa (tRRD) 6,000 ns
 Retardo mínimo de precarga de fila (tRP) 13.125 ns
 Retraso mínimo activo a precarga (tRAS) 36,000 ns
 Retraso mínimo activo a actualización automática (tRC) 49.125 ns
 Retraso mínimo de recuperación (tRFC) 160.000 ns
 Retraso mínimo de escritura para leer CMD (tWTR) 7.500 ns
 Lectura mínima para precargar CMD Delay (tRTP) 7.500 ns
 Retardo mínimo de cuatro ventanas activadas (tFAW) 30.000 ns

 --- === Características opcionales === ---
 Voltajes operables 1.5V
 RZQ / 6 compatible?  No
 RZQ / 7 compatible?  Si
 Modo de apagado de DLL compatible?  Si
 Rango de temperatura de funcionamiento 0-95 grados C
 Frecuencia de actualización en rango de temperatura extendido 2X
 Auto-actualización?  Si
 Lectura del sensor térmico en matriz?  No
 ¿Actualización parcial de matriz automática?  No
 Sensor térmico del módulo Sí
 Tipo de dispositivo SDRAM Monolítico estándar

 --- === Características físicas === ---
 Altura del módulo 30 mm
 Grosor del módulo 2 mm delante, 2 mm detrás
 Ancho del módulo 67,6 mm
 Tarjeta de referencia del módulo F revisión 0
 Estándar de mapeo de rango 1

 --- === Datos del fabricante === ---
 Fabricante de módulos Micron Technology
 DRAM Fabricante Micron Technology
 Código de ubicación de fabricación 0x0F
 Fecha de fabricación 2011-W23
 Número de serie del conjunto 0xFB5C7F1A
 Número de pieza 16JSF51264HZ-1G4D1
 Código de revisión 0x4431 

Bastante datos. Parte de la información mostrada se calcula a partir de los datos. Por ejemplo, los tiempos a velocidades estándar (es decir, conteos de ciclos) se calculan en función de los parámetros de tiempo en una resolución de nanosegundos. Incluso se almacenan como múltiplos de la unidad de base de tiempo instalada en otra parte de la EEPROM, pero esto no se aplica al tema del artículo. Este módulo RAM entrega 7-7-7-20 a DDR3-1066, que cumple con el estándar DDR3-1066F JEDEC. No me preguntes qué es JEDEC, pero es más rápido que el DDR3-1066G más barato.

Pasé mucho tiempo confirmando mi conclusión: cuando intento refinar la memoria, el único número importante es el tiempo mínimo de ciclo (tCK). Aquí es 1.5 ns, es decir 667 MHz.

Veamos los datos de origen.

  $ i2cdump 9 0x50
 No se ha especificado el tamaño (usando el acceso a datos de bytes)
 ADVERTENCIA  ¡Este programa puede confundir su bus I2C, causar pérdida de datos y peor!
 Examinaré el archivo / dev / i2c-9, dirección 0x50, byte de modo
 Continuar?  [S / n]
      0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 7e 00 ??????. ?? R ???. ~.
 10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 82 05 ixi0i?  ?.? <<. ???
 20: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00? ...............
 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 05 00 ............ ???.
 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70: 00 00 00 00 00 80 2c 0f 11 23 fb 5c 7f 1a a4 ae .....?, ?? #? \ ????
 80: 31 36 4a 53 46 35 31 32 36 34 48 5a 2d 31 47 34 16JSF51264HZ-1G4
 90: 44 31 44 31 80 2c 00 00 00 00 00 00 00 00 00 00 00 D1D1 ?, ..........
 a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
 f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ 

Las especificaciones dicen que el tiempo mínimo se indica a 0x0c. Veamos, está en la primera línea ( 00: , en la columna c . Por cierto, su valor también es 0x0c o 12. Este es un múltiplo de la base de tiempo promedio (MTB), que es el cociente de dividir el valor en 0x0a por el valor en 0x0b (en nanosegundos). Aquí 1⁄8 ns. Entonces 12 MTB corresponden a 1.5 ns.

Cambio de planificación


Para llegar a DDR3-1066, necesitamos 533 MHz, que es 1.875 ns o 15 MTB, o 0x0f. Es decir, queremos escribir 0x0f a 0x0c.

Pero espera, obviamente hay una corrección de errores. El CRC de los primeros 116 bytes se almacena en 0x7e-7f. Miré allí y vi a4 ae , luego fui a buscar una calculadora para el cálculo. Me llevó un tiempo increíblemente largo encontrar una calculadora CRC viable. Probé varias herramientas de línea de comandos, pero aún así me decidí por la calculadora en línea http://crccalc.com/ . Luego descubrí que la variante CRC-16 / XMODEM se usa aquí, y la suma de verificación es en realidad 0xAEA4. Orden de bytes y todo eso. Debe tenerse en cuenta en la emisión de decode-dimms .

Por lo tanto, debe escribir un nuevo tiempo de ciclo mínimo (0x0f) a 0x0c y una nueva suma de verificación en 0x7e como una palabra.

Registro SPD


Ahora sabía qué escribir, y finalmente me atreví a intentarlo. Con manos temblorosas, escribí y , presioné Enter para la confirmación final y ...

  $ i2cset 9 0x50 0x0c 0x0f
 ADVERTENCIA  ¡Este programa puede confundir su bus I2C, causar pérdida de datos y peor!
 ¡PELIGROSO!  Escribir en una EEPROM serie en un DIMM de memoria
 puede hacer que su memoria sea INÚTIL y hacer que su sistema sea INOTOTABLE.
 Escribiré en el archivo del dispositivo / dev / i2c-9, dirección de chip 0x50, dirección de datos
 0x0c, datos 0x0f, byte de modo.
 Continuar?  [y / N] y
 Error: error de escritura 

El error Espera que?

Como chico pedante, comencé a estudiar las fuentes de i2cset, así como los módulos del kernel correspondientes. En algún momento, me di cuenta de que esto podría ser causado por la protección contra escritura.

Saqué un módulo de memoria, lo miré y reconocí el chip EEPROM. Dice 97B , 321 y algunas otras cosas. Buscando en Google, descubrí que este es un chip SE97B . Miré la tabla de datos y leí cuidadosamente la sección de protección contra escritura varias veces. Con la ayuda de programas, hice varios intentos para eliminar la protección temporal contra escritura, pero fallé. La protección contra escritura probablemente fue constante, así que decidí buscar un módulo que no tenga protección contra escritura.

Un hecho curioso, por cierto, es que la protección contra escritura en tiempo real se habilita al escribir algo en una dirección específica. No creo que i2cdetect haga esto normalmente, pero ejecutar i2cget 9 0x30 <any-address> probablemente establecerá protección contra escritura en tiempo real, lo cual es realmente constante. No he tratado de hacer esto.

Tomé el siguiente módulo y no había ningún mensaje de error allí. EEPROM simplemente no ha cambiado.

¡Finalmente, el éxito!


Con el tercer módulo, la operación finalmente resultó. Calculé el CRC y lo escribí junto con el tiempo del ciclo. Después de cargar el módulo eeprom kernel y comenzar a decode-dimms módulo parecía un PC3-8500 de 4GB normal. Cuando lo instalé en mi MacBook Pro, finalmente inicié un sistema con 8 GB de memoria.


DDR3 SODIMM después de reiniciar está listo para funcionar en MacBook Pro

Antes: DDR3-1333 original


  0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 3e 00 ??????. ?? R ???.>.
 10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i?  ?.? <<. ???
 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70: 00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 0e 59 ..... ???? 0? [??? Y
 80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
 90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
 a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
 b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y.
 c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

Después: parece DDR3-1066


  0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
 00: 92 10 0b 03 03 19 00 09 03 52 01 08 0f 00 3e 00 ??????. ?? R ???.>.
 10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i?  ?.? <<. ???
 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 70: 00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 06 54 ..... ???? 0? [??? T
 80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
 90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
 a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
 b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y.
 c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
 f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

Si no ve la diferencia inmediatamente, entonces no ha profundizado en estos vertederos durante tanto tiempo como yo.

Tus pensamientos


¿Vale la pena hacerlo? Financieramente, por supuesto que no!

Pero fue divertido y aprendí mucho. No tengo idea de dónde se puede aplicar exactamente este conocimiento, pero creo que en algún momento serán necesarios. Y la sola sensación de que puedes resolver el problema correctamente es realmente agradable y da confianza.



1. Mi suposición de que la RAM funcionará en este equipo si pasa memtest86 obviamente era incorrecta. Sin embargo, incluso mirando hacia atrás, la suposición no parece tonta. Por experiencia, una combinación extraña de hardware no es infrecuente, debido a lo cual cae la prueba estándar.

2. Recientemente aprendí sobre el uso de I²C en otro proyecto. Creo que puedo leer y escribir EEPROM en el microcontrolador Cortex-M usando mi propio programa, pero en la práctica, soldar el conector será muy difícil, y escribir código es demasiado trabajo para mí. Sin embargo, ¡estoy realmente feliz de ser teóricamente capaz de tal cosa!

Source: https://habr.com/ru/post/es431128/


All Articles