Speichermodell
Im Programmierumfeld betrachten wir vier Speichersegmente:
- Code-Segement (auch Text-Segment genannt)
- Data-Segment
- Heap
- Stack
Im Data-Segement befinden sich die Daten, die über die gesammte Programmlaufzeit erhalten bleiben (globale und statische Variablen). Es besteht aus einem const-Bereich, und je einem Bereich für initialisierte und nicht-initialisierte Daten.
Das Heap-Segment ist gleichbedeutend mit dem freien Arbeitsspeicher, der zur Laufzeit allokiert werden kann.
Das Stack-Segment ist ein LIFO (Kellerspeicher) und nur durch push/pop , aber nicht wahlfrei zugreifbar. Auf dem Stack werden lokale Daten abgelegt, sowie Rücksprungadressen und Parameter von Funktionen.
Ablauf der Speicherzugriffe eines Programmes:
- nach compiling/binding -> load des Programmes (in den Prozessorspeicher)
- Loader legt Maschinenbefehle ins Code-Segment
- Instruktionszeiger zeigt auf den ersten auszuführenden Befehl im Code-Segment
- Programm im Code-Segment wird linear abgearbeitet.
- erfolgt ein Funktionsaufruf, wird in die entsprechende Stelle im Code-Segment gesprungen - der letzte Instruktionszeigerwert(Rücksprungadresse) wird auf dem Stack gelegt und die Einsprungadresse in den Instruktionszeiger geladen.
- beim Verlassen der Funktion wird die alte Adresse vom Stack geholt und das Programm bei der nächsten folgenden Adresse fortgesetzt.
- Über den Stack können auch Parameter an die Funktion übergeben oder Return-Werte an das Hauptprogramm zurück gegeben werden.
- Variablenübergaben (bei C/C++) erfolgen durch Übergabe der Werte, indem die Werte auf den Stack geschrieben werden. Entweder durch Schreiben des Wertes (primitive Datentypen) oder Aufruf des Copy-Konstruktors (Objekte und Klassen) -> Call-by-Value
- Möchte man Call-by-Reference einsetzen, muss man explizit Zeiger oder Referenzen übergeben.
Labels: Embedded Systems, tech talk
0 Kommentare:
Kommentar veröffentlichen
Abonnieren Kommentare zum Post [Atom]
<< Startseite