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 />

Außerdem stellt e<strong>in</strong>e Sektion für den Compiler e<strong>in</strong>e zusammenhängende untrennbare E<strong>in</strong>heit dar, die<br />

der B<strong>in</strong>der als Ganzes im Speicher des Zielsystems oder -prozesses platziert.<br />

Wenn der Compiler e<strong>in</strong>en relativen Sprung <strong>in</strong>nerhalb e<strong>in</strong>er Sektion verwenden kann, so kann er<br />

zusätzlich e<strong>in</strong>e weitere Optimierung durchführen. Unter der Annahme, dass e<strong>in</strong>e Sektion e<strong>in</strong> zusammenhängender<br />

Block ist, s<strong>in</strong>d der Abstand und die relative Position der Symbole <strong>in</strong>nerhalb e<strong>in</strong>er<br />

Sektion zue<strong>in</strong>ander konstant. Dies erlaubt dem Compiler, das Ziel des Sprungs direkt e<strong>in</strong>zutragen<br />

und ke<strong>in</strong>e Relokation zu verwenden. Abbildung 4.8 zeigt das Beispiel aus Abbildung 4.3 mit relativen<br />

Sprungbefehlen 3 .<br />

Abbildung 4.8: Sprungziel direkt als relativer Sprung <strong>in</strong>nerhalb der Sektion codiert<br />

Die Abbildung zeigt das e<strong>in</strong>fache Beispiel aus Abbildung 4.3 mit der Option -mshort-calls übersetzt. Der Aufruf<br />

von hello aus der Funktion foo ist deshalb mithilfe e<strong>in</strong>es relativen Sprungs realisiert. Da beide Funktionen <strong>in</strong>nerhalb<br />

derselben Sektion liegen, geht der Compiler davon aus, dass sich ihre Position zue<strong>in</strong>ander nicht verändert. Das<br />

Sprungziel ist daher immer 10 Byte vom Aufruf entfernt, der Compiler kann diese Information direkt e<strong>in</strong>tragen.<br />

Anhand der Relokationstabelle erkennt man nicht mehr, dass e<strong>in</strong>e Abhängigkeit zwischen foo und hello besteht.<br />

Da das Sprungziel nun nicht mithilfe e<strong>in</strong>er Relokation aufgelöst wird, kann die Abhängigkeit der<br />

beteiligten Funktionen nicht an der Relokationstabelle abgelesen werden. Daher wird beim Erstellen der<br />

Module, nach dem oben angegebenen Verfahren, die Abhängigkeit zwischen den beiden Modulen nicht<br />

erkannt. Werden die Module anschließend unabhängig vone<strong>in</strong>ander verwendet, ist nicht sichergestellt,<br />

dass die relative Position der beiden Funktionen zue<strong>in</strong>ander gleich bleibt. An den Modulen lässt sich<br />

auch nicht erkennen, dass zur korrekten Funktion des e<strong>in</strong>en Moduls das andere notwendig ist. Als Folge<br />

würde der Sprung an e<strong>in</strong>e falsche Adresse durchgeführt werden und unvorhersehbare Auswirkungen<br />

nach sich ziehen. Um diese Optimierung zu erkennen, müsste e<strong>in</strong>e Codeanalyse durchgeführt werden,<br />

um alle Sprungbefehle zu f<strong>in</strong>den und deren Position mit den vorhandenen Relokationen abzugleichen.<br />

E<strong>in</strong>e solche Analyse ist jedoch architekturspezifisch und aufwendig. Als Alternative müsste man<br />

sicherstellen, dass der Compiler diese Optimierung nicht durchführt.<br />

4.2.5.2 Kle<strong>in</strong>ere Sektionen durch Compiler<br />

E<strong>in</strong> anderer Ansatz, Module mit der Granularität von Funktionen und Datenstrukturen zu erstellen ist,<br />

jede Funktion und jede Datenstruktur <strong>in</strong> e<strong>in</strong>er eigenen Sektion abzulegen. Dadurch wird sichergestellt,<br />

dass die vorgestellten Optimierungen nicht zu Problemen führen. Da der Compiler ke<strong>in</strong> Wissen über<br />

die relativen Positionen der e<strong>in</strong>zelnen Funktionen und Datenstrukturen zue<strong>in</strong>ander hat, kann er ke<strong>in</strong>e<br />

3 Das Beispiel ist hierbei für e<strong>in</strong>en kle<strong>in</strong>eren Mikrocontroller aus der Atmel AVR Familie übersetzt worden. Der Datenspeicher<br />

dieses Typs ist nur 1 KByte groß, sodass der GCC hier immer relative Sprünge generiert.<br />

54

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!