Ich passe hier gerade den gcc fuer ein Controllerboard mit einem 68k
Prozessor an. Der vom Compiler erzeugte Code soll mal im Speicherbereich
0x200000 laufen und der Linker erzeugt dafuer auch seinen Code. Soweit
alles gut und richtig.
Nach einem Reset befindet sich das Programm aber an der Adresse 0x00000.
Das ist notwendig weil die CPU sich dort ihren Resetvektor herholt.
Mit anderen Worten der Code laeuft also auf einer Adresse fuer die er
nicht uebersetzt wurde. Das ist erstmal kein Problem! Allerdings sollte
das so schnell wie moeglich geaendert werden. Dazu kopiere ich etwas
Assemblercode aus meinem Flashrom in das Ram des Prozessor und starte
das dort.
Damit werden dann CS-Leitungen an dem Prozessor umgeschaltet und das
Flashrom befindet sich danach an seiner richtigen Stelle. Jetzt muss ich
aber noch vom Ram wieder zurueck in das Flashrom springen.
Das sieht so aus:
asm("jmp _to_rom");
Der Compiler weiss aber leider nicht das der Code in ein Ram kopiert
werden soll das ganz woanders liegt. Als Folge erzeugt er mir immer
einen PC-relativen Sprung und kein jmp mit einer absoluten Adresse.
Ich koennte jetzt mit Attribute section dem Compiler sagen das dieser
Code fuer eine bestimmte Section uebersetzt werden soll und dann erzeugt
er den richtigen Sprung. Leider liegt der Code dann aber nicht mehr in
meinem Flashrom an der richtigen Stelle und meine Kopierfunktion bekommt
keine Adresse um die Funktion zu kopieren.
Hat einer eine Idee wie man das am elegantesten loesen kann?
Meine aktuelle Loesung sieht so aus das ich statt obiger Zeile einfach
dies hier schreibe:
asm("jmp %c0" : : "g" (0x2201c0) );
Allerdings muss ich mir dann die Adresse aus dem Assembleroutput des
Compilers selber besorgen und in mein Programm eintragen. Und natuerlich
jedesmal neu wenn sich etwas an der Laenge des PRogramms geaendert hat.
Mit anderen Worten inakzeptabler Pfusch.
Olaf
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.