Addressierung section-Grenzen

Gast #1148132
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.