Forum: Compiler & IDEs Addressierung section-Grenzen


von Olaf (Gast)


Lesenswert?

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