- Mitglied seit
- 10 Mai 2006
- Beiträge
- 15,275
- Punkte für Reaktionen
- 1,751
- Punkte
- 113
Ich behaupte ja immer wieder gerne, daß die von AVM für die Kernel-Versionen ab 03.xx veröffentlichten Quelltext-Pakete unvollständig sind, weil bereits für den Start des Systems ein entscheidender Bestandteil fehlt (der FDT mit der Hardware-Beschreibung nach OF-Spezifikation).
Ich habe mich jetzt mal des Themas angenommen und einen Weg bis zum Ende umgesetzt, wie man einen eigenen lauffähigen Kernel (zumindest hat der bei mir beim Schreiben des Systems in den Flash funktioniert - das System startete also auf jeden Fall und das ist schon mal mehr, als man sonst mit einem eigenen Kernel auf der Basis der AVM-Quellen erreichen kann) erzeugen kann.
Es braucht ein paar Programme und Shell-Skripte, die habe ich in meinem GitHub-Repository unter https://github.com/PeterPawn/YourFritz/tree/master/avm_kernel_config abgelegt habe.
Ausgangspunkt ist ein Dump des Bereiches zwischen den Symbolen __avm_kernel_config_start und __avm_kernel_config_end, wo AVM in 64 KB irgendwelche modell- und versionsspezifischen Konfigurationen unterbringt. Diesen Dump kann man auf mehreren Wegen erzeugen, dazu komme ich später.
Aus dem Dump des Bereiches wird dann mittels "gen_avm_kernel_config(.c)" (mit "-m32 -std=c99" übersetzen) ein Quelltext-File in Assembler generiert, dabei wird der Inhalt der FDT-Bereiche gleich direkt aus dem Dump verwendet und nicht aus den übersetzten dts-Dateien von AVM (in arch/mips/boot/dts) zusammengestellt.
Um das etwas flexibler zu gestalten, werden anstelle direkter Assembler-Anweisungen (es sind ja ohnehin nur Datendefinitionen) ein paar Makros verwendet, diese finden sich in "avm_kernel_config_macros.h" - damit muß diese Datei dann auch in das Verzeichnis mit dem generierten Assembler-Quelltext kopiert werden; beide Dateien gehören in das Verzeichnis "linux-3.10/arch/mips/kernel", wobei das Include-File mit den Makros statisch ist, während der Assembler-Quelltext zumindest für jedes Modell und wohl auch für jede AVM-Firmware-Version neu generiert werden muß (weil sich die "size"-Angaben bei den LKM jederzeit ändern können).
Im Anschluß braucht es noch die drei Patches für Freetz (die 90x-Dateien im Repository, wobei eine davon die "avm_kernel_config_macros.h" erzeugt), um das Übersetzen des Assembler-Files und das Linken mit dem Kernel zu veranlassen.
Wie kommt man denn nun an den Dump dieses Bereiches?
Es gibt m.E. zwei (oder drei) denkbare Wege ... einer besteht im Kopieren des Bereiches aus einem laufenden System heraus (damit natürlich auf einer FRITZ!Box, wo das originale System von AVM läuft), dafür habe ich das Skript "dump_kernel_config.sh" erstellt.
Nun ist das aber ein denkbar undankbares Unterfangen, wenn man das (wie bei Freetz zu erwarten) im Build-Prozess automatisieren will. Also gäbe es noch die Möglichkeit, den originalen Kernel von AVM zu entpacken und in dieser Datei dann nach dem Abbild dieses Bereiches zu suchen.
Da dort ja der Inhalt des FDT für die Hardware-Beschreibung zu finden ist, kann man auch den binären Inhalt eines solchen FDT (der kann mittels "dtc" aus den Dateien in "arch/mips/boot/dts" erzeugt werden) als "Anker" für das Suchen des richtigen Bereiches im entpackten Kernel verwenden. Das setzt das C-Programm "extract_avm_kernel_config(.c)" um ... es braucht neben dem bereits entpackten Kernel (entweder mit "unpack_kernel.sh" aus meinem Repository oder auch mit dem "unpack-kernel" aus den Freetz-Tools aus dem gepackten AVM-Kernel erzeugt) noch die "dtb"-Datei für den ersten FDT (der für HWSubRevision 0, falls es mehrere für ein Modell gibt), damit dieser Inhalt im Image gesucht werden kann.
Dabei habe ich dann irgendwann festgestellt, daß es sogar recht einfach machbar ist, mit der Signatur "d0 0d fe ed" für einen FDT bei der Suche über den entpackten Kernel den Bereich ebenfalls zu lokalisieren. Das habe ich allerdings nicht mehr als Programm umgesetzt, man müßte vermutlich noch ein paar zusätzliche Plausibilitätsprüfungen für so eine Fundstelle einbauen, damit man sich dabei nicht irgendwann doch mal mächtig verzockt, weil ein "false positive" als Fundstelle auftaucht.
Wie man das jetzt in den Build-Prozess von Freetz integrieren könnte, weiß ich auch nicht genau bzw. vermutlich sind da die Vorstellungen recht unterschiedlich.
Es ist jedenfalls schon mal ein Paradigmenwechsel, wenn vor der Übersetzung der Kernel-Quellen noch aus dem jeweiligen AVM-Kernel für das Zielsystem etwas zu extrahieren ist ... im Normalfall ist bei der bisherigen Reihenfolge der Abarbeitung in der Freetz-Toolchain zu diesem Zeitpunkt noch nicht einmal der Download des AVM-Images erfolgt, geschweige denn, daß dieses Image oder der dort enthaltene Kernel entpackt wäre. Aber ich sehe praktisch keinen anderen Weg, außer es wird für jeden Kernel von AVM bereits vorher die Assembler-Datei erzeugt und als Quelltext in Freetz "mitverwaltet" - spätestens bei Labor-Versionen ein Schrecken ohne Ende.
Ich habe die Lösung bisher nur mit der 113.06.60 von AVM ausprobiert - da mein Freetz-Fork im Moment etwas mit dem Original auseinandergelaufen ist, weiß ich auch nicht, wie weit die 06.60 derzeit im Trunk funktioniert ... als Firmware-Version ist die ja bereits seit CS 13814 drin, aber die Kernel-Quellen der 06.60 sind wohl noch nicht integriert. Da die auch für Freetz "aufbereitet" werden müssen (und der Download dann auch nicht mehr direkt bei AVM erfolgt) und das in Anbetracht des "delta concepts" nicht "von außen" machbar ist, habe ich dafür ein eigenes Archiv der Kernel-Quellen von AVM erstellt und unter http://yourfritz.de/7490/linux-7490-06.60.tar.xz abgelegt (md5sum: 6cc063e4f4c1d9c93e1c68d7f2c2e832).
Wer das also ohne Vorarbeiten von @er13 (oder wer auch immer das integrieren will oder wird) selbst umsetzen will, muß unter "Override options" entsprechende Einstellungen vornehmen und zusätzlich die ganzen Anpassungen für die Unterstützung der 06.60-Quellen im Trunk nachrüsten. Da das nicht ganz so einfach ist, würde ich das nur jemandem empfehlen, der sich damit wirklich auskennt ... vielleicht läßt sich ja auch @er13 entsprechend erweichen und investiert die knappe Zeit an dieser Stelle, damit wieder eigene Kernel mit den auf Linux 3.xx basierenden Firmware-Versionen von AVM verwendet werden können (zumindest nicht mehr an der fehlenden Konfiguration in init_avm_kernel_config() scheitern).
Wenn in Freetz die Entscheidung für den "dritten Weg" bei der Suche nach dem AVM-Bereich im entpackten Kernel fallen sollte (wobei das Übersetzen des passenden FDT für die Suche sicherlich auch keine so ganz schlechte Idee ist), dann würde ich ggf. noch einmal mit anpacken und die Prüfung der Plausibilität gefundener Daten nachrüsten.
Ich habe mich jetzt mal des Themas angenommen und einen Weg bis zum Ende umgesetzt, wie man einen eigenen lauffähigen Kernel (zumindest hat der bei mir beim Schreiben des Systems in den Flash funktioniert - das System startete also auf jeden Fall und das ist schon mal mehr, als man sonst mit einem eigenen Kernel auf der Basis der AVM-Quellen erreichen kann) erzeugen kann.
Es braucht ein paar Programme und Shell-Skripte, die habe ich in meinem GitHub-Repository unter https://github.com/PeterPawn/YourFritz/tree/master/avm_kernel_config abgelegt habe.
Ausgangspunkt ist ein Dump des Bereiches zwischen den Symbolen __avm_kernel_config_start und __avm_kernel_config_end, wo AVM in 64 KB irgendwelche modell- und versionsspezifischen Konfigurationen unterbringt. Diesen Dump kann man auf mehreren Wegen erzeugen, dazu komme ich später.
Aus dem Dump des Bereiches wird dann mittels "gen_avm_kernel_config(.c)" (mit "-m32 -std=c99" übersetzen) ein Quelltext-File in Assembler generiert, dabei wird der Inhalt der FDT-Bereiche gleich direkt aus dem Dump verwendet und nicht aus den übersetzten dts-Dateien von AVM (in arch/mips/boot/dts) zusammengestellt.
Um das etwas flexibler zu gestalten, werden anstelle direkter Assembler-Anweisungen (es sind ja ohnehin nur Datendefinitionen) ein paar Makros verwendet, diese finden sich in "avm_kernel_config_macros.h" - damit muß diese Datei dann auch in das Verzeichnis mit dem generierten Assembler-Quelltext kopiert werden; beide Dateien gehören in das Verzeichnis "linux-3.10/arch/mips/kernel", wobei das Include-File mit den Makros statisch ist, während der Assembler-Quelltext zumindest für jedes Modell und wohl auch für jede AVM-Firmware-Version neu generiert werden muß (weil sich die "size"-Angaben bei den LKM jederzeit ändern können).
Im Anschluß braucht es noch die drei Patches für Freetz (die 90x-Dateien im Repository, wobei eine davon die "avm_kernel_config_macros.h" erzeugt), um das Übersetzen des Assembler-Files und das Linken mit dem Kernel zu veranlassen.
Wie kommt man denn nun an den Dump dieses Bereiches?
Es gibt m.E. zwei (oder drei) denkbare Wege ... einer besteht im Kopieren des Bereiches aus einem laufenden System heraus (damit natürlich auf einer FRITZ!Box, wo das originale System von AVM läuft), dafür habe ich das Skript "dump_kernel_config.sh" erstellt.
Nun ist das aber ein denkbar undankbares Unterfangen, wenn man das (wie bei Freetz zu erwarten) im Build-Prozess automatisieren will. Also gäbe es noch die Möglichkeit, den originalen Kernel von AVM zu entpacken und in dieser Datei dann nach dem Abbild dieses Bereiches zu suchen.
Da dort ja der Inhalt des FDT für die Hardware-Beschreibung zu finden ist, kann man auch den binären Inhalt eines solchen FDT (der kann mittels "dtc" aus den Dateien in "arch/mips/boot/dts" erzeugt werden) als "Anker" für das Suchen des richtigen Bereiches im entpackten Kernel verwenden. Das setzt das C-Programm "extract_avm_kernel_config(.c)" um ... es braucht neben dem bereits entpackten Kernel (entweder mit "unpack_kernel.sh" aus meinem Repository oder auch mit dem "unpack-kernel" aus den Freetz-Tools aus dem gepackten AVM-Kernel erzeugt) noch die "dtb"-Datei für den ersten FDT (der für HWSubRevision 0, falls es mehrere für ein Modell gibt), damit dieser Inhalt im Image gesucht werden kann.
Dabei habe ich dann irgendwann festgestellt, daß es sogar recht einfach machbar ist, mit der Signatur "d0 0d fe ed" für einen FDT bei der Suche über den entpackten Kernel den Bereich ebenfalls zu lokalisieren. Das habe ich allerdings nicht mehr als Programm umgesetzt, man müßte vermutlich noch ein paar zusätzliche Plausibilitätsprüfungen für so eine Fundstelle einbauen, damit man sich dabei nicht irgendwann doch mal mächtig verzockt, weil ein "false positive" als Fundstelle auftaucht.
Wie man das jetzt in den Build-Prozess von Freetz integrieren könnte, weiß ich auch nicht genau bzw. vermutlich sind da die Vorstellungen recht unterschiedlich.
Es ist jedenfalls schon mal ein Paradigmenwechsel, wenn vor der Übersetzung der Kernel-Quellen noch aus dem jeweiligen AVM-Kernel für das Zielsystem etwas zu extrahieren ist ... im Normalfall ist bei der bisherigen Reihenfolge der Abarbeitung in der Freetz-Toolchain zu diesem Zeitpunkt noch nicht einmal der Download des AVM-Images erfolgt, geschweige denn, daß dieses Image oder der dort enthaltene Kernel entpackt wäre. Aber ich sehe praktisch keinen anderen Weg, außer es wird für jeden Kernel von AVM bereits vorher die Assembler-Datei erzeugt und als Quelltext in Freetz "mitverwaltet" - spätestens bei Labor-Versionen ein Schrecken ohne Ende.
Ich habe die Lösung bisher nur mit der 113.06.60 von AVM ausprobiert - da mein Freetz-Fork im Moment etwas mit dem Original auseinandergelaufen ist, weiß ich auch nicht, wie weit die 06.60 derzeit im Trunk funktioniert ... als Firmware-Version ist die ja bereits seit CS 13814 drin, aber die Kernel-Quellen der 06.60 sind wohl noch nicht integriert. Da die auch für Freetz "aufbereitet" werden müssen (und der Download dann auch nicht mehr direkt bei AVM erfolgt) und das in Anbetracht des "delta concepts" nicht "von außen" machbar ist, habe ich dafür ein eigenes Archiv der Kernel-Quellen von AVM erstellt und unter http://yourfritz.de/7490/linux-7490-06.60.tar.xz abgelegt (md5sum: 6cc063e4f4c1d9c93e1c68d7f2c2e832).
Wer das also ohne Vorarbeiten von @er13 (oder wer auch immer das integrieren will oder wird) selbst umsetzen will, muß unter "Override options" entsprechende Einstellungen vornehmen und zusätzlich die ganzen Anpassungen für die Unterstützung der 06.60-Quellen im Trunk nachrüsten. Da das nicht ganz so einfach ist, würde ich das nur jemandem empfehlen, der sich damit wirklich auskennt ... vielleicht läßt sich ja auch @er13 entsprechend erweichen und investiert die knappe Zeit an dieser Stelle, damit wieder eigene Kernel mit den auf Linux 3.xx basierenden Firmware-Versionen von AVM verwendet werden können (zumindest nicht mehr an der fehlenden Konfiguration in init_avm_kernel_config() scheitern).
Wenn in Freetz die Entscheidung für den "dritten Weg" bei der Suche nach dem AVM-Bereich im entpackten Kernel fallen sollte (wobei das Übersetzen des passenden FDT für die Suche sicherlich auch keine so ganz schlechte Idee ist), dann würde ich ggf. noch einmal mit anpacken und die Prüfung der Plausibilität gefundener Daten nachrüsten.
Zuletzt bearbeitet: