Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
software:deep:dev:crosscompiler:linker32 [2014-02-10 10:35] grafsoftware:deep:dev:crosscompiler:linker32 [2014-02-10 13:19] graf
Zeile 71: Zeile 71:
 [{{ .:systemtable.png?450&direct |//Structure of the system table// }}] [{{ .:systemtable.png?450&direct |//Structure of the system table// }}]
  
-Bevor die Systemtabelle zusammengestellt werden kannmuss der Klassenkonstruktor der Kernel-Klasse gefunden werdenDazu wird der Klassennamen aus der Konfiguration geladen und anschliessend die Methode ''<clinit>'' gesucht.+Firstthe class constructor of the class kernel must be foundFor this, the class name of the kernel is fetched from the configuration and the method //<clinit>// is searched. Then, the table can be built. The offset to the addresses with the constant blocks is placed at the beginning. Heap and stack information is added. For each class the address of the constant block must be entered. The table ends with the value 0.
  
-Nun kann die Systemtabelle aufgebaut werdenDazu wird als erstes der Offset zum Beginn der Klassenliste (Liste mit der Basisadresse des Konstantenblocks jeder Klasse) eingefügtAnschliessend werden die Informationen zu Heap und Stack eingefügtAnschliessend die Anzahl vorhandener Klassen und die bereits erwähnte Liste mit den Basisadressen der KonstantenblöckeDie Systemtabelle wird mit dem Wert 0x0 abgeschlossen.+The references to the constant blocks are assembled as followsFirst come the classes with class constructorsThese classes are already sorted in correct order as described in [[class_initialization]]Classes without initialization follow afterwardsArrays and interfaces have no constant block and are not listed. The exception to this rule are interfaces with class constructor, see [[.:interfaces|Interfaces]].
  
-Der letzte Teil mit den Referenzen auf den Konstantenblock der einzelnen Klassen ist wie folgt zusammengestelltZuerst kommen alle Klassen mit einem KlassenkonstruktorDiese Klassen sind bereits in der korrekten Reihenfolge gemäss [[class_initialization]sortiertAnschliessend kommen alle nicht-initialisierten KlassenArrays und Interfaces haben keinen Konstantenblock und kommen nicht in die Liste mit Ausnahme von Interfacesdie einen Klassenkonstruktor habensiehe //Interfacemethoden// in [[type_descriptor]]+===== Fix Memory Map ===== 
-\\ +[{{  .:linker_code.png?350px&direct|Fixing the memory map}}] 
-Beim MPC555 wird die Systemtabelle in der Dual-Mapped-Section direkt nach dem Exceptioncode positioniert (Addresse 0x2000 -> siehe Memory Map).+In this step the code is placed in the memory, as well as the class variables and the constantsFirst, each class is assigned a memory segment for the code (''Class.codeSegment'')class variables (''Class.varSegment'') and constants (''Class.constSegment''). Which segments to use can be read from the configuration. The linker traverses the possible segments and choses a suitable one. While doing thisthe used space of each segment is stored (''Segment.usedSize'') and the appropriate offsets are set (''Class.codeOffset'', ''Class.varOffset'' and ''Class.constOffset''). Arrays and interfaces must be handled as well. Further, the size of the segment for the system table has to be set and also the size of the segment for the global constant table.  
 +Now, the base address of each used segment can be determined. \\ 
 +IMPORTANT System methods with offsets given by the configuration must be placed in their appropriate segments. This leads to holes. Such holes could be eliminated by a more efficient allocation, which is currently not done.
  
-===== Memory Map fixieren ===== +===== Calculate Absolute Addresses ===== 
-[{{  .:linker_code.png?300px&direct|Maschinencode: Grösse und Offsets}}] +Firstthe addresses of static fields are fixedFor this the linker traverses the list ''Class.classFields'' and sets ''Item.address''This address has only to be set for non-constant fieldsNextthe addresses of methods are setHere again, methods which are placed at absolute position by the configuration must be handled separatelyThird, addresses of the constants in the constant pool and strings in the string pool can be fixedTo concludethe address of the class itself (''Class.address''will be set to the field //size// in the type descriptor.
-Das Platzieren des Codesder statischen Variablen und der Konstanten im Speicher geschieht wie folgtAls erstes wird jeder Klasse ein Memory-Segment für den Code (''Class.codeSegment''), die statischen Variablen (''Class.varSegment'') und die Konstanten (''Class.constSegment'') zugeteiltWelche Segmente das sindwird der Konfiguration entnommenDabei läuft der Linker rekursiv durch die möglichen Segmente und wählt das erste passende ausWährend dieser Zuteilung wird der im Segment benutzte Platz gespeichert (''Segment.usedSize'') und der entsprechende Offset (''Class.codeOffset''''Class.varOffset'' und ''Class.constOffset'') zugeteilt. Auch für jedes Array und für jedes benötigte Interface wird ein Segment (''Class.constSegment''für den Typedescriptor gesucht und der Offset (Array.offset, Class.offset) gesetzt. +
-Anschliessend wird die verwendete Grösse auch noch für das Systemtabellen-Segment gesetzt und das Speichersegment für die globale Konstantentabelle festgelegt. +
-In einem weiteren Schritt wird die Grösse für jedes verwendete Segment festgelegt (sofern nicht bereits in der Konfiguration vorgegeben). Nun kann für jedes verwendete Segment die Basisadresse berechnet werden. +
-\\ Achtung: Ganz zu Beginn müssen Systemmethoden, die einen in von Konfiguration gegebenen Offset haben (Exception-Handlers), bereits im passenden Segment platziert werden. Das führt zu "Löchern" in diesem Segment. Diese Löcher können durch eine effizientere Allokation eliminiert werden, was aber zur Zeit nicht gemacht ist.+
  
-===== Absolute Adressen berechnen ===== +===== Refresh Constant Block ===== 
-Nachdem der Code, die statischen Variablen und der Konstantenblock jeder Klasse und auch die Systemtabelle und die globale Konstantentabelle platziert sind, werden nun die absoluten Adressen berechnetDazu steht die Methode ''void calculateAbsoluteAddresses(Class)'' bereit. +After calculating absolute addresses the constant block has to be refreshed ''void updateConstantBlock(Class)'' fixes the base address of the code (//codeBase//)After this the base address of the class variables (''varBase''and their size (''varSize''is writtenAs a last step the size of an object of this class (field //size//) in the type descriptor is written.
-In einem ersten Schritt werden die Adressen für die statischen Felder bestimmt. Dazu läuft der Linker durch die entsprechende Liste (''Class.classFields''durch und berechnet die absolute Adresse (''Item.address''). Die Adresse wird nur bei nicht konstanten Feldern gesetzt. +
-Im nächsten Schritt werden die Adressen der Methoden berechnet. Dabei müssen die durch die Konfiguration absolut positionierten Methoden (Exception-Handlers)wiederum speziell behandelt werden. +
-Als drittes werden die Adressen für die Konstanten im //Constant pool// und die Strings im //String pool// berechnet.+
  
-Als letztes wird noch die Adresse der Klasse selbst (''Class.address'') auf den Eintrag //size// im Typ-Deskriptor gesetzt.+===== Create Global Constant Table ===== 
 +This table holds constants which do not belong to a specific classTo give an example: Certain constants are needed to convert an //int// to a //float//.
  
-Diese Methode muss vom //Launcher// für jede Klasse aufgerufen werden. +===== Create Target Image ===== 
- +Finally, the target image is put togetherFor each method of each class and for each constant block (one for each classarray or interfacea target segment is created and inserted into a list.
-===== Konstantenblock aktualisieren ===== +
-Nach dem Festlegen der Adressen kann nun der Konstantenblock aktualisiert werden. Dazu legt die Methode ''void updateConstantBlock(Class)'' als erstes die Basisadresse des Codes (//codeBase//) fest. Anschliessend werden auch noch die Basisadresse für die Klassen-Variablen (''varBase'') und die Gesamtgrösse der Klassen-Variablen (''varSize'') festgelegt. Als letztes wird noch die Grösse eines Objektes der Klasse (//size//) im Type descriptor aktualisiert. +
- +
-===== Globale Konstantentabelle erstellen ===== +
-In der globalen Konstantentabelle werden Konstanten gespeichert, die nicht zu einer Klasse gehören, sondern z.B. zur Laufzeit für die Konvertierung von //int// zu //float// verwendet werden. +
- +
-===== Target Image erstellen ===== +
-Zum Schluss wird das Target Image erstelltDabei wird für jede Methode jeder Klasse und für Konstantenblock (einer pro KlasseArray oder Interfaceje ein TargetSegment erzeugt und in einer Liste abgelegt+
  
 ---- ----