Datensegment
Im Computer, a Datensegment (oft bezeichnet .Daten) ist ein Teil eines Objektdatei oder die entsprechende Adressraum eines Programms, das initialisiert enthält Statische Variablen, das ist, globale Variablen und Statische lokale Variablen. Die Größe dieses Segments wird durch die Größe der Werte im Quellcode des Programms bestimmt.
Das Datensegment wird gelesen/schreiben, da die Werte von Variablen zur Laufzeit geändert werden können. Dies steht im Gegensatz zu der schreibgeschützte Datensegment ( Rodata Segment oder .Rodata), die eher statische Konstanten als Variablen enthält; es steht auch im Gegensatz zu der Codesegmentauch als Textsegment bekannt, das bei vielen Architekturen nur schreibgeschützt ist. Nicht initialisierte Daten, sowohl Variablen als auch Konstanten, sind stattdessen in der BSS -Segment.
Um in der Lage zu sein, Speicheradressräume zu unterstützen, die größer als die native Größe des internen Adressregisters sind, würde die frühe CPUs ein Segmentierungssystem implementieren, bei dem sie eine kleine Reihe von Indizes speichern würden, die als Offsets für bestimmte Bereiche verwendet werden können. Das Intel 8086 Die CPU -Familie stellte vier Segmente zur Verfügung: das Codesegment, das Datensegment, das Stapelsegment und das zusätzliche Segment. Jedes Segment wurde an einem bestimmten Ort im Speicher von der ausführten Software platziert, und alle Anweisungen, die auf den Daten in diesen Segmenten betrieben wurden, wurden relativ zum Beginn dieses Segments durchgeführt. Dies ermöglichte ein 16-Bit-Adressregister, das normalerweise auf 64 KB Speicherplatz zugreifen könnte, um auf 1 MB Speicherplatz zuzugreifen.
Diese Segmentierung des Speicherraums in diskrete Blöcke mit spezifischen Aufgaben, die in die Programmiersprachen des Tages übertragen werden, und das Konzept wird in modernen Programmiersprachen immer noch weit verbreitet.
Programmspeicher
Ein Computerprogrammspeicher kann weitgehend in zwei Abschnitte eingeteilt werden: nur schreibgeschützt und lesen/schreiben. Diese Unterscheidung wuchs aus frühen Systemen, die ihr Hauptprogramm in der Haltung des Hauptprogramms haben Nur-Lese-Speicher wie zum Beispiel Mask ROM, Eprom, ABSCHLUSSBALL oder Eeprom. Als Systeme komplexer wurden und Programme aus anderen Medien in RAM geladen wurden, anstatt von ROM auszuführen, wurde die Idee, dass einige Teile des Programms des Programms nicht geändert werden sollten, beibehalten werden. Diese wurden zum .Text und .Rodata Segmente des Programms und der Rest, der für bestimmte Aufgaben in eine Reihe anderer Segmente unterteilt werden könnte.
Code
Das Codesegment, auch bekannt als Textsegment, enthält ausführbar Code und ist im Allgemeinen schreibgeschützte und feste Größe.
Daten

Das Datensegment Enthält initialisierte statische Variablen, d. H. Globale Variablen und lokale statische Variablen, die einen definierten Wert haben und geändert werden können. Beispiele in C sind:
int i = 3; char a [] = "Hallo Welt";
Die Werte für diese Variablen werden zunächst im schreibgeschützten Speicher gespeichert (normalerweise innerhalb des Codesegments) und während der Startroutine des Programms in das Datensegment kopiert.
BSS
Das BSS -Segment Enthält nicht initialisierte statische Daten, sowohl Variablen als auch Konstanten, d. H. Globale Variablen und lokale statische Variablen, die auf Null initialisiert werden oder keine explizite Initialisierung im Quellcode haben. Beispiele in C sind:
statische Int I; statischer Char A [12];
Haufen
Das Heap -Segment Enthält ein dynamisch zugewiesenes Speicher, beginnt üblicherweise am Ende des BSS -Segments und wächst von dort aus zu größeren Adressen. Es wird von verwaltet von Malloc, calloc, realloc und frei, die das verwenden können BRK und SBRK Systemaufrufe, um die Größe anzupassen (Beachten Sie, dass die Verwendung von BRK/SBRK und einem einzelnen Heap -Segment nicht erforderlich ist MMAP/Munmap zur Reservierung/Unreferation potenziell nicht zusammenhängende Regionen des virtuellen Gedächtnisses in den Prozess ' Virtueller Adressraum). Das Heap -Segment wird von allen Threads, gemeinsam genutzten Bibliotheken und dynamisch geladenen Modulen in einem Prozess gemeinsam genutzt.
Stapel
Das Stapelsegment enthält die Rufen Sie Stack an, a LIFO Struktur, typischerweise in den höheren Teilen des Speichers. Ein "Stackzeiger" -Register verfolgt die Oberseite des Stapels. Es wird jedes Mal eingestellt, wenn ein Wert auf den Stapel "gedrückt" wird. Der Satz von Werten, der für einen Funktionsaufruf gedrückt wird, wird als "Stack -Frame" bezeichnet. Ein Stapelrahmen besteht zum Minimum einer Absenderadresse. Automatische Variablen werden auch auf dem Stapel zugewiesen.
Das Stapelsegment angrenzte traditionell an das Heap -Segment und sie wuchsen zueinander; Als der Stapelzeiger den Haufenzeiger traf, war der freie Speicher erschöpft. Mit großen Adressräumen und virtuellen Gedächtnistechniken werden sie tendenziell freier platziert, aber sie wachsen normalerweise in einer konvergierenden Richtung. Auf dem Standard -PC x86 Architektur Der Stapel wächst in Richtung Null, was bedeutet, dass neuere Elemente, die tiefer in der Anrufkette sind, numerisch niedrigere Adressen und näher am Haufen sind. Bei einigen anderen Architekturen wird es in die entgegengesetzte Richtung.
Interpretierte Sprachen
Einige interpretierte Sprachen bieten insbesondere eine ähnliche Einrichtung wie das Datensegment Perl[1] und Rubin.[2] In diesen Sprachen, einschließlich der Linie __DATEN__
(Perl) oder __ENDE__
(Ruby, Old Perl) markiert das Ende des Codesegments und den Beginn des Datensegments. Nur der Inhalt vor dieser Zeile wird ausgeführt, und der Inhalt der Quelldatei nach dieser Zeile ist als Dateiobjekt verfügbar: Paket :: Daten
in Perl (z. B.,, Hauptinformationen
) und DATEN
in Ruby. Dies kann als Form von betrachtet werden Hier Dokument (eine Leiterin).
Siehe auch
- Segmentierung (Speicher)
- Segmentierungsfehler
- Linker (Computing)
- Codesegment
- .bss
- Nicht initialisierte Variable
- Stack (abstrakter Datentyp)
- Prozesssteuerungsblock
Verweise
- ^ PERLDATA: Spezielle Literale
- ^ Ruby: Objekt: __ENDE__
Externe Links
- "C Startup". bravegnu.org.
- "mem_sequence.c - listet nacheinander Speicherregionen in einem Prozess auf". Archiviert von das Original am 2009-02-02.
- Van der Linden, Peter (1997). Experte C -Programmierung: Deep C -Geheimnisse (PDF). Prentice Hall. S. 119ff.