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 09:48] grafsoftware:deep:dev:crosscompiler:linker32 [2014-02-10 11:17] graf
Zeile 54: Zeile 54:
  
  
-===== Grösse und Offsets berechnen ===== +===== Calculate Size and Offsets ===== 
-[{{  .:linker_code_methods.png?300px&direct|MaschinencodeGrösse und Offsets}}] +[{{  .:linker_code_methods.png?350px&direct|Machine CodeSize and Offsets}}] 
-Bevor die Memory Map fixiert werden kannmüssen noch ein paar Grössen und Offsets pro Standard-Klasse berechnet werden+Before the memory map can be fixeda couple sizes and offsets must be calculated for each class
-  * ''void calculateCodeSizeAndOffsets(Class)'': Diese Methode berechnet die Grösse des Maschinencodes für die gesamte Klasse und setzt das Feld ''offset'' jeder Methode dieser KlasseDieses beschreibt den Byte-Offset des Maschinencodes einer Methode im Speicher ausgehend von der Startaddresse des Codes der KlasseWenn der Offset einer Methode direkt von der Konfiguration vorgegeben ist (für Exception-Handler-Codewird diese Methode nicht in die Berechnung der Codegrösse miteinbezogenDer durch die Konfiguration vorgegebene Offset bezieht sich nicht auf die Basis einer Klasse, sondern auf die Basis des zugehörigen Segmentes+  * ''void calculateCodeSizeAndOffsets(Class)'': This methods determines the size of the machine code of the whole class and sets the field //offset// of each method of this class//offset// is the byte offset of the machine code of a method in the memory starting from the start address of the code of this classIf a method offset is given by the configuration (e.g. exception handlers), then this method is not included in the culculation of the code sizeThe offset given by the configuration is not relative to the base of a class but to the base of the appropriate segment
-  * ''void calculateGlobalConstantTableSize()'': Berechnet die Grösse der globalen Konstanten-Tabelle.+  * ''void calculateGlobalConstantTableSize()'': This method calculates the size of the global constant table.
  
-===== Systemtabelle erstellen ===== +===== Create System Table ===== 
-Der Linker stellt für das gesamte System eine Systemtabelle zusammenDiese muss an eine fixe Adresse geladen werden und enthält wichtige Informationen für das LaufzeitsystemGrundsätzlich muss dabei zwischen drei Fällen unterschieden werden+The linker assembles a system table for the whole system. This table must be loaded to a prefixed address in the target system and holds information for the [[..:rts:start|Runtime System]]. Various settings must be handled
-  - Das gesamte System befindet sich im Flash. +  - The system runs from the flash 
-  - Das gesamte System befindet sich im Ram+  - The system runs from the RAM
-  - Das Basissystem befinden sich im FlashWeitere Klassen werden nachträglich ins Ram geladenFür diesen Fall werden zwei Systemtabellen benötigtIm Flash befindet sich eine Systemtabelle, welche nur die Klassen im Flash abdecktIm RAM hingegen befindet sich eine Systemtabelle, die sowohl die Klassen im RAM als auch die im Flash abdeckt-> IMPORTANT Dies ist zur Zeit noch nicht implementiert IMPORTANT +  - The base system is in the flashFurther classes are later loaded into the RAMThis case needs two system tablesThe flash holds a system table which contains only classes which are present in the flashThe 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|Fix the memory map}}]
 Das Platzieren des Codes, der statischen Variablen und der Konstanten im Speicher geschieht wie folgt. Als erstes wird jeder Klasse ein Memory-Segment für den Code (''Class.codeSegment''), die statischen Variablen (''Class.varSegment'') und die Konstanten (''Class.constSegment'') zugeteilt. Welche Segmente das sind, wird der Konfiguration entnommen. Dabei läuft der Linker rekursiv durch die möglichen Segmente und wählt das erste passende aus. Wä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. Das Platzieren des Codes, der statischen Variablen und der Konstanten im Speicher geschieht wie folgt. Als erstes wird jeder Klasse ein Memory-Segment für den Code (''Class.codeSegment''), die statischen Variablen (''Class.varSegment'') und die Konstanten (''Class.constSegment'') zugeteilt. Welche Segmente das sind, wird der Konfiguration entnommen. Dabei läuft der Linker rekursiv durch die möglichen Segmente und wählt das erste passende aus. Wä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. Anschliessend wird die verwendete Grösse auch noch für das Systemtabellen-Segment gesetzt und das Speichersegment für die globale Konstantentabelle festgelegt.