В вычислении , A сегмент данных (часто обозначаются .data ) представляет собой часть из файла объекта или соответствующее адресное пространство программы , которая содержит инициализированные переменную статические , то есть, глобальные переменные и статические локальные переменные . Размер этого сегмента определяется размером значений в исходном коде программы и не изменяется во время выполнения .
Сегмент данных предназначен для чтения / записи, поскольку значения переменных могут быть изменены во время выполнения. В этом отличие от сегмента данных только для чтения (сегмент rodata или.rodata), который содержит статические константы, а не переменные; он также контрастирует ссегментом кода, также известным как текстовый сегмент, который на многих архитектурах доступен только для чтения. Вместо этого всегменте BSSнаходятся неинициализированные данные, как переменные, так и константы.
Исторически сложилось так, что для поддержки адресных пространств памяти, превышающих собственный размер внутреннего адресного регистра, первые процессоры реализовали систему сегментации, при которой они сохраняли небольшой набор индексов для использования в качестве смещений в определенные области. Семейство процессоров Intel 8086 предоставляет четыре сегмента: сегмент кода, сегмент данных, сегмент стека и дополнительный сегмент. Каждый сегмент был помещен в определенное место в памяти выполняемым программным обеспечением, и все инструкции, которые работали с данными в этих сегментах, выполнялись относительно начала этого сегмента. Это позволяло 16-битному адресному регистру, который обычно имеет доступ к 64 КБ памяти, получить доступ к 1 МБ пространства памяти.
Это сегментирование пространства памяти на дискретные блоки с определенными задачами, перенесенными в языки программирования того времени, и эта концепция до сих пор широко используется в современных языках программирования.
Программная память
Память компьютерных программ в значительной степени можно разделить на две части: только для чтения и для чтения / записи. Это различие выросло из ранних систем, хранящих свою основную программу в постоянной памяти, такой как Mask ROM , PROM или EEPROM . По мере того, как системы становились более сложными и программы загружались с других носителей в ОЗУ вместо выполнения из ПЗУ, идея о том, что некоторые части памяти программы не должны изменяться, сохранилась. Они стали сегментами .text и .rodata программы, а остальные, в которые можно было записать, были разделены на ряд других сегментов для конкретных задач.
Текст
Сегмент кода , также известный как текстовый сегмент , или просто как текст , где часть из файла объекта или соответствующий раздел программы адресного пространства , который содержит исполняемые инструкции , хранится и , как правило , только для чтения и фиксированного размера.
Данные
.Data сегмент содержит какие - либо глобальные или статические переменные , которые имеют заранее определенные значения и могут быть изменены. Это любые переменные, которые не определены в функции (и, следовательно, могут быть доступны из любого места) или определены в функции, но определены как статические, поэтому они сохраняют свой адрес при последующих вызовах. Примеры на C включают:
int val = 3; char string [] = "Привет, мир";
Значения этих переменных изначально хранятся в постоянной памяти (обычно в пределах .text ) и копируются в сегмент .data во время процедуры запуска программы.
Обратите внимание, что в приведенном выше примере, если эти переменные были объявлены внутри функции, они по умолчанию будут храниться в локальном фрейме стека.
BSS
Сегмент BSS, также известный как неинициализированные данные , обычно находится рядом с сегментом данных. Сегмент BSS содержит все глобальные переменные и статические переменные, которые инициализированы нулем или не имеют явной инициализации в исходном коде. Например, переменная, определенная как static int i;
содержащаяся в сегменте BSS.
Куча
Область кучи обычно начинается в конце сегментов .bss и .data и оттуда увеличивается до более крупных адресов. Область кучи управляется с помощью malloc , calloc, realloc и free, которые могут использовать системные вызовы brk и sbrk для настройки своего размера (обратите внимание, что использование brk / sbrk и одной «области кучи» не требуется для выполнения контракт malloc / calloc / realloc / free; они также могут быть реализованы с использованием mmap / munmap для резервирования / снятия резервирования потенциально несмежных областей виртуальной памяти в виртуальное адресное пространство процесса ). Область кучи используется всеми потоками, разделяемыми библиотеками и динамически загружаемыми модулями в процессе.
Куча
Область стека содержит программный стек , структуру LIFO , обычно расположенную в верхних частях памяти. Регистр «указатель стека» отслеживает вершину стека; он корректируется каждый раз, когда значение «помещается» в стек. Набор значений, передаваемых для одного вызова функции, называется «стековым фреймом». Кадр стека состоит как минимум из адреса возврата. Автоматические переменные также размещаются в стеке.
Зона стека традиционно примыкала к зоне отвала, и они росли навстречу друг другу; когда указатель стека встретился с указателем кучи, свободная память была исчерпана. Благодаря большим адресным пространствам и технологиям виртуальной памяти они, как правило, размещаются более свободно, но все же обычно растут в сходящемся направлении. В стандартной архитектуре ПК x86 стек растет к нулевому адресу, что означает, что более свежие элементы, расположенные глубже в цепочке вызовов, имеют численно меньшие адреса и ближе к куче. На некоторых других архитектурах он растет в противоположном направлении.
Интерпретируемые языки
Некоторые интерпретируемые языки предлагают аналогичные возможности для сегмента данных, особенно Perl [1] и Ruby . [2] В этих языках строчка __DATA__
(Perl) или __END__
(Ruby, старый Perl) отмечает конец сегмента кода и начало сегмента данных. Выполняется только содержимое до этой строки, а содержимое исходного файла после этой строки доступно как файловый объект: PACKAGE::DATA
в Perl (например, main::DATA
) и DATA
в Ruby. Это можно рассматривать как форму здесь документа (литерала файла).
Смотрите также
Рекомендации
- ^ perldata: специальные литералы
- ^ Рубин: Объект: __END__
Внешние ссылки
- «C автозагрузка» . bravegnu.org .
- "mem_sequence.c - последовательно перечисляет области памяти в процессе" . Архивировано из оригинала на 2009-02-02.
- ван дер Линден, Питер (1997). Экспертное программирование на C: секреты Deep C (PDF) . Прентис Холл. стр. 119 и далее.