14.01.2015 Aufrufe

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

4 Basisschicht e<strong>in</strong>es Verwalters<br />

mehrere Str<strong>in</strong>gs enthalten, so kann der Compiler sie alle mithilfe des Sektionssymbols und e<strong>in</strong>em<br />

entsprechenden Versatz ansprechen und spart so die Erzeugung von zusätzlichen Symbolen. Diese<br />

Optimierung ist möglich, da die angesprochene Datenstruktur nur <strong>in</strong>nerhalb der Datei verwendet<br />

werden kann. Der Compiler kann alle Verweise <strong>in</strong>nerhalb e<strong>in</strong>er Übersetzungse<strong>in</strong>heit mit beliebigen<br />

Symbolen darstellen, solange durch den L<strong>in</strong>ker die richtige Position e<strong>in</strong>gefügt wird. Für Daten und<br />

Funktionen, die über ke<strong>in</strong>en anderen Weg angesprochen werden können, muss er ke<strong>in</strong>e zusätzlichen<br />

Symbole erzeugen. Das gilt somit nicht nur für die implizit angelegten Daten wie beispielsweise<br />

Zeichenketten, die der Compiler automatisch verwaltet, sondern auch für private (static) benutzerdef<strong>in</strong>ierte<br />

Datenstrukturen und Funktionen, die nicht von anderen Übersetzungse<strong>in</strong>heiten erreichbar<br />

s<strong>in</strong>d. Abbildung 4.7 zeigt e<strong>in</strong> e<strong>in</strong>faches Beispiel mit zwei privaten Funktionen. Beide werden mithilfe<br />

des Sektionssysmbols angesprungen. Die Auftrennung <strong>in</strong> verschiedene Module wird dabei auf zwei<br />

Arten erschwert:<br />

1. Der Compiler erzeugt ke<strong>in</strong>e expliziten Symbole für private Elemente. Dadurch ist das Auff<strong>in</strong>den<br />

der Modulgrenzen, also dem Ende e<strong>in</strong>er Funktion oder Datenstruktur, nicht mehr ohne<br />

zusätzliche Informationen möglich. Als zusätzliche Informationsquelle eignen sich hier Debug<strong>in</strong>formationen.<br />

Sie enthalten üblicherweise die benötigten Daten. Oft reicht auch das Übersetzen<br />

mit Debug<strong>in</strong>formationen aus, da der Compiler dann die gewünschten Symbole erzeugt, um die<br />

Fehlersuche zu vere<strong>in</strong>fachen.<br />

2. Wenn es gel<strong>in</strong>gt, die B<strong>in</strong>ärdaten <strong>in</strong> e<strong>in</strong>zelne Elemente zu untergliedern, müssen noch die Abhängigkeiten<br />

der potenziellen Module extrahiert werden. Viele Relokationen zeigen jedoch auf<br />

dasselbe Symbol. Es muss daher der Versatz ermittelt werden, um anschließend das Zielmodul<br />

zu bestimmen.<br />

Das ELF-Format sieht zwei Arten vor, Relokationen zu spezifizieren. Bei der e<strong>in</strong>en Art enthält<br />

e<strong>in</strong>e Relokation neben dem Zielsymbol zusätzlich e<strong>in</strong>en Versatz. Bei der anderen Art kann<br />

ke<strong>in</strong> Versatz mit angegeben werden. Welche Art verwendet wird, kann pr<strong>in</strong>zipiell der Compiler<br />

bestimmen, es haben sich jedoch architekturspezifische Standards etabliert 2 .<br />

Bei der ersten Art ist die Bestimmung der genauen Zielposition architekturunabhängig möglich,<br />

da der Versatz <strong>in</strong> standardisierten ELF-Datenstrukturen angegeben ist. Bei der zweiten Art ist<br />

zwar ke<strong>in</strong> Versatz <strong>in</strong> den ELF-Datenstrukturen angegeben, dennoch kann mit e<strong>in</strong>em Versatz<br />

gearbeitet werden. Dazu s<strong>in</strong>d für e<strong>in</strong>ige Architekturen Relokationstypen def<strong>in</strong>iert, bei denen<br />

die Zieladresse zu dem Wert an der Wirkungsposition addiert wird. Auf diese Art und Weise<br />

kann der Compiler auch hier e<strong>in</strong> Symbol für mehrere Ziele e<strong>in</strong>setzen. Um die exakte Zieladresse<br />

e<strong>in</strong>er Relokation zu ermitteln und damit das entsprechende Zielmodul zu bestimmen, müssen die<br />

architekturspezifischen Relokationstypen bekannt se<strong>in</strong> und analysiert werden.<br />

Compiler-Optimierung 2: direkte relative Sprünge<br />

E<strong>in</strong>e zweite Optimierung betrifft die Verwendung von Sprungbefehlen. Viele Architekturen unterstützen<br />

zwei Arten von Sprungzielen. Entweder e<strong>in</strong>e absolute Position, also die absolute Zieladresse, oder e<strong>in</strong>e<br />

relative Position, hierbei handelt es sich meistens um e<strong>in</strong>e positive oder negative Anzahl von Bytes, um<br />

die der aktuelle Befehlszähler verändert wird. Relative Sprünge benötigen oft weniger Platz, da häufig<br />

der Bereich, der angesprungen werden kann, e<strong>in</strong>geschränkt ist.<br />

Compiler, die möglichst kle<strong>in</strong>en Code erzeugen, werden daher relative Sprünge e<strong>in</strong>setzen, wenn dies<br />

möglich ist. Innerhalb e<strong>in</strong>er Sektion ist das auch häufig der Fall, da die Abstände oft kle<strong>in</strong> genug s<strong>in</strong>d.<br />

2 Der GCC für Intel x86 Plattformen verwendet Relokationen ohne explizit spezifizierten Versatz. Der GCC für Renesas H8<br />

oder Atmel AVR 8 Mikrocontroller erzeugt Relokationen mit Angaben zu e<strong>in</strong>em möglichen Versatz.<br />

52

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!