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.2 Modularisierung<br />

relativen Sprünge zwischen den Funktionen verwenden. Gleichzeitig kann er nicht e<strong>in</strong> Symbol für<br />

Sprünge oder Zugriffe auf mehreren Funktionen oder Daten verwenden.<br />

Wird jedes Element <strong>in</strong> e<strong>in</strong>er eigenen Sektion abgelegt, s<strong>in</strong>d somit die Verknüpfungen mit anderen<br />

Modulen vollständig sichtbar und durch die Relokationstabellen beschrieben. Außerdem s<strong>in</strong>d alle<br />

E<strong>in</strong>sprungpunkte durch Symbole gekennzeichnet.<br />

Als Nachteil dieses Verfahrens kann man anführen, dass e<strong>in</strong>ige Optimierungen nicht mehr durchgeführt<br />

werden. Das kann jedoch teilweise entkräftet werden. So kann beispielsweise e<strong>in</strong> entsprechender<br />

B<strong>in</strong>der (e<strong>in</strong> sogenannter relax<strong>in</strong>g L<strong>in</strong>ker) während des B<strong>in</strong>dens absolute Sprünge durch relative Sprünge<br />

ersetzen, falls es die Entfernung und der umgebende Code erlauben.<br />

Um jedes Element <strong>in</strong> e<strong>in</strong>e eigene Sektion abzulegen, gibt es zwei Möglichkeiten:<br />

• Viele Compiler lassen sich durch spezielle Anweisungen im Quellcode steuern. Man könnte<br />

somit für jede Funktion und jede Datenstruktur im Quellcode angeben, <strong>in</strong> welcher Sektion sie<br />

abgelegt werden soll 4 . Dieser Vorgang lässt sich auch automatisieren, beispielsweise durch den<br />

E<strong>in</strong>satz von Techniken der aspektorientierten Programmierung. Zu beachten ist allerd<strong>in</strong>gs, dass<br />

die Anweisungen im Quellcode compilerabhängig s<strong>in</strong>d.<br />

• Alternativ bieten die meisten Compiler von sich aus die Möglichkeit, e<strong>in</strong>zelne Sektionen für jede<br />

Funktion und Datenstruktur zu erzeugen. Meistens lässt sich dieses Verhalten durch e<strong>in</strong>en entsprechenden<br />

Aufrufparameter aktivieren 5 . Dieser Parameter ist zwar ebenfalls compilerabhängig,<br />

jedoch ist der Compileraufruf an sich für jeden Compiler anzupassen.<br />

Abbildung 4.9 zeigt anhand des e<strong>in</strong>fachen Beispiels, wie der Inhalt e<strong>in</strong>er B<strong>in</strong>ärdatei mit den entsprechenden<br />

Optionen übersetzt <strong>in</strong> e<strong>in</strong>zelne Sektionen aufgeteilt ist.<br />

4.2.5.3 Ergebnisse<br />

In diesem Abschnitt wurde e<strong>in</strong>e Möglichkeit vorgestellt, e<strong>in</strong>e Software <strong>in</strong> Module aufzuteilen. Ausgangspunkt<br />

waren dabei Objektdateien, wie sie zum Zeitpunkt des B<strong>in</strong>dens vorliegen. Ausgehend von<br />

der Struktur solcher Dateien wurden Sektionen als Module abgebildet. Es wurden anschließend zwei<br />

Möglichkeiten vorgestellt, Module für e<strong>in</strong>zelne Funktionen und Datenstrukturen zu erstellen.<br />

Bei der ersten Möglichkeit werden Elemente <strong>in</strong>nerhalb e<strong>in</strong>er Sektion anhand der Symbole identifiziert<br />

und zu Modulen transformiert. Es wurde gezeigt, dass dieses Vorgehen nicht ohne zusätzliche<br />

Informationen durchzuführen ist. Die zusätzlich benötigten Informationen können zum Teil automatisch<br />

generiert werden, teilweise ist jedoch e<strong>in</strong>e aufwendige Codeanalyse notwendig.<br />

Beim zweiten vorgestellten Verfahren wird der Compiler angewiesen, jede Funktion <strong>in</strong> e<strong>in</strong>e separate<br />

Sektion abzulegen. Anschließend kann jede Sektion <strong>in</strong> e<strong>in</strong> Modul überführt werden. Falls der Compiler<br />

4 Beim weit verbreiteten C-Compiler aus der GCC-Sammlung und bei Intels optimierendem Compiler für x86 (ICC) kann<br />

beim Prototyp e<strong>in</strong>er Funktion mit dem Attribut section die gewünschte Sektion ausgewählt werden. Zum Beispiel:<br />

void hello() __attribute__ ((section(".text.hello")));<br />

Bei Microsofts Visual C/C++ Compiler wird mit e<strong>in</strong>er pragma-Anweisung die Sektion der nachfolgenden Elemente<br />

bestimmt. Beispiel:<br />

#pragma code_seg(".text.hello")<br />

void hello() { /* Implementierung */ }<br />

5 Beim GNU C-Compiler führen die Kommandozeilenoptionen -ffunction-sections und -fdata-sections<br />

dazu, dass jede Funktion und jedes Datum <strong>in</strong> e<strong>in</strong>er eigenen Sektion abgelegt wird. Andere Compiler bieten ähnliche<br />

Optionen an. Der Microsoft Visual C/C++-Compiler beispielsweise erzeugt mit der Option /Gy e<strong>in</strong> ähnliches Resultat.<br />

55

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!