Segment danych - Data segment

W obliczeniowej , A segmentu danych (często oznaczany .data ) jest fragmentu obiektu pliku lub odpowiedni przestrzeń adresową programu, który zawiera zainicjalizowanych zmiennych statycznych , to znaczy zmiennych globalne i statyczne zmienne lokalne . Rozmiar tego segmentu jest określany przez rozmiar wartości w kodzie źródłowym programu i nie zmienia się w czasie wykonywania .

Segment danych jest odczytywany/zapisywany, ponieważ wartości zmiennych można zmieniać w czasie wykonywania. Jest to w przeciwieństwie do segmentu danych tylko do odczytu ( segment rodata lub.rodata), który zawiera raczej stałe statyczne niż zmienne; kontrastuje również zsegmentem kodu, znanym również jako segment tekstowy, który jest tylko do odczytu na wielu architekturach. Niezainicjowane dane, zarówno zmienne, jak i stałe, znajdują się wsegmencie BSS.

Historycznie, aby móc obsługiwać przestrzenie adresowe pamięci większe niż pozwalałby na to natywny rozmiar wewnętrznego rejestru adresów, wczesne procesory implementowały system segmentacji, w którym przechowywały mały zestaw indeksów do wykorzystania jako przesunięcia do pewnych obszarów. Rodzina procesorów Intel 8086 zawiera cztery segmenty: segment kodu, segment danych, segment stosu i segment dodatkowy. Każdy segment został umieszczony w określonej lokalizacji w pamięci przez wykonywane oprogramowanie, a wszystkie instrukcje, które operowały na danych w tych segmentach, zostały wykonane względem początku tego segmentu. Umożliwiło to 16-bitowemu rejestrowi adresów, który normalnie byłby w stanie uzyskać dostęp do 64 KB przestrzeni pamięci, na dostęp do 1 MB przestrzeni pamięci.

Ta segmentacja przestrzeni pamięci na dyskretne bloki z określonymi zadaniami przeniesionymi na języki programowania dnia i koncepcja jest nadal szeroko stosowana w nowoczesnych językach programowania.

Pamięć programu

Pamięć programu komputerowego można w dużej mierze podzielić na dwie sekcje: tylko do odczytu i do odczytu/zapisu. To rozróżnienie wyrosło z wczesnych systemów utrzymujących swój główny program w pamięci tylko do odczytu, takich jak Mask ROM , EPROM , PROM lub EEPROM . Ponieważ systemy stawały się coraz bardziej złożone, a programy były ładowane z innych nośników do pamięci RAM, zamiast wykonywać je z pamięci ROM, utrzymano pomysł, że niektóre części pamięci programu nie powinny być modyfikowane. Te stały się .text i .rodata odcinki programu, a pozostała część, która mogłaby być zapisana do podzielony na szereg innych segmentów dla poszczególnych zadań.

Kod

Segment kodu , znany również jako segmentu tekstu zawiera wykonywalny kod i jest na ogół tylko do odczytu i stałym rozmiarze.

Dane

Pokazuje typowy układ pamięci programu prostego komputera z tekstem, różnymi danymi oraz sekcjami stosu i sterty.

Segment danych zawiera zainicjowana zmienne statyczne, czyli zmienne globalne i lokalne zmienne statyczne, które mają określoną wartość i mogą być modyfikowane. Przykłady w C obejmują:

int i = 3;
char a[] = "Hello World";

Wartości tych zmiennych są początkowo przechowywane w pamięci tylko do odczytu (zwykle w segmencie kodu) i są kopiowane do segmentu danych podczas procedury uruchamiania programu.

BSS

Segment BSS zawiera niezainicjowane dane statyczne, obie zmienne i stałe, czyli zmienne globalne i lokalne zmienne statyczne, które są inicjowane na zero albo nie mają wyraźnej inicjalizacji w kodzie źródłowym. Przykłady w C obejmują:

int i;
char a[12];

Sterta

Segmentu sterty zawiera dynamicznie przydzielane pamięci, zwykle zaczyna się na końcu segmentu BSS i rośnie do większych adresów stamtąd. Jest zarządzany przez malloc , calloc, realloc i free, które mogą używać wywołań systemowych brk i sbrk w celu dostosowania jego rozmiaru (należy zauważyć, że użycie brk/sbrk i pojedynczego segmentu sterty nie jest wymagane do wypełnienia umowy malloc/ calloc/realloc/free; mogą być również zaimplementowane za pomocą mmap /munmap w celu zarezerwowania/odrezerwowania potencjalnie nieciągłych regionów pamięci wirtualnej w wirtualnej przestrzeni adresowej procesu ). Segment sterty jest współużytkowany przez wszystkie wątki, współdzielone biblioteki i dynamicznie ładowane moduły w procesie.

Stos

Segmentu stosu zawiera stos połączenia , a LIFO konstrukcji, zwykle znajdujących się w wyższych częściach pamięci. Rejestr „wskaźnika stosu” śledzi szczyt stosu; jest dostosowywany za każdym razem, gdy wartość jest „wpychana” na stos. Zbiór wartości przekazanych dla jednego wywołania funkcji jest nazywany „ramką stosu”. Ramka stosu składa się co najmniej z adresu zwrotnego. Na stosie są również przydzielane zmienne automatyczne .

Segment stosu tradycyjnie przylegał do segmentu hałdy i rosły ku sobie; kiedy wskaźnik stosu spotkał wskaźnik sterty, wolna pamięć została wyczerpana. Przy dużych przestrzeniach adresowych i technikach pamięci wirtualnej są one zwykle umieszczane bardziej swobodnie, ale nadal zwykle rosną w zbieżnym kierunku. W standardowej architekturze PC x86 stos rośnie w kierunku zerowym, co oznacza, że ​​nowsze elementy, głębiej w łańcuchu wywołań, znajdują się pod numerycznie niższymi adresami i bliżej sterty. Na niektórych innych architekturach rozwija się w przeciwnym kierunku.

Tłumaczone języki

Niektóre interpretowane języki oferują podobne ułatwienia do segmentu danych, zwłaszcza Perl i Ruby . W tych językach, w tym wiersz __DATA__(Perl) lub __END__(Ruby, stary Perl) oznacza koniec segmentu kodu i początek segmentu danych. Tylko zawartość przed tym wierszem jest wykonywana, a zawartość pliku źródłowego po tym wierszu jest dostępna jako obiekt pliku: PACKAGE::DATAw Perlu (np. main::DATA) iw DATARuby. Można to uznać za formę dokumentu w tym miejscu (dosłownie pliku).

Zobacz też

Bibliografia

Zewnętrzne linki

  • "Uruchamianie C" . bravegnu.org .
  • "mem_sequence.c — sekwencyjnie wyświetla regiony pamięci w procesie" . Zarchiwizowane od oryginału w dniu 2009-02-02.
  • van der Lindena, Piotra (1997). Programowanie Expert C: Głębokie tajemnice C (PDF) . Sala Prezydencka. s. 119 i nast.