BIOS und andere Flashspeicher mit Flashrom programmieren

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Andere Hardware ‹ BIOS und andere Flashspeicher mit Flashrom programmieren


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.




Einleitung

Computersysteme auf Basis der x86 Prozessor-Architektur benötigen zum Start eine Software, welche die Hardwarekomponenten des PCs mit spezifischen Konfigurationen initialisiert und nach grundlegenden Tests den Bootloader des installierten Betriebssystems aufruft. Diese Software wird vom Hauptprozessor ausgeführt und BIOS genannt. Sein Nachfolger EFI hat zwar die selben Aufgaben, ist aber ganz anders aufgebaut. Das BIOS belegt selten deutlich mehr als 1 MB Speicher und wird seit langem in nichtflüchtigen Flash-EEPROM Speichern abgelegt, die sich auf dem Mainboard befinden. Davor wurden EPROM Speicher verwendet die oft erst umständlich gelöscht (UV-Belichtung, hohe Programmier-Spannung) oder getauscht werden mussten. Nachdem das BIOS in den Arbeitsspeicher geladen wurde oder der POST (besagte Tests und Initialisierung) beendet ist, wird der Flashspeicher i.d.R. nicht mehr angerührt und kann sogar entnommen werden. Da Standards sehr schnell erweitert werden, stellen die Mainboardhersteller aktualisierte BIOS-Versionen bereit. Diese Aktualisierungen können beispielsweise umfassen:

  • neue Mikrocodes und Unterstützung für neue Prozessoren,
  • Erweiterung der unterstützten Speichermodule,
  • Erweiterung unterstützter Festplatten und Laufwerke,
  • neue Funktionen und Verbesserungen,
  • Fehlerbehebungen.

Häufig muss das BIOS aktualisieren werden, weil dieses entweder schwerwiegende Fehler hat oder man die zur Aufrüstung nötige Hardwareunterstützung erweitern möchte. Der übliche Weg dieser Aktualisierung ist oft umständlich und manchmal schwer umsetzbar:

  • Spezielle Updatesoftware ist für DOS oder manchmal Windows entwickelt.
  • Es sind meist Disketten oder CDs nötig (selten bootfähige USB-Sticks).
  • Die Prozedur an sich ist umständlich und unflexibel.

Aus diesen Gründen und dem Vorhaben, das unfreie BIOS durch eine freie Alternative zu ersetzen, wurde das Programm Flashrom entwickelt. Flashrom entstammt dem Coreboot Projekt.

Flashrom bietet gegenüber dem gebräuchlichen Vorgehen folgende Vorteile:

  • es werden keine Disketten, CDs oder Sticks benötigt
  • es ist kein physikalischer Zugang nötig, also muss nicht zwingend ein Monitor und eine Tastatur angeschlossen sein
  • zum Flashen ist kein Neustart nötig, nur wenn das neue BIOS gestartet werden soll
  • es wird eine Vielzahl an Flash Chips unterstützt
  • Skriptfähigkeit: mehrere identische Systeme lassen sich gleichzeitig flashen
  • Geschwindigkeit: das Flashen dauert oft nur wenige Sekunden
  • Portabilität: unterstützt werden DOS, Linux, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, Solaris, Mac OS X, und andere Unixoide BS

Anmerkung: Der Vorgang des Flashens umfasst das Löschen, Programmieren und Verifizieren (also Vergleichen) des Flashspeichers mit den neuen Daten.

Warnung.png Warnung: Flashrom kann in der aktuellen Version (0.9.4) noch nicht sicher mit Notebooks verwendet werden. Es ist deshalb davon abzuraten, Flashrom auf diesen zu verwenden.


Installation

Flashrom gibt es seit Debian Lenny im Paketarchiv und es hat kaum Abhängigkeiten. Die Installation kann über das Paketmanagement oder durch Bau aus den Quellen erfolgen.

als Paket

Die Installation von Flashrom über das Paketmanagement ist denkbar einfach. Das gleichnamige Paket Debianpackage.png flashrom samt Abhängigkeiten wird mittels apt-get oder aptitude installiert:

root@debian:~# apt-get install flashrom

Flashrom wird dabei nach

/usr/sbin/flashrom

installiert.

über die Quellen

Als junges Projekt wächst Flashrom rasant und bringt mit neuen Versionen viele Funktionen und vor allem die Unterstützung für weitere Hardware mit. In manchen Fällen wird es deshalb nötig sein, sich eine aktuelle, nicht im Paketarchiv befindliche Version zu beschaffen. Dazu kann man sich von der Download-Seite die letzte Version herunter laden, entpacken und kompilieren. Zuvor müssen aber noch folgende Pakete installiert werden:

root@debian:~# apt-get install build-essential libftdi-dev libpci-dev zlib1g-dev subversion

direkt aus den Quellen

Um die aktuelle Entwicklerversion zu bekommen, geht man wie folgt vor. Das Bauen kann z.B. im Benutzerverzeichnis geschehen.

user@debian:~$ mkdir ~/temp
user@debian:~$ cd ~/temp
user@debian:~$ svn co svn://flashrom.org/flashrom/trunk flashrom
user@debian:~$ cd flashrom
user@debian:~$ make

Wenn alle obig genannten Pakete installiert sind, befindet sich nun im selben Verzeichnis die ausführbare Datei flashrom.

Ein anschließendes

root@debian:~# make install

als Root würde die Manpage und Flashrom in das Dateisystem kopieren. Dies ist aber nicht zwingen notwendig und da am Paketmanagement vorbei gearbeitet wird, ist deshalb davon abzuraten.

Flashrom nun von hier ausführen:

user@debian:~$ sudo ./flashrom


Um die Quellen und damit flashrom nach einiger Zeit zu aktualisieren, ein

user@debian:~$ svn update
user@debian:~$ make

im Quellverzeichnis ausführen.

Backport aus Debian unstable

Wenn es für das aktuelle Stable kein fertigen Backport gibt, wird hier selbst eines erstellt. Um nicht am Paketmanagement vorbei zu installieren, kann man sich an einem Backport von Unstable oder Testing versuchen. Das folgende Vorgehen erfordert die Pakete Debianpackage.png fakeroot und Debianpackage.png debhelper. Dazu müssen die entsprechenden Debian Quellpakete herunter geladen, automatisch gepatcht, kompiliert und zu einem Debian-Paket geschnürt werden:

user@debian:~$ cd ~/temp
user@debian:~$ wget http://ftp.de.debian.org/debian/pool/main/f/flashrom/flashrom_0.9.4+r1394-1.dsc
user@debian:~$ wget http://ftp.de.debian.org/debian/pool/main/f/flashrom/flashrom_0.9.4+r1394.orig.tar.gz
user@debian:~$ wget http://ftp.de.debian.org/debian/pool/main/f/flashrom/flashrom_0.9.4+r1394-1.debian.tar.gz
user@debian:~$ dpkg-source -x flashrom_0.9.4+r1394-1.dsc
user@debian:~$ cd flashrom-0.9.4+r1394/
user@debian:~$ fakeroot debian/rules binary

Wenn alles geklappt hat, wird am Schluss gemeldet:

dpkg-deb: Paket »flashrom« wird in »../flashrom_0.9.4+r1394-1_amd64.deb« gebaut.

Und das Paket kann normal installiert werden:

root@debian:~# dpkg -i ../flashrom_0.9.4+r1394-1_amd64.deb

Grundanwendung

Bevor man sein BIOS aktualisieren kann, müssen einige Informationen beschafft werden um anschließend die vom Mainboardhersteller besorgte Update-Datei vorbereiten zu können. Für weiteres kann es nützlich sein folgende Pakete zu installieren:

Zum Entpacken der Hersteller BIOS-Dateien sollten sich die passenden Entpacker im System befinden:

  • Debianpackage.png p7zip-full - 7z hieraus beherrscht ZIP-, Zip64-, CAB-, RAR-, ARJ-, GZIP-, BZIP2-, TAR-, CPIO-, RPM-, ISO- und DEB Archive; ersetzt also alle weiter gelisteten
  • Debianpackage.png unzip
  • Debianpackage.png unrar
  • Debianpackage.png unp - ein praktisches Skript, was viele Entpacker mit einem Aufruf verwendet
  • Debianpackage.png orange
  • Debianpackage.png cabextract

Vorbereitung

Man sollte auf jeden Fall die genaue Modellbezeichnung und Revision des betreffenden Mainboards in Erfahrung bringen. Wenn diese Informationen nicht zu finden sind, sich das Gehäuse (z.B. wegen Garantie) nicht öffnen lässt, kann zu diesem Zweck dmidecode benutzt werden. Auch das BIOS-Setup selbst oder die Herstellerseite kann bei der Suche hilfreich sein.

Als Beispiel sei ein Gigabyte GA-MA790XT-UD4P (rev. 1.0) herangezogen.

root@debian:~# dmidecode -t baseboard
# dmidecode 2.9
SMBIOS 2.4 present.

Handle 0x0002, DMI type 2, 8 bytes
Base Board Information
        Manufacturer: Gigabyte Technology Co., Ltd.
        Product Name: GA-MA790XT-UD4P
        Version:  
        Serial Number:


Von der Herstellerseite lässt sich die derzeit aktuelle Version "F8" herunter laden:

user@debian:~$ cd ~/temp/
user@debian:~$ wget http://download.gigabyte.ru/bios/mb_bios_ga-ma790xt-ud4p_f8.exe

In den meisten Fällen handelt es sich um eine Zip-Datei oder um eine selbst entpackende Exe-Datei (SFX Archiv), welche sich mit 7z entpacken lässt. Zur Übersichtlichkeit wird hier ein temporäres Verzeichnis BIOS angelegt:

user@debian:~$ mkdir BIOS ; cd BIOS
user@debian:~$ 7za x ../mb_bios_ga-ma790xt-ud4p_f8.exe
[...]
Processing archive: ../mb_bios_ga-ma790xt-ud4p_f8.exe

Extracting  autoexec.bat
Extracting  M79XTUD4.F8
Extracting  FLASHSPI.EXE

Everything is Ok

Files: 3
Size:       1084246
Compressed: 696592

Wenn es sich nicht um so ein SFX-Archiv handelt, bleibt nichts anderes übrig als diese EXE mittels Debianpackage.png wine (wegen GUI-Dialog XServer erforderlich) oder unter einem Windows entpacken zu lassen.

user@debian:~$ mkdir BIOS
user@debian:~$ wine mb_bios_ga-ma790xt-ud4p_f8.exe

Beim erscheinenden Dialog als Zielverzeichnis BIOS angeben.

Egal mit welcher nötigen Methode, im Beispiel wurden drei Dateien entpackt:

user@debian:~$ ls -l BIOS/
insgesamt 1064
-rw-r--r-- 1 ich ich      20 15. Sep 05:17 autoexec.bat
-rwxr-xr-x 1 ich ich   35650 23. Feb 2011  FLASHSPI.EXE
-rw-r--r-- 1 ich ich 1048576  8. Sep 09:08 M79XTUD4.F8

Die 1MB große M79XTUD4.F8 ist die benötigte Datei, welche das komplette BIOS Abbild enthält.

user@debian:~$ file BIOS/M79XTUD4.F8 
BIOS/M79XTUD4.F8: data

Typische und mögliche Dateieerweiterungen sind: .bin, .img, .hex, keine oder einfach beliebige.

BIOS sichern

Hinweis.png Hinweis: Die Benutzung von Flashrom erfordert Root-Rechte, welche z.B. temporär mit Debianpackage.png sudo erlangt werden können.


Welche Mainboards mit der aktuellen Entwicklerversion von Flashrom garantiert oder sicher noch nicht unterstützt werden, ist hier zu finden. Nicht aufgeführte sind schlicht noch nicht getestet wurden, kein Grund zur Beunruhigung.

Ob der Chipsatz und eigentliche Flash-Chip erkannt und unterstützt werden, erfährt man beim Aufruf von Flashrom ohne weitere Parameter:

root@debian:~# flashrom 
flashrom v0.9.2-r1141 on Linux 2.6.39.4-1000hz (x86_64), built with libpci 3.1.7, GCC 4.4.5 20100728 (prerelease), little endian
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
No coreboot table found.
Found ITE Super I/O, id 8720
Found chipset "AMD SB700/SB710/SB750", enabling flash write... OK.
This chipset supports the following protocols: LPC,FWH,SPI.
Found chip "Macronix MX25L8005" (1024 KB, SPI) at physical address 0xfff00000.
No operations were specified.

Dabei sollten die Meldungen "Found chipset ..." und "Found chip ..." auftauchen. Diese Informationen werden übrigens bei jedem Aufruf ausgegeben. Im Beispiel wird ein 1024 KB großer "Macronix MX25L8005" erkannt, was also genau mit der Größe unseres BIOS-Abbildes übereinstimmt. Bevor jedoch irgend etwas unternommen wird, sollte unbedingt das aktuelle BIOS gesichert werden.

-r, --read <Datei>
Mit diesem Schalter kann der komplette Inhalt des Flashspeichers in eine Datei geschrieben werden.

Folgend wird es in die Datei M79XTUD4-backup.bin gesichert:

root@debian:~# flashrom -r temp/BIOS/M79XTUD4-backup.bin
[...]
Reading flash... done.

Das hat weniger als 6 Sekunden gedauert. Zum Größenvergleich:

user@debian:~$ ls -l BIOS/M79XTUD4*
-rw-r--r-- 1 root root 1048576 17. Okt 22:20 BIOS/M79XTUD4-backup.bin
-rw-r--r-- 1 ich  ich  1048576  8. Sep 09:08 BIOS/M79XTUD4.F8
Warnung.png Warnung: Sollte es hier Unterschiede geben, kann das bedeuten, dass die neue Datei fehlerhaft, unpassend oder einfach inkompatibel ist.


neues BIOS programmieren

Warnung.png Warnung: Es muss unbedingt sicher gestellt werden, dass der Rechner während aller Aktionen, bei denen der Flash geschrieben oder gelöscht wird, nicht ausgeschaltet (Stromausfall, Unachtsamkeit), der Vorgang also abrupt unterbrochen wird. Das hätte womöglich zur Folge, das dieser aufgrund des defekten BIOS nicht mehr startet.


-w, --write <Datei>
Mit write wird die angegebene Datei in den Flashspeicher programmiert. Hierbei wird automatisch der komplette Chip gelöscht, neu beschrieben und mit der gegebenen Datei verglichen.

Wurde ein BIOS-Backup erfolgreich angefertigt, kann das Neue Abbild in den Flash programmiert werden:

root@debian:~# flashrom -w temp/BIOS/M79XTUD4.F8 
[...]
Writing flash chip... Erasing flash before programming... Erasing flash chip... SUCCESS.
done.
Programming flash... done.
COMPLETE.
Verifying flash... VERIFIED.

Nach knapp einer Minute wurde der Vorgang erfolgreich beendet. Ab hier ist das BIOS-Update erfolgreich beendet und weiteres ist für spezielle Anwendungen oder bei Problemen nötig.

Datei mit Flash-Chip vergleichen

-v, --verify <Datei>
Hierbei wird die gegebene Datei mit dem Flashinhalt verglichen.

Es kann nützlich sein, um zu testen, ob eine BIOS-Datei bereits mit dem Flashinhalt übereinstimmt. Die eben programmierte Datei zum Test stimmt 100% überein:

root@debian:~# flashrom -v temp/BIOS/M79XTUD4.F8
[...]
Verifying flash... VERIFIED.

Die vorher gesicherte Datei wird zum Test dem Vergleich nicht standhalten:

root@debian:~# flashrom -v temp/BIOS/M79XTUD4.backup.bin
[...]
Verifying flash... VERIFY FAILED at 0x0002ffff! Expected=0x00, Read=0xff, failed byte count from 0x00000000-0x000fffff: 0x90873
Hinweis.png Hinweis: Viele BIOS ändern bei jedem Systemstart ein paar Byte im Flash. Diese können Bootzeit oder Konfigurationen enthalten. Das sollte man wissen, um sich nicht von plötzlich fehlschlagenden Vergleichen oder geänderten Prüfsummen verwirren zu lassen.


BIOS Flash löschen

-E, --erase
Löscht den kompletten Flashspeicher. Dabei wird jedes Byte aller Blöcke auf 0xff (b11111111) gesetzt.
root@debian:~# flashrom -E
[...]
Erasing flash chip... SUCCESS.

Ein Verifizieren mit einer gegebenen Datei schlägt dann fehl, sobald sich in dieser etwas anderes als 0xff (b11111111) befindet:

Verifying flash... VERIFY FAILED at 0x00000000! Expected=0x24, Read=0xff, failed byte count from 0x00000000-0x000fffff: 0xbd11d

Hintergründe / Wissenswertes

Bei den hier relevanten Speichern handelt sich um NOR-Flash. Im Unterschied zu den wesentlich günstigeren NAND-Flash, welche in USB-Sticks, SSDs, CF/SD Karten verbaut sind, haben diese folgend andere Eigenschaften:

  • getrennter Adress- und Datenbus
  • dadurch linearer Adressbereich mit wahlweisem und direktem Zugriff
  • definierte und schnellere Zugriffszeiten

Damit ersetzen sie alte EPROM Varianten und wenn sie an einem Prozessor angeschlossen sind, ermöglichen sie das direkte ausführen von Code. Neben Chips mit den klassischen parallel ausgeführten Adress- und Datenleitungen gibt es deutlich kleinere, die mit seriellen Schnittstellen ausgestattet sind. Verbreitet sind SPI, LPC und FWH.

SPI
Serial Peripheral Interface - Ursprünglich von Motorolla entwickelt, auch unter anderen Bezeichnungen zu finden. Benötigst mindestens drei, oft vier und mehr Leitungen.
LPC
Low Pin Count - Ist ein serieller Bus, welcher in modernen PCs anzutreffen ist. Darüber angebunden ist hauptsächlich der Super I/O Chip, welcher sich maßgeblich für den Floppy Anschluss, klassische Parallele und serielle Schnittstellen, Watchdog Timer, CPU-ID Erkennung, Spannungs- Lüfter- und Temperaturmonitorung und Steuerung verantwortlich macht.
FWH
Firmware Hub - Ist eine sehr geringfügige Variation des LPC.

Unter den Gehäusevarianten sind DIP, PLCC, SO/SOIC, (T)SSOP und BGA von Bedeutung. Weiteres gibt es hier.

Erweiterte Anwendung / Problemlösung

Warnung.png Warnung: Wenn das Flashen aus irgend einem Grund fehlerhaft verläuft und abbricht, empfehlen die Flashrom Entwickler, den Computer NICHT auszuschalten. Man solle stattdessen über IRC oder Mail sofort um Hilfe anfragen. So lange der Computer noch läuft, besteht die Chance der Korrektur/Behebung.


Auch wenn es Probleme beim Programmieren gab und keine weitere Möglichkeit besteht, diese zu beheben, gibt es Dienstleister, welche das Sichern und Programmieren der Flash-Chips anbieten:

Es lassen sich nur einzelne Flash-Chips schicken. Was nur möglich ist, wenn sich dieser entfernen lässt.
Hier kann man auch ganze Boards und Notebooks schicken.

Schreibschutz lösen

Einige Boards schützen ihren BIOS-Flash vor dem Überschreiben, indem entweder durch DIP-Schalter oder Jumper-Brücken auf dem Board oder im BIOS-Setup Optionen wie "write protect", "BIOS write enable" oder ähnliches gesetzt sind. Wie diese Sperren aufzuheben sind, ist im Benutzerhandbuch des Boardes beschrieben und nötig um das Programmieren zu ermöglichen.

universeller Chip-Programmer mit Flashrom

Hin und wieder sind DIP oder PLCC Flash auf dem Board in einem Sockel aufgebracht, ansonsten lässt sich ein solcher nachträglich auflöten. Zudem unterstützt Flashrom Programmer, also Hardware, die sich extern anbinden lässt. Das können Grafik-, Raid-, Netzwerkkarten oder Selbstbauprogrammer sein. Damit lässt sich kostengünstig eine Vielzahl gebräuchlicher Flashspeicher programmieren, was in der Entwicklung eingebetteter Systeme und anderer Hardware sehr nützlich sein kann.

Anmerkungen:

  • Halbleiter und generell elektronische Teile müssen ESD-gerecht behandelt werden, um eine Zerstörung zu vermeiden.
  • Da die ICs während des Betriebes, also unter Spannung, getauscht werden, müsste man eigentlich auf die Reihenfolge achten, sodass Masse und Versorgungs Pins zuerst (beim Einstecken) und zuletzt (beim Ausziehen) mit den Kontakten des Sockels in Berührung kommen. Hintergrund ist, dass nicht ganz auszuschließen ist, die internen Schutzdioden (clamping diode) zu überlasten/zerstören. Praktisch sind diese doch sehr belastbar ausgeführt.
  • Eventuell verbaute Sockel sind nicht für viele Steck-Zyklen konstruiert. Wenn man das vor hat, sollte ein Nullkraft-Sockel (ZIF) huckepack aufgesteckt und in diesen die ICs gesetzt werden.

Hilfe für die Entwickler

Flashrom ist noch stark in der Entwicklung. Viele Hardware muss noch unterstützt und vorallem getestet werden. Dabei kann prinzipiell jeder Nutzer mitwirken. Je nach Ambition gibt es verschiedene Stufen des Mitwirkens.

erfolgreiche Verwendung übermitteln

Viele Chipsätze oder Flashspeicher haben auf dieser Übersicht in Teilen noch den Status Ungetesten (also "?") stehen. Das bedeutet, die Unterstützung sollte, durch Ähnlichkeit mit anderen bereits getesteten, gegeben sein. Erhält man mit der aktuellen Entwickler Version bei erfolgreicher Anwendung die Meldung, dass Chipsatz oder Flashspeicher teilweise ungetestet ist, dann sollte man flashrom mit allen ungetesteten Funktionen im verbose Modus wiederholt anwenden und die komplette Ausgabe speichern (copy & paste, Ausgabeumlenkung in eine Datei, Loggingfunktionen (script aus Debianpackage.png bsdutils, Debianpackage.png screen, ...). Beispiel Hinweis:

[...]
Found chip "PMC Pm49FL004" (512 KB, LPC,FWH) at physical address 0xfff80000.
===
This flash part has status UNTESTED for operations: PROBE READ ERASE WRITE
Please email a report to flashrom@flashrom.org if any of the above operations
work correctly for you with this flash part. Please include the flashrom
output with the additional -V option for all operations you tested (-V, -rV,
-wV, -EV), and mention which mainboard or programmer you tested.
Thanks for your help!

Hier wäre also die komplette Ausgabe vom Aufruf mit dem verbose-Schalter -V, lesen -rV, löschen -EV und schreiben -wV gefragt. Zusätzlich die Ausgabe von

user@debian:~$ lspci -nn

genaue Boardbezeichnung, -Revision und Hersteller. Diese Informationen sind dann entweder an die Mailinglist oder via IRC zu übermitteln. Es ist keine Pflicht aber jede so übermittelte, bisher ungetestete, erfolgreiche (oder fehlgeschlagene) Anwendung stellt eine Verbesserung dar.

Unterstützung erweitern

Wer dazu fähig ist, kann aktiv neue HW testen, den Quellcode erweitern und reverse engineering mit sperriger HW/BIOS betreiben. Es gibt Einstiegsanleitungen für kleine Projekte, das testen von Boards, das knacken spezifischer Schreibschutzmechanismen und die Entwicklungsrichtlinien.

Links / Weiterführendes