Datensegment - Data segment

In der Berechnung wird ein Datensegment (oft bezeichnet .data ) ist ein Abschnitt einer Objektdatei oder der entsprechenden Adressraum eines Programms , das initialisierte 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 und ändert sich zur Laufzeit nicht .

Das Datensegment kann gelesen/geschrieben werden, da die Werte von Variablen zur Laufzeit geändert werden können. Dies steht im Gegensatz zum schreibgeschützten Datensegment ( rodata- Segmentoder.rodata), das statische Konstanten anstelle von Variablen enthält; es steht auch im Gegensatz zumCodesegment, auch als Textsegment bekannt, das auf vielen Architekturen schreibgeschützt ist. Nicht initialisierte Daten, sowohl Variablen als auch Konstanten, befinden sich stattdessen imBSS-Segment.

Um in der Lage zu sein, Speicheradressräume zu unterstützen, die größer als die native Größe des internen Adressregisters sind, implementierten frühere CPUs ein Segmentierungssystem, bei dem sie einen kleinen Satz von Indizes speicherten, um sie als Offsets für bestimmte Bereiche zu verwenden. Die Intel 8086- CPU-Familie stellte vier Segmente bereit: das Code-Segment, das Daten-Segment, das Stack-Segment und das Extra-Segment. Jedes Segment wurde durch die ausgeführte Software an einer bestimmten Stelle im Speicher platziert, und alle Anweisungen, die an den Daten innerhalb dieser Segmente arbeiteten, wurden relativ zum Anfang dieses Segments ausgeführt. Dadurch konnte ein 16-Bit-Adressregister, das normalerweise auf 64 KB Speicherplatz zugreifen könnte, auf 1 MB Speicherplatz zugreifen.

Diese Aufteilung des Speicherplatzes in diskrete Blöcke mit spezifischen Aufgaben wird in die Programmiersprachen der Zeit übertragen und das Konzept ist in modernen Programmiersprachen noch weit verbreitet.

Programmspeicher

Ein Computerprogrammspeicher kann grob in zwei Abschnitte eingeteilt werden: nur lesbar und lesen/schreiben. Diese Unterscheidung entstand aus frühen Systemen, die ihr Hauptprogramm in Nur-Lese-Speicher hielten, wie Mask ROM , EPROM , PROM oder EEPROM . Als die Systeme komplexer wurden und Programme von anderen Medien in den RAM geladen wurden, anstatt sie vom ROM auszuführen, wurde die Idee beibehalten, dass einige Teile des Programmspeichers nicht modifiziert werden sollten. Diese wurden zu den .text- und .rodata- Segmenten des Programms, und der Rest, in den geschrieben werden konnte, wurde für bestimmte Aufgaben in eine Reihe anderer Segmente unterteilt.

Code

Das Codesegment , auch Textsegment genannt , enthält ausführbaren Code und ist im Allgemeinen schreibgeschützt und hat eine feste Größe.

Daten

Dies zeigt den typischen Aufbau des Programmspeichers eines einfachen Computers mit dem Text, verschiedenen Daten sowie Stack- und Heap-Abschnitten.

Das Datensegment enthält initialisierte statische Variablen, dh 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[] = "Hello World";

Die Werte für diese Variablen werden anfänglich im Festwertspeicher (typischerweise innerhalb des Codesegments) gespeichert 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, dh globale Variablen und lokale statische Variablen, die auf Null initialisiert sind oder keine explizite Initialisierung im Quellcode haben. Beispiele in C sind:

int i;
char a[12];

Haufen

Das Heap-Segment enthält dynamisch zugewiesenen Speicher, beginnt normalerweise am Ende des BSS-Segments und wächst von dort zu größeren Adressen an. Es wird von malloc , calloc, realloc und free verwaltet, die die Systemaufrufe brk und sbrk verwenden können, um seine Größe anzupassen (beachten Sie, dass die Verwendung von brk/sbrk und einem einzelnen Heap-Segment nicht erforderlich ist, um den Vertrag von malloc/ zu erfüllen. calloc/realloc/free; sie können auch mit mmap /munmap implementiert werden, um potenziell nicht zusammenhängende Bereiche des virtuellen Speichers im virtuellen Adressraum des Prozesses zu reservieren/zu entreservieren ). Das Heap-Segment wird von allen Threads, gemeinsam genutzten Bibliotheken und dynamisch geladenen Modulen in einem Prozess gemeinsam genutzt.

Stapel

Das Stack-Segment enthält den Call-Stack , eine LIFO- Struktur, die sich typischerweise in den höheren Teilen des Speichers befindet. Ein "Stapelzeiger"-Register verfolgt die Spitze des Stapels; es wird jedes Mal angepasst, wenn ein Wert auf den Stack "geschoben" wird. Der Satz von Werten, der für einen Funktionsaufruf übertragen wird, wird als "Stack-Frame" bezeichnet. Ein Stack-Frame besteht mindestens aus einer Rücksprungadresse. Auch automatische Variablen werden auf dem Stack allokiert.

Das Stack-Segment grenzte traditionell an das Heap-Segment und sie wuchsen aufeinander zu; als der Stapelzeiger auf den Heapzeiger traf, war der freie Speicher erschöpft. Bei großen Adressräumen und virtuellen Speichertechniken neigen sie dazu, freier platziert zu werden, aber sie wachsen typischerweise immer noch in eine konvergierende Richtung. Auf der Standard-PC- x86-Architektur wächst der Stack in Richtung Adresse Null, was bedeutet, dass neuere Elemente tiefer in der Aufrufkette an numerisch niedrigeren Adressen und näher am Heap liegen. Auf einigen anderen Architekturen wächst es in die entgegengesetzte Richtung.

Gedolmetschte Sprachen

Einige interpretierte Sprachen bieten ähnliche Möglichkeiten wie das Datensegment, insbesondere Perl und Ruby . In diesen Sprachen markiert ua die Linie __DATA__(Perl) oder __END__(Ruby, altes Perl) das Ende des Codesegments und den Anfang des Datensegments. Nur der Inhalt vor dieser Zeile wird ausgeführt, und der Inhalt der Quelldatei nach dieser Zeile steht als Dateiobjekt zur Verfügung: PACKAGE::DATAin Perl (zB main::DATA) und DATAin Ruby. Dies kann als eine Form eines Here-Dokuments (ein Datei-Literal) betrachtet werden.

Siehe auch

Verweise

Externe Links

  • "C-Start" . bravegnu.org .
  • "mem_sequence.c - Listet Speicherbereiche in einem Prozess sequentiell auf" . Archiviert vom Original am 02.02.2009.
  • van der Linden, Peter (1997). C-Programmierung für Experten: Tiefe C-Geheimnisse (PDF) . Lehrlingssaal. S. 119ff.