Ich habe ein großes Problem. Und zwar programmiere ich gerade einen Bootloader für einen PowerPC (PowerQUICC III). Über den Bootloader soll später das Betriebssystem in den Flashspeicher gebracht werden. Nun ist es so, dass ich nur einen Flashspeicher besitze, dieser kann ja nur beschrieben werden, wenn daraus nicht gelesen wird. Dummerweise ist da ja der Bootloader selbst drin. Nun muss ich es also hinbekommen den Bootloader in den DDR2-RAM zu kopieren und von dort weiter auszuführen. Bloß muss der DDR-Speicher über die SPD-Daten zunächst eingestellt werden muss. Diese Routine habe ich bereits in C umgesetzt. Um nun also den Bootloader in den RAM zu bekommen müsste ich zunächst die Grundlegende Initialisierung (interrupts, MMU etc) in Assember machen (das ist bereits fertig) von da aus die C-Funktion zum Einstellen des DDR-RAMs aufrufen, und anschließend dann den Bootloader in den RAM kopieren und von dort weiter ausführen. Nur wie kann ich das alles dem Compiler bzw. Linker beibringen. Bin für jede Anregung dankar.
So, ich habe gerade mal versucht den Code Positionsunabhängig zu Compilieren. Leider bekomme ich dann die Warnung:
1 | ntoppc-ld warning: no memory region specified for section `.fixup' |
Es wird also auf einmal eine neue Section angelegt. Ich habe mal nachgesehen und es sieht so aus, als wenn ein Objectfile, dass ein relativ großes globales const-array beinhaltet dort reingelinkt wird. Weiß jemand was es mit dem fixup Bereich auf sich hat? Und mir ist aufgefallen dass mit fPIC auf einmal mehr als doppelt so viel ram benötigt wird. Womit hängt das zusammen?
Also dass du den Bereich nicht beschreiben kannst, in dem der Bootloader liegt, ist ja eigentlich logisch. Aber wie siehts aus, wenn du für den Bootloader ein kleines Stück flash reservierst, die Anwendersoftware dahinter ablegst und vom Bootloader aus dann einfach an die Adresse springst? Oder andersrum: Die Anwendersoftware liegt wie gewohnt drin, der Bootloader irgendwo am Ende des Flashspeichers. Soll der BL gestartet werden, einfach dessen Adresse anspringen. Da wäre dann auch das Problem beseitigt: Was ist, wenn der Strom beim flashen ausfällt? Mit der RAM-Version wäre der BL weg und die Software "defekt". Liegt der Bootloader fest im Flash, läuft zumindest der noch, wenn die Software nen Schaden hat.
Ich habe einen festen bereich für den Bootloader im Flash (die obersten 128 KB). Das Wird auch immer so bleiben, es werden nur die Blöcke gelöscht die auch beschrieben werden sollen. Nun soll über den Bootloader ein Betriebssystem, das ebenfalls im Flash liegt gelöscht werden. Das BS liegt in den Untersten 4MB. Der Bootloader bleibt dann erhalten. Nur lässt es der Flashspeicher nicht zu, zu Lesen wären man etwas schreibt oder löscht. Denn während dieses Vorgangs wird beim Lesen des Flashspeichers einfach nur das Statusregister ausgegeben (z.B. wo das Bit drin ist auf das man pollt um zu sehen ob er fertig geschrieben hat). Das Programm würde daher abstürzen. Es ist also unumgänglich den Bootloader selbst aus im Arbeitsspeicher laufen zu lassen. Ich bin nun gerade dabei etwas zu tricksen. Und zwar kompiliere ich das ganze Projekt für den Speicherbereich des DDRs (also von 0x00000000-0x0FFFFFFF), schreibe aber das erzeugte Image in den Flashspeicher bei 0xFF800000. Da die ersten in assembler stattfinden und damit nur relative Sprünge enthalten läuft das da auch. Nun habe ich die Initialisierungsroutine für den DDR Speicher in C so abgewandelt dass dort keine Funktionen mehr aufgerufen werden. Diese Funktion läuft somit jetzt auch im "falsch gelinkten" Bereich. Anschließend kopiere ich den Flashinhalt an Speicheradresse 0x00000000-(Größe vom Bootloader) in den RAM und springe nun die main Funktion im RAM an. Nur habe ich noch ein paar Probleme mit der Berechnung der absoluten Adresse
1 | lis %r2, (main+speicheroffset)@h |
2 | ori %r2, %r2 (main+speicheroffset)@l |
3 | mtlr %r2 |
4 | blr |
Das haut so noch nicht hin. "main" müsste die Adresse der Main-Funktion im Flashspeicher enthalten und nun muss ich den Offset rauskriegen wenn ich den Bootloader von 0xFFFF0000 (die letzten 64 KB vom Flash enthalten den Bootloader) nach 0x00000000 kopiere. Wahrscheinlich muss ich mir das Linkerskript nochmal genauer angucken
So habs jetzt hinbekommen. Hat alles geklappt, danke fürs reinschauen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.