Forum: Compiler & IDEs PowerPC - Bootloader ins RAM kopieren von dort laufen lassen


von Timmo H. (masterfx)


Lesenswert?

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.

von Timmo H. (masterfx)


Lesenswert?

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?

von Stefan C. (jaecko)


Lesenswert?

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.

von Timmo H. (masterfx)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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
Noch kein Account? Hier anmelden.