Piratage DDR3 SPD

J'ai mis à niveau mon ancien ordinateur portable avec deux modules de mémoire DDR3-1333 de 4 Go, mais il s'est avéré que l'ordinateur portable est compatible avec un maximum de DDR3-1066. Que fera un vrai homme? Bien sûr, il mettra à niveau l'EEPROM pour relier la DDR3 à un modèle plus lent!


Lieu de travail. À droite se trouve le Thinkpad pour clignoter, et à gauche se trouve le MacBook Pro problématique

Soyez très prudent. De toute évidence, vous pouvez corrompre ou bloquer définitivement l'enregistrement sur votre DIMM. Problèmes plus subtils possibles, y compris une défaillance du circuit logique de la batterie, ou la carte mère se transformera en brique .

Comment tout a commencé


J'ai un MacBook Pro 13 pouces mi-2010. Son système de fichiers a été endommagé lors d'un redémarrage régulier et l'utilitaire de disque (à partir de la partition de récupération) n'a rien pu y faire. Eh bien, j'attends cela depuis longtemps: il est temps de mettre un SSD et d'ajouter de la RAM.

J'ai acheté un SSD et j'ai eu la chance de trouver quelques ordinateurs portables cassés avec des modules RAM appropriés dans la montagne de déchets électroniques. Nous insérons le SSD et deux modules de 4 Go, lançons Internet Recovery - et dans une heure, nous devrions avoir un système fonctionnel. Mais non. Le téléchargement se fige. À cause de quoi? La plus grande suspicion est causée par ces modules de RAM, après tout, ils proviennent d'ordures. Par conséquent, nous faisons ce que n'importe qui ferait: créer une clé USB avec memtest86 et l'exécuter pendant la nuit. Très bien, la mémoire est bonne. Après plusieurs heures à essayer différentes méthodes d'installation pour différentes versions de macOS, la découverte vient enfin que tout fonctionne très bien si vous remettez simplement l'ancienne mémoire en place. 1

La vraie raison


Réalisant le problème, j'ai rapidement appris que le MacBook 2009-2010 ne fonctionnait pas avec la mémoire plus rapidement que le PC3-8500 , et que vous pouviez contourner le problème en modifiant les métadonnées RAM à l'aide d'un programme Windows appelé Thaiphoon Burner .

La véritable cause de l'échec est le processeur graphique intégré GeForce 320M, qui utilise une mémoire partagée, c'est-à-dire une RAM régulière. Il peut fonctionner avec un maximum de PC3-8500 (alias DDR3-1066, c'est-à-dire avec une fréquence d'horloge de 533 MHz DRAM), mais le contrôleur de mémoire système n'en est pas conscient et augmente la vitesse maximale disponible à 667 MHz (c'est-à-dire PC3-10600 alias DDR3 -1333). Les composants restants n'ont aucun problème avec cela, tout comme le GPU en mode VESA (je pense).

Je n'ai entendu parler d'aucun autre équipement qui échoue dans le fonctionnement de la RAM capable de vitesses plus élevées que l'équipement peut utiliser. Bien sûr, lors de l'achat de modules de mémoire sur le marché, les vendeurs auraient mis en garde contre cette nuance. C'est encore bien mieux qu'une RAM soudée, comme sur les ordinateurs portables Apple depuis 2012.

Réglage du firmware


Après avoir compris la raison, j'ai installé un module PC3-8500 d'origine sur 2 Go et un nouveau module de 4 Go, et cela a fonctionné. Mais le redémarrage de la DDR3 semblait être un bon projet, j'ai donc décidé de l'essayer.

Bien sûr, je ne vais pas installer Windows uniquement pour le firmware EEPROM, et je ne vais pas acheter de logiciels sophistiqués, si tout peut être fait manuellement. Je pensais que la tâche devrait évidemment être effectuée sous Linux, peut-être avec quelques outils supplémentaires. Je ne voulais pas non plus installer Linux sur un macbook juste pour ça. Par conséquent, mon ancien Thinkpad X220 fiable avec NixOS est devenu une plate-forme idéale pour le travail. Il a fallu un peu de temps pour le mettre à jour, car je n'ai pas chargé la voiture pendant un an environ.

Ensuite, c'était au tour de choisir le module à essayer en premier. Le Thinkpad avait déjà deux 4 Go chacun, et j'ai trouvé quatre modules de 4 Go, donc j'avais beaucoup de choix. J'ai décidé de commencer avec la production Micron la plus étrange. Tout le reste était Samsung. L'un avait un autocollant Lenovo.

Lire SPD


Les modules de mémoire sont livrés avec une puce EEPROM qui contient des métadonnées sur le module Serial Presence Detect (SPD). Le format lui-même est simple et l'accès à l'EEPROM peut être organisé via le bus SMBus , qui est essentiellement le même que I²C . 2

Heureusement, il existe des pilotes de noyau et des logiciels prêts à l'emploi pour interagir avec SMBus et même lire EEPROM DDR3.

Tout d'abord, pour visualiser les périphériques sur le bus, i2c-tools et certains modules du noyau sont nécessaires.

$ 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


L'adaptateur SMBus est ici intéressant, dans mon cas i2c-9 .

Le i2c-tools est même livré avec un decode-dimms pour lire les informations RAM dans un format lisible. Cela nécessite le module du noyau eeprom .

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


Voici la sortie pour un module de mémoire:

  Décodeur de détection de présence série mémoire
 Par Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
 Jean Delvare, Trent Piepho et autres


 Décodage EEPROM: / sys / bus / i2c / drivers / eeprom / 9-0050
 Deviner dimm est dans la banque 1

 --- === SPD EEPROM Information === ---
 CRC EEPROM d'octets 0-116 OK (0xAEA4)
 Nombre d'octets écrits dans la SDRAM EEPROM 176
 Nombre total d'octets en EEPROM 256
 Mémoire fondamentale type DDR3 SDRAM
 Type de module SO-DIMM

 --- === Caractéristiques de la mémoire === ---
 Vitesse maximale du module 1333 MHz (PC3-10600)
 Taille 4096 MB
 Banques x rangées x colonnes x bits 8 x 15 x 10 x 64
 Rangs 2
 Largeur du périphérique SDRAM 8 bits
 Extension de largeur de bus 0 bits
 tCL-tRCD-tRP-tRAS 9-9-9-24
 Latences CAS prises en charge (tCL) 10T, 9T, 8T, 7T, 6T, 5T

 --- === Timings à des vitesses standard === ---
 tCL-tRCD-tRP-tRAS comme DDR3-1333 9-9-9-24
 tCL-tRCD-tRP-tRAS comme DDR3-1066 7-7-7-20
 tCL-tRCD-tRP-tRAS comme DDR3-800 6-6-6-15

 --- === Paramètres de synchronisation === ---
 Temps de cycle minimum (tCK) 1.500 ns
 Temps de latence CAS minimum (tAA) 13,125 ns
 Temps minimum de récupération en écriture (tWR) 15.000 ns
 Délai minimum RAS # à CAS # (tRCD) 13,125 ns
 Délai minimum entre les lignes actives et les lignes actives (tRRD) 6.000 ns
 Délai minimum de précharge de ligne (tRP) 13,125 ns
 Délai minimum actif à précharge (tRAS) 36.000 ns
 Délai minimum d'activation à l'actualisation automatique (tRC) 49,125 ns
 Délai de récupération minimum (tRFC) 160 000 ns
 Délai CMD d'écriture en lecture minimum (tWTR) 7,500 ns
 Temps de lecture minimum pour précharger CMD (tRTP) 7,500 ns
 Délai minimum d'activation de la fenêtre (tFAW) de 30 000 ns

 --- === Caractéristiques optionnelles === ---
 Tensions utilisables 1,5 V
 RZQ / 6 pris en charge?  Non
 RZQ / 7 pris en charge?  Oui
 Mode DLL-Off pris en charge?  Oui
 Plage de température de fonctionnement 0-95 degrés C
 Taux de rafraîchissement dans une plage de températures étendue 2X
 Auto-rafraîchissement automatique?  Oui
 Lecture du capteur thermique en marche?  Non
 Actualisation partielle de la matrice partielle?  Non
 Capteur thermique du module Oui
 Type de périphérique SDRAM Monolithique standard

 --- === Caractéristiques physiques === ---
 Hauteur du module 30 mm
 Épaisseur du module 2 mm à l'avant, 2 mm à l'arrière
 Largeur du module 67,6 mm
 Carte de référence du module F révision 0
 Norme de cartographie de rang 1

 --- === Données du fabricant === ---
 Fabricant du module Micron Technology
 Fabricant de DRAM Micron Technology
 Code d'emplacement de fabrication 0x0F
 Date de fabrication 2011-W23
 Numéro de série de l'assemblage 0xFB5C7F1A
 Numéro de pièce 16JSF51264HZ-1G4D1
 Code de révision 0x4431 

Pas mal de données. Une partie des informations affichées est calculée à partir des données. Par exemple, les temporisations à des vitesses standard (c.-à-d., Le nombre de cycles) sont calculées en fonction des paramètres de synchronisation en résolution nanoseconde. Même s'ils sont stockés sous forme de multiples de l'unité de base de temps installée ailleurs sur l'EEPROM, cela ne s'applique pas au sujet de l'article. Ce module RAM fournit 7-7-7-20 à DDR3-1066, ce qui est conforme à la norme JDREC DDR3-1066F. Ne me demandez pas ce qu'est le JEDEC, mais il est plus rapide que le DDR3-1066G le moins cher.

J'ai passé beaucoup de temps à confirmer ma conclusion: lorsque j'essaie de rebin mémoire, le seul nombre important est le temps de cycle minimum (tCK). Ici, c'est 1,5 ns, soit 667 MHz.

Regardons les données source.

  $ i2cdump 9 0x50
 Aucune taille spécifiée (en utilisant l'accès aux données en octets)
 ATTENTION!  Ce programme peut confondre votre bus I2C, provoquer des pertes de données et pire encore!
 Je vais tester le fichier / dev / i2c-9, l'adresse 0x50, l'octet de mode
 Continuez?  [O / 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 ................ 

Les spécifications indiquent que le temps minimum est indiqué à 0x0c. Voyons, c'est sur la première ligne ( 00: , dans la colonne c . Soit dit en passant, sa valeur est également 0x0c ou 12. Il s'agit d'un multiple de la base de temps moyenne (MTB), qui est le quotient de la division de la valeur en 0x0a par la valeur en 0x0b (en nanosecondes). Ici 1⁄8 ns. Donc, 12 VTT correspondent à 1,5 ns.

Planification du changement


Pour passer à la DDR3-1066, nous avons besoin de 533 MHz, soit 1,875 ns ou 15 MTB, ou 0x0f. Autrement dit, nous voulons écrire 0x0f à 0x0c.

Mais attendez, il y a évidemment une correction de bogue. Le CRC des 116 premiers octets est stocké dans 0x7e-7f. J'ai regardé là-bas et j'ai vu a4 ae , puis je suis allé chercher une calculatrice pour le calcul. Il m'a fallu un temps incroyablement long pour trouver une calculatrice CRC fonctionnelle. J'ai essayé plusieurs outils de ligne de commande, mais j'ai tout de même opté pour la calculatrice en ligne http://crccalc.com/ . Ensuite, j'ai découvert que la variante CRC-16 / XMODEM est utilisée ici, et la somme de contrôle est en fait 0xAEA4. Ordre des octets et tout ça. Il convient de le noter dans l'émission de decode-dimms .

Par conséquent, vous devez écrire un nouveau temps de cycle minimum (0x0f) à 0x0c et une nouvelle somme de contrôle dans 0x7e en tant que mot.

Enregistrement SPD


Maintenant, je savais quoi écrire et j'ai finalement osé essayer. Avec des mains tremblantes, j'ai tapé y , appuyez sur Entrée pour confirmation finale et ...

  $ i2cset 9 0x50 0x0c 0x0f
 ATTENTION!  Ce programme peut confondre votre bus I2C, provoquer des pertes de données et pire encore!
 DANGEREUX!  Écriture sur une EEPROM série sur une barrette mémoire
 peut rendre votre mémoire INUTILE et rendre votre système UNBOOTABLE!
 J'écrirai dans le fichier de périphérique / dev / i2c-9, l'adresse de la puce 0x50, l'adresse des données
 0x0c, données 0x0f, octet de mode.
 Continuez?  [y / N] y
 Erreur: échec d'écriture 

L'erreur. Attends quoi?

En tant que pédant, j'ai commencé à étudier les sources d'i2cset, ainsi que les modules du noyau correspondants. À un moment donné, j'ai réalisé que cela pouvait être dû à la protection en écriture.

J'ai sorti un module de mémoire, l'ai regardé et j'ai reconnu la puce EEPROM. Il dit 97B , 321 et d'autres choses. Googler, j'ai découvert qu'il s'agit d'une puce SE97B . J'ai regardé le tableau de données et lu attentivement la section de protection en écriture à plusieurs reprises. À l'aide de programmes, j'ai tenté à plusieurs reprises de supprimer la protection temporaire en écriture, mais j'ai échoué. La protection en écriture était probablement constante, j'ai donc simplement décidé de rechercher un module qui n'a pas de protection en écriture.

Soit dit en passant, la protection en écriture en temps réel est activée en écrivant quelque chose à une adresse spécifique. Je ne pense pas i2cdetect fasse normalement, mais l'exécution d' i2cget 9 0x30 <any-address> établira probablement une protection en temps réel contre l'écriture, ce qui est vraiment constant. Je n'ai pas essayé de faire ça.

J'ai pris le module suivant et il n'y avait aucun message d'erreur là-bas. L'EEPROM n'a tout simplement pas changé.

Enfin du succès!


Avec le troisième module, l'opération s'est finalement avérée. J'ai calculé le CRC et l'ai écrit avec le temps de cycle. Après le chargement du module du noyau decode-dimms et le démarrage decode-dimms module ressemblait à un PC3-8500 4 Go standard. Lorsque je l'ai installé sur mon MacBook Pro, j'ai finalement démarré un système avec 8 Go de mémoire.


DDR3 SODIMM après le redémarrage est prêt à fonctionner dans MacBook Pro

Avant: DDR3-1333 d'origine


  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 ............. 2 ans.
 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 ................ 

Après: ressemble à 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 ............. 2 ans.
 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 vous ne voyez pas immédiatement la différence, vous n'avez pas plongé dans ces décharges depuis aussi longtemps que moi.

Vos pensées


Cela vaut-il la peine de le faire? Financièrement, bien sûr que non!

Mais c'était amusant et j'ai beaucoup appris. Je n'ai aucune idée où exactement ces connaissances peuvent être appliquées, mais je pense qu'à un moment donné, elles seront nécessaires. Et juste le sentiment que vous pouvez résoudre le problème correctement est vraiment agréable et donne confiance.



1. Mon hypothèse que la RAM fonctionnera sur cet équipement s'il réussit memtest86 était évidemment fausse. Néanmoins, même en regardant en arrière, l'hypothèse ne semble pas idiote. Par expérience, une étrange combinaison de matériel n'est pas rare, en raison de laquelle le test standard tombe.

2. J'ai récemment appris à utiliser I²C dans un autre projet. Je pense que je peux lire et écrire de l'EEPROM sur le microcontrôleur Cortex-M en utilisant mon propre programme, mais en pratique, souder le connecteur sera très difficile, et écrire du code est trop de travail pour moi. Néanmoins, je suis vraiment heureux d'être théoriquement capable d'une telle chose!

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


All Articles