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:31] grafsoftware:deep:dev:crosscompiler:linker32 [2014-02-10 12:57] graf
Zeile 65: Zeile 65:
   - The system runs from the RAM.   - The system runs from the RAM.
   - The base system is in the flash. Further classes are later loaded into the RAM. This case needs two system tables. The flash holds a system table which contains only classes which are present in the flash. The system table in the RAM must hold all classes. IMPORTANT This feature is not implemented yet IMPORTANT   - The base system is in the flash. Further classes are later loaded into the RAM. This case needs two system tables. The flash holds a system table which contains only classes which are present in the flash. The system table in the RAM must hold all classes. IMPORTANT This feature is not implemented yet IMPORTANT
-\\ 
-Die Methode ''void createSystemtable()'' erstellt die Systemtabelle. Diese ist als doppelt verkettete Liste realisiert und verwendet die selben von ''BlockEntry'' abgeleiteten Listenelemente wie die Konstantenblöcke der Klassen, zusätzlich noch die Klasse ''SysTabEntry''. Diese referenziert den Konstantenblock einer Klasse. 
  
-Die Systemtabelle hat den folgenden Aufbau: +In the compiler the system table is modeled as listas elements it uses the same blocks as for the constant block. Additionally ''SysTabEntry'' is used to reference the constant block of a class.
-[{{ .:systemtable.png?450&direct |//Aufbau der Systemtabelle// }}]+
  
-Bevor die Systemtabelle zusammengestellt werden kann, muss der Klassenkonstruktor der Kernel-Klasse gefunden werdenDazu wird der Klassennamen aus der Konfiguration geladen und anschliessend die Methode ''<clinit>'' gesucht.+The structure of the system table is: 
 +[{{ .:systemtable.png?450&direct |//Structure of the system table// }}]
  
-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.+First, the 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 addedFor each class the address of the constant block must be enteredThe table ends with the value 0.
  
-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 Klassen. Arrays und Interfaces haben keinen Konstantenblock und kommen nicht in die Liste mit Ausnahme von Interfacesdie einen Klassenkonstruktor haben, siehe //Interfacemethoden// in [[type_descriptor]]+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 afterwards. Arrays and interfaces have no constant block and are not listed. The exception to this rule are interfaces with class constructorsee [[.:interfaces|Interfaces]].
-\\ +
-Beim MPC555 wird die Systemtabelle in der Dual-Mapped-Section direkt nach dem Exceptioncode positioniert (Addresse 0x2000 -> siehe Memory Map).+
  
-===== Memory Map fixieren ===== +===== Fix Memory Map ===== 
-[{{  .:linker_code.png?300px&direct|Maschinencode: Grösse und Offsets}}] +[{{  .: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 werden. Das 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 Code, die statischen Variablen und der Konstantenblock jeder Klasse und auch die Systemtabelle und die globale Konstantentabelle platziert sind, werden nun die absoluten Adressen berechnet. Dazu steht die Methode ''void calculateAbsoluteAddresses(Class)'' bereit. 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 berechnet. Dazu steht die Methode ''void calculateAbsoluteAddresses(Class)'' bereit.
 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. 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.