Hacking DDR3 SPD

Ich habe meinen alten Laptop mit zwei 4 GB DDR3-1333-Speichermodulen aufgerüstet, aber es stellte sich heraus, dass der Laptop mit maximal DDR3-1066 kompatibel ist. Was wird ein richtiger Mann tun? Natürlich wird das EEPROM aktualisiert, um DDR3 erneut an ein langsameres Modell zu binden!


Arbeitsplatz. Auf der rechten Seite befindet sich das Thinkpad zum Blinken und auf der linken Seite das problematische MacBook Pro

Sei sehr vorsichtig. Natürlich können Sie die Aufzeichnung auf Ihrem DIMM beschädigen oder dauerhaft blockieren. Mögliche subtilere Probleme, einschließlich eines Ausfalls der Logikschaltung der Batterie oder des Motherboards, werden zu einem Baustein .

Wie alles begann


Ich habe Mitte 2010 ein 13-Zoll-MacBook Pro. Das Dateisystem wurde während eines regelmäßigen Neustarts beschädigt, und das Festplatten-Dienstprogramm (von der Wiederherstellungspartition) konnte nichts dagegen tun. Nun, ich habe lange darauf gewartet: Es ist Zeit, eine SSD einzulegen und etwas RAM hinzuzufügen.

Ich kaufte eine SSD und hatte das Glück, ein paar kaputte Laptops mit geeigneten RAM-Modulen im Berg des elektronischen Mülls zu finden. Wir setzen die SSD und zwei 4-GB-Module ein, starten Internet Recovery - und in einer Stunde sollten wir ein funktionierendes System haben. Aber nein. Download friert nur ein. Wegen was? Der größte Verdacht wird von diesen RAM-Modulen verursacht, schließlich stammen sie aus dem Müll. Deshalb tun wir, was jeder tun würde: Erstellen Sie mit memtest86 ein USB-Flash-Laufwerk und führen Sie es über Nacht aus. Großartig, die Erinnerung ist in Ordnung. Nach vielen Stunden des Ausprobierens verschiedener Installationsmethoden für verschiedene Versionen von macOS stellt sich schließlich heraus, dass alles einwandfrei funktioniert, wenn Sie nur den alten Speicher wieder einsetzen. 1

Wahrer Grund


Als ich das Problem erkannte, stellte ich schnell fest, dass das MacBook 2009–2010 nicht schneller mit Speicher arbeitete als das PC3-8500 und dass Sie das Problem umgehen können , indem Sie die RAM-Metadaten mit einem Windows-Programm namens Thaiphoon Burner ändern .

Die wahre Ursache des Fehlers ist der integrierte Grafikprozessor GeForce 320M, der gemeinsam genutzten Speicher verwendet, dh regulären RAM. Es kann mit maximal PC3-8500 (auch bekannt als DDR3-1066, dh mit einer Taktfrequenz von 533 MHz DRAM) arbeiten, aber der Systemspeichercontroller ist sich dessen nicht bewusst und erhöht die maximal verfügbare Geschwindigkeit auf 667 MHz (d. H. PC3-10600 alias DDR3) -1333). Die restlichen Komponenten haben damit keine Probleme, genau wie die GPU im VESA-Modus (glaube ich).

Ich habe noch kein anderes Gerät gehört, das beim Betrieb von RAM mit höheren Geschwindigkeiten ausfällt, als das Gerät verwenden kann. Natürlich hätten Verkäufer beim Kauf von Speichermodulen auf dem Markt vor dieser Nuance gewarnt. Dies ist immer noch viel besser als ein gelöteter RAM, wie bei Apple-Laptops seit 2012.

Firmware-Einstellung


Nachdem ich den Grund herausgefunden hatte, installierte ich ein originales PC3-8500-Modul auf 2 GB und ein neues 4 GB-Modul und es funktionierte. Aber DDR3-Rebinning schien ein gutes Projekt zu sein, deshalb habe ich beschlossen, es auszuprobieren.

Natürlich werde ich Windows nicht nur für die EEPROM-Firmware installieren, und ich werde keine ausgefallene Software kaufen, wenn alles manuell erledigt werden kann. Ich dachte, die Aufgabe sollte offensichtlich unter Linux erledigt werden, vielleicht mit einigen zusätzlichen Tools. Ich wollte Linux auch nicht nur dafür auf einem MacBook installieren. Daher ist mein altes zuverlässiges Thinkpad X220 mit NixOS eine ideale Plattform für die Arbeit geworden. Die Aktualisierung dauerte etwas, da ich das Auto etwa ein Jahr lang nicht beladen hatte.

Dann war es an der Zeit, das Modul auszuwählen, das zuerst ausprobiert werden sollte. Das Thinkpad hatte bereits zwei 4-GB-Module, und ich fand vier 4-GB-Module, sodass ich eine große Auswahl hatte. Ich beschloss, mit der seltsamsten Micron-Produktion zu beginnen. Der Rest war Samsung. Einer hatte einen Lenovo-Aufkleber.

Lesen Sie SPD


Die Speichermodule werden mit einem EEPROM-Chip geliefert, der Metadaten zum SPD-Modul ( Serial Presence Detect ) enthält. Das Format selbst ist einfach und der Zugriff auf das EEPROM kann über den SMBus- Bus erfolgen, der im Wesentlichen dem I²C entspricht . 2

Glücklicherweise gibt es Kerneltreiber und vorgefertigte Software für die Interaktion mit SMBus und sogar für das Lesen von EEPROM DDR3.

Erstens werden zum Anzeigen von Geräten auf dem Bus i2c-tools und einige Kernelmodule benötigt.

$ 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


Der SMBus-Adapter ist hier von Interesse, in meinem Fall i2c-9 .

Das i2c-tools Paket enthält sogar ein decode-dimms zum Lesen von RAM-Informationen in einem lesbaren Format. Dies erfordert das eeprom Kernelmodul.

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


Hier ist die Ausgabe für ein Speichermodul:

  Decoder zur Erkennung serieller Speicherpräsenz
 Von Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
 Jean Delvare, Trent Piepho und andere


 Dekodierung des EEPROM: / sys / bus / i2c / drivers / eeprom / 9-0050
 Vermutung Dimm ist in Bank 1

 --- === SPD EEPROM Information === ---
 EEPROM CRC der Bytes 0-116 OK (0xAEA4)
 Anzahl der in das SDRAM-EEPROM 176 geschriebenen Bytes
 Gesamtzahl der Bytes im EEPROM 256
 Grundlegender Speichertyp DDR3 SDRAM
 Modultyp SO-DIMM

 --- === Speichereigenschaften === ---
 Maximale Modulgeschwindigkeit 1333 MHz (PC3-10600)
 Größe 4096 MB
 Bänke x Zeilen x Spalten x Bits 8 x 15 x 10 x 64
 Ränge 2
 SDRAM-Gerätebreite 8 Bit
 Busbreitenerweiterung 0 Bit
 tCL-tRCD-tRP-tRAS 9-9-9-24
 Unterstützte CAS-Latenzen (tCL) 10T, 9T, 8T, 7T, 6T, 5T

 --- === Timings bei Standardgeschwindigkeiten === ---
 tCL-tRCD-tRP-tRAS als DDR3-1333 9-9-9-24
 tCL-tRCD-tRP-tRAS als DDR3-1066 7-7-7-20
 tCL-tRCD-tRP-tRAS als DDR3-800 6-6-6-15

 --- === Timing-Parameter === ---
 Minimale Zykluszeit (tCK) 1.500 ns
 Minimale CAS-Latenzzeit (tAA) 13,125 ns
 Minimale Schreibwiederherstellungszeit (tWR) 15.000 ns
 Minimale Verzögerung von RAS # zu CAS # (tRCD) 13.125 ns
 Minimale Verzögerung von Zeile zu Zeile aktiv (tRRD) 6.000 ns
 Minimale Verzögerung des Zeilenvorladens (tRP) 13,125 ns
 Minimum Active to Precharge Delay (tRAS) 36.000 ns
 Minimum Active to Auto-Refresh Delay (tRC) 49,125 ns
 Minimale Wiederherstellungsverzögerung (tRFC) 160.000 ns
 Minimale CMD-Verzögerung zum Schreiben zum Lesen (tWTR) 7.500 ns
 Minimum Read to Pre-Charge CMD Delay (tRTP) 7.500 ns
 Mindestens vier Aktivierungsfensterverzögerungen (tFAW) 30.000 ns

 --- === Optionale Funktionen === ---
 Betriebsspannungen 1,5V
 RZQ / 6 unterstützt?  Nein
 RZQ / 7 unterstützt?  Ja
 DLL-Aus-Modus unterstützt?  Ja
 Betriebstemperaturbereich 0-95 ° C.
 Aktualisierungsrate im erweiterten Temperaturbereich 2X
 Automatische Selbstaktualisierung?  Ja
 Anzeige des On-Die-Wärmesensors?  Nein
 Partial Array Self-Refresh?  Nein
 Modul-Wärmesensor Ja
 SDRAM-Gerätetyp Standard Monolithic

 --- === Physikalische Eigenschaften === ---
 Modulhöhe 30 mm
 Moduldicke 2 mm vorne, 2 mm hinten
 Modulbreite 67,6 mm
 Modulreferenzkarte F Revision 0
 Rang 1 Mapping Standard

 --- === Herstellerdaten === ---
 Modulhersteller Micron Technology
 DRAM Hersteller Micron Technology
 Produktionsstandortcode 0x0F
 Herstellungsdatum 2011-W23
 Seriennummer der Baugruppe 0xFB5C7F1A
 Teilenummer 16JSF51264HZ-1G4D1
 Revisionscode 0x4431 

Ziemlich viele Daten. Ein Teil der angezeigten Informationen wird aus den Daten berechnet. Zum Beispiel werden Zeitabläufe bei Standardgeschwindigkeiten (d. H. Zykluszahlen) basierend auf Zeitsteuerungsparametern in Nanosekundenauflösung berechnet. Auch wenn sie als Vielfache der an anderer Stelle im EEPROM installierten Zeitbasiseinheit gespeichert sind, gilt dies nicht für das Thema des Artikels. Dieses RAM-Modul liefert 7-7-7-20 an DDR3-1066, was dem JEDEC-Standard DDR3-1066F entspricht. Fragen Sie mich nicht, was JEDEC ist, aber es ist schneller als das billigste DDR3-1066G.

Ich habe viel Zeit damit verbracht, meine Schlussfolgerung zu bestätigen: Beim Versuch, den Speicher neu zu definieren, ist die einzige wichtige Zahl die minimale Zykluszeit (tCK). Hier sind es 1,5 ns, d.h. 667 MHz.

Schauen wir uns die Quelldaten an.

  $ i2cdump 9 0x50
 Keine Größe angegeben (über Byte-Datenzugriff)
 WARNUNG!  Dieses Programm kann Ihren I2C-Bus verwirren, Datenverlust verursachen und schlimmeres!
 Ich werde Datei / dev / i2c-9, Adresse 0x50, Modusbyte prüfen
 Weiter?  [J / 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 ................
 50: 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 ................
 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 ................
 b0: 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 ................ 

Technische Daten besagen, dass die Mindestzeit bei 0x0c angegeben ist. Mal sehen, es steht in der ersten Zeile ( 00: in Spalte c . Der Wert ist übrigens auch 0x0c oder 12. Dies ist ein Vielfaches der durchschnittlichen Zeitbasis (MTB), bei der es sich um den Quotienten handelt, bei dem der Wert in 0x0a durch den Wert in 0x0b (in Nanosekunden) geteilt wird. Hier 1⁄8 ns. 12 MTB entsprechen also 1,5 ns.

Änderungsplanung


Um zu DDR3-1066 zu gelangen, benötigen wir 533 MHz, was 1,875 ns oder 15 MTB oder 0x0f entspricht. Das heißt, wir möchten 0x0f bei 0x0c schreiben.

Aber warte, offensichtlich gibt es eine Fehlerbehebung. Die CRC der ersten 116 Bytes wird in 0x7e-7f gespeichert. Ich schaute dorthin und sah a4 ae , dann suchte ich nach einem Taschenrechner für die Berechnung. Ich habe erstaunlich lange gebraucht, um einen funktionsfähigen CRC-Rechner zu finden. Ich habe mehrere Befehlszeilentools ausprobiert, mich aber dennoch für den Online-Rechner http://crccalc.com/ entschieden . Dann fand ich heraus, dass hier die CRC-16 / XMODEM-Variante verwendet wird und die Prüfsumme tatsächlich 0xAEA4 ist. Bytereihenfolge und so weiter. decode-dimms bei der Ausgabe von decode-dimms zu beachten.

Daher müssen Sie eine neue minimale Zykluszeit (0x0f) bei 0x0c und eine neue Prüfsumme bei 0x7e als Wort schreiben.

SPD-Aufzeichnung


Jetzt wusste ich, was ich schreiben sollte, und wagte es schließlich, es zu versuchen. Mit zitternden Händen tippte ich y , drückte die Eingabetaste für die endgültige Bestätigung und ...

  $ i2cset 9 0x50 0x0c 0x0f
 WARNUNG!  Dieses Programm kann Ihren I2C-Bus verwirren, Datenverlust verursachen und schlimmeres!
 GEFÄHRLICH!  Schreiben in ein serielles EEPROM auf einem Speicher-DIMM
 kann Ihren Speicher nutzlos machen und Ihr System UNBOOTABLE machen!
 Ich werde in die Gerätedatei / dev / i2c-9, Chipadresse 0x50, Datenadresse schreiben
 0x0c, Daten 0x0f, Modusbyte.
 Weiter?  [j / N] y
 Fehler: Schreiben fehlgeschlagen 

Der Fehler. Warten Sie was?

Als pedantischer Typ begann ich, die Quellen von i2cset sowie die entsprechenden Kernelmodule zu studieren. Irgendwann wurde mir klar, dass dies durch Schreibschutz verursacht werden kann.

Ich nahm ein Speichermodul heraus, sah es mir an und erkannte den EEPROM-Chip. Es sagt 97B , 321 und einige andere Dinge. Beim Googeln fand ich heraus, dass dies ein SE97B- Chip ist. Ich habe mir die Datentabelle angesehen und den Abschnitt zum Schreibschutz mehrmals sorgfältig gelesen. Mit Hilfe von Programmen habe ich mehrere Versuche unternommen, den temporären Schreibschutz zu entfernen, bin jedoch fehlgeschlagen. Der Schreibschutz war wahrscheinlich konstant, deshalb habe ich mich für ein Modul entschieden, das keinen Schreibschutz hat.

Eine lustige Tatsache ist übrigens, dass der Echtzeit-Schreibschutz aktiviert wird, indem etwas an eine bestimmte Adresse geschrieben wird. Ich glaube nicht, dass i2cdetect dies normal macht, aber i2cget 9 0x30 <any-address> wird wahrscheinlich ein Echtzeit-Schreibschutz festgelegt, der wirklich konstant ist. Ich habe nicht versucht, dies zu tun.

Ich habe das folgende Modul genommen und dort gab es keine Fehlermeldung. Das EEPROM hat sich einfach nicht geändert.

Endlich Erfolg!


Mit dem dritten Modul stellte sich die Operation schließlich heraus. Ich habe den CRC berechnet und zusammen mit der Zykluszeit geschrieben. Nach dem Laden des eeprom Kernelmoduls und dem Starten von decode-dimms Modul aus wie ein normaler 4 GB PC3-8500. Als ich es auf meinem MacBook Pro installiert habe, habe ich endlich ein System mit 8 GB Speicher hochgefahren.


DDR3 SODIMM kann nach dem Rebinning in MacBook Pro verwendet werden

Vorher: Original DDR3-1333


  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 ................
 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 von 11 45 00 ............ ?? E.
 40: 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 ................
 60: 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 ................
 d0: 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 ................
 f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

Nachher: ​​sieht aus wie 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 ................
 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 von 11 45 00 ............ ?? E.
 40: 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 ................
 60: 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 ................
 d0: 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 ................
 f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

Wenn Sie den Unterschied nicht sofort erkennen, haben Sie sich so lange nicht mit diesen Deponien befasst wie ich.

Deine Gedanken


Lohnt es sich zu tun? Finanziell natürlich nicht!

Aber es hat Spaß gemacht und ich habe viel gelernt. Ich habe keine Ahnung, wo genau dieses Wissen angewendet werden kann, aber ich denke, dass sie irgendwann benötigt werden. Und nur das Gefühl, dass Sie das Problem richtig lösen können, ist wirklich schön und gibt Vertrauen.



1. Meine Annahme, dass RAM auf diesem Gerät funktioniert, wenn es memtest86 besteht, war offensichtlich falsch. Trotzdem erscheint die Annahme auch im Rückblick nicht albern. Erfahrungsgemäß ist eine seltsame Kombination von Hardware keine Seltenheit, aufgrund derer der Standardtest fällt.

2. Ich habe kürzlich gelernt, I²C in einem anderen Projekt zu verwenden. Ich denke, dass ich mit meinem eigenen Programm EEPROM auf dem Cortex-M-Mikrocontroller lesen und schreiben kann, aber in der Praxis ist das Löten des Steckverbinders sehr schwierig, und das Schreiben von Code ist zu viel Arbeit, als dass ich mich dafür interessieren könnte. Trotzdem bin ich sehr froh, dass ich theoretisch dazu in der Lage bin!

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


All Articles