Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
software:deep:dev:crosscompiler:linker32 [2014-02-10 11:17] – graf | software:deep:dev:crosscompiler:linker32 [2014-02-10 13:21] – graf | ||
---|---|---|---|
Zeile 76: | Zeile 76: | ||
===== Fix Memory Map ===== | ===== Fix 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 ('' | + | 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 ('' |
- | 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 |
- | \\ Achtung: Ganz zu Beginn müssen Systemmethoden, | + | |
- | ===== Absolute | + | ===== Calculate |
- | 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 | + | First, the addresses of static fields are fixed. For this the linker traverses the list '' |
- | In einem ersten Schritt werden die Adressen für die statischen Felder bestimmt. Dazu läuft der Linker durch die entsprechende Liste ('' | + | |
- | 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 ('' | + | ===== Refresh Constant Block ===== |
+ | After calculating absolute addresses the constant block has to be refreshed. | ||
- | 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 werden. Dazu legt die Methode '' | + | Finally, the target image is put together. For each method of each class and for each constant block (one for each class, array or interface) a target segment is created and inserted into a list. |
- | ===== Globale Konstantentabelle erstellen ===== | ||
- | In der globalen Konstantentabelle werden Konstanten gespeichert, | ||
- | ===== 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 '' | ||
- | |||
- | **Bemerkung: | ||
- | |||
- | ==== Klassen [Class] ==== | ||
- | * //index//: Wird verwendet, um Interfaces für Interfacemethoden zu nummerieren. | ||
- | * //offset//: Wird nicht verwendet, ist immer -1. | ||
- | * // | ||
- | |||
- | ==== Arrays [Array] ==== | ||
- | * //index//: Wird nicht verwendet, ist immer -1. | ||
- | * //offset//: Offset des Typdescriptors im Segment. | ||
- | * // | ||
- | |||
- | ==== 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. | ||
- | * // | ||
- | |||
- | ==== Felder [DataItem] ==== | ||
- | <box right 30% | IMPORTANT Konstante Referenzen> | ||
- | **Achtung: | ||
- | |||
- | **Beispiel: | ||
- | static final Object o = new Object(); | ||
- | </ | ||
- | - **Klassen-Felder [DataItem]: | ||
- | - Konstante Felder [NamedConst]: | ||
- | * //index//: Wird nicht verwendet, ist immer -1; | ||
- | * //offset//: 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). | ||
- | * // | ||
- | - **Instanz-Felder [DataItem]: | ||
- | * //index//: Wird nicht verwendet, ist immer -1; | ||
- | * //offset//: Byteoffset des Feldes beginnend bei 0 (inkl. Berücksichtung der Felder der Oberklassen). | ||
- | * // | ||
- | |||
- | ==== 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; | ||
- | * // | ||
- | - **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. | ||
- | * // |