Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
software:deep:dev:crosscompiler:linker32 [2014-02-10 11:17] grafsoftware:deep:dev:crosscompiler:linker32 [2014-02-10 13:21] graf
Zeile 76: Zeile 76:
  
 ===== Fix Memory Map ===== ===== Fix Memory Map =====
-[{{  .:linker_code.png?350px&direct|Fix the memory map}}] +[{{  .:linker_code.png?350px&direct|Fixing the memory map}}] 
-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 sind, wird 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''zugeteiltAuch 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.offsetClass.offset) gesetzt+In this step the code is placed in the memoryas 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 configurationThe linker traverses the possible segments and choses a suitable oneWhile doing this, the 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 wellFurtherthe size of the segment for the system table has to be set and also the size of the segment for the global constant table.  
-Anschliessend wird die verwendete Grösse auch noch für das Systemtabellen-Segment gesetzt und das Speichersegment für die globale Konstantentabelle festgelegt. +Now, the base address of each used segment can be determined. \\ 
-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. +IMPORTANT System methods with offsets given by the configuration must be placed in their appropriate segmentsThis leads to holesSuch holes could be eliminated by a more efficient allocationwhich is currently not done.
-\\ Achtung: Ganz zu Beginn müssen Systemmethoden, die einen in von Konfiguration gegebenen Offset haben (Exception-Handlers), bereits im passenden Segment platziert werdenDas führt zu "Löchern" in diesem SegmentDiese Löcher können durch eine effizientere Allokation eliminiert werdenwas aber zur Zeit nicht gemacht ist.+
  
-===== Absolute Adressen berechnen ===== +===== Calculate Absolute Addresses ===== 
-Nachdem der Codedie 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. +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 fields. Next, the addresses of methods are set. Here again, methods which are placed at absolute position by the configuration must be handled separately. Third, addresses of the constants in the constant pool and strings in the string pool can be fixed. To conclude, the address of the class itself (''Class.address''will be set to the field //size// in the type descriptor.
-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.+===== Refresh Constant Block ===== 
 +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 written. As a last step the size of an object of this class (field //size//) in the type descriptor is written.
  
-Diese Methode muss vom //Launcher// für jede Klasse aufgerufen werden.+===== Create Global Constant Table ===== 
 +This table holds constants which do not belong to a specific class. To give an example: Certain constants are needed to convert an //int// to a //float//.
  
-===== Konstantenblock aktualisieren ===== +===== Create Target Image ===== 
-Nach dem Festlegen der Adressen kann nun der Konstantenblock aktualisiert werdenDazu 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.+Finally, the target image is put togetherFor each method of each class and for each constant block (one for each class, array or interfacea target segment is created and inserted into a list.
  
-===== 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 erstellt. Dabei wird für jede Methode jeder Klasse und für Konstantenblock (einer pro Klasse, Array oder Interface) je ein TargetSegment erzeugt und in einer Liste abgelegt.  
- 
----- 
- 
-===== Verwendung von index, offset und address der Klasse Item ===== 
-Die Felder //index//, //offset// und //address// der Klasse ''ch.ntb.inf.deep.classItems.Item'' werden, je nach dem was Item repräsentiert, anders verwendet. Die untenstehende Liste gibt einen Überblick, wann welches Feld wie verwendet wird. 
- 
-**Bemerkung:** Angaben in Eckigen Klammern bezeichnen den Typ. Beispiel: [Class] bedeutet das dieses Objekt vom Typ ''ch.ntb.inf.deep.classItems.Class'' ist. 
- 
-==== Klassen [Class] ==== 
-  * //index//: Wird verwendet, um Interfaces für Interfacemethoden zu nummerieren. 
-  * //offset//: Wird nicht verwendet, ist immer -1. 
-  * //address//: Die absolute Adresse des Typdescriptors (des Eintrags //size//). 
- 
-==== Arrays [Array] ==== 
-  * //index//: Wird nicht verwendet, ist immer -1. 
-  * //offset//: Offset des Typdescriptors im Segment. 
-  * //address//: Die absolute Adresse des Typdescriptors. 
- 
-==== Methoden [Method] ==== 
-  * //index//: Bei Instanzmethoden der Index der Methode in der Methodentabelle (beginnend bei 0). Bei Klassenmethoden ist //index// immer -1. -> Wird vom CFR gesetzt. 
-  * //offset//: Byteoffset der Methode ausgehend von der Startadresse des Codes der Klasse. 
-  * //address//: Absolute Adresse der Methode. 
- 
-==== Felder [DataItem] ==== 
-<box right 30% | IMPORTANT Konstante Referenzen> 
-**Achtung:** bei konstanten, statischen Referenzen ist das Const-Flag (dpfConst) __nicht__ gesetzt, da diese wie normale, nicht konstante statische Felder zu behandeln sind. Dies weil auf solche Felder ein einmaliger Zugriff aus dem Klassenkonstruktor stattfindet! 
- 
-**Beispiel:** 
-  static final Object o = new Object(); 
-</box> 
-  - **Klassen-Felder [DataItem]:** 
-    - Konstante Felder [NamedConst]: 
-      * //index//: Wird nicht verwendet, ist immer -1; 
-      * //offset//: Wird nicht verwendet, ist immer -1; 
-      * //address//: Wird nicht verwendet, ist immer -1; 
-    - Nicht konstante Felder [DataItem]: 
-      * //index//: Wird nicht verwendet, ist immer -1. 
-      * //offset//: Byteoffset des Feldes (beginnend bei 0 für das erste Feld). 
-      * //address//: Absolute Adresse des Feldes. 
-  - **Instanz-Felder [DataItem]:** 
-    * //index//: Wird nicht verwendet, ist immer -1; 
-    * //offset//: Byteoffset des Feldes beginnend bei 0 (inkl. Berücksichtung der Felder der Oberklassen). 
-    * //address//: Wird nicht verwendet, ist immer -1; 
- 
-==== Konstanten [Constant] ==== 
-  - **Zahlen [StdConstant]:** 
-    * //index//: Wenn die Konstante vom Typ //float// oder //double// ist, ist //index// der Index der Konstante im Konstantenpool. Ansonsten immer -1; 
-    * //offset//: Wenn die Konstante vom Typ //float// oder //double// ist, ist //offset// der Byteoffset der Konstante im Konstantenpool. Ansonsten immer -1; 
-    * //address//: Wenn es sich um eine Konstante vom Typ //float// oder //double// handelt, ist //address// die absolute Adresse der Konstante (direkt im Konstantenblock). Ansonsten immer -1. 
-  - **Stings [StringLiteral]:** 
-    * //index//: Wenn es sich bei der Konstante um einen String handelt, so wird in //index// der Index des Strings im Stringpool abgelegt. 
-    * //offset//: Wenn es sich bei der Konstante um einen String handelt, so wird in //offset// der Byteoffset des Strings im Stringpool abgelegt. 
-    * //address//: Absolute Adresse des konstanten Strings (direkt im Konstantenblock).