Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | Nächste ÜberarbeitungBeide Seiten der Revision |
software:deep:dev:crosscompiler:linker32 [2014-02-10 11:17] – graf | software:deep:dev:crosscompiler:linker32 [2014-02-10 12:57] – graf |
---|
| |
===== 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 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. | In this step the code is placed in the memory, as well as the class variables and the constants. First, 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 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 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. |
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 segments. This leads to holes. Such holes could be eliminated by a more efficient allocation, which 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 Segment. Diese Löcher können durch eine effizientere Allokation eliminiert werden, was 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. |