Сегмент данных

редактировать

В вычислениях, сегмент данных (часто обозначаемый .data ) является частью объектного файла или соответствующего адресного пространства программы, которая содержит инициализированные статические переменные, то есть глобальные переменные и статические локальные переменные. Размер этого сегмента определяется размером значений в исходном коде программы и не изменяется во время выполнения.

Сегмент данных читается / записывается, так как значения переменных могут быть изменены во время выполнения. время. Это отличается от сегмента данных только для чтения (сегмент rodata или.rodata), который содержит статические константы, а не переменные; он также отличается от сегмента кода , также известного как текстовый сегмент, который на многих архитектурах доступен только для чтения. Вместо этого неинициализированные данные, как переменные, так и константы, находятся в сегменте BSS.

Исторически, чтобы иметь возможность поддерживать адресные пространства памяти, превышающие собственный размер внутреннего адресного регистра, ранние процессоры реализовали систему сегментации посредством чего они будут хранить небольшой набор индексов для использования в качестве смещений в определенные области. Семейство ЦП Intel 8086 предоставляет четыре сегмента: сегмент кода, сегмент данных, сегмент стека и дополнительный сегмент. Каждый сегмент помещался в определенное место в памяти выполняемым программным обеспечением, и все инструкции, которые оперировали данными в этих сегментах, выполнялись относительно начала этого сегмента. Это позволяло 16-битному адресному регистру, который обычно имеет доступ к 64 КБ памяти, получать доступ к 1 МБ пространства памяти.

Это сегментирование пространства памяти на дискретные блоки с конкретными задачами, перенесенными в языки программирования дня, и эта концепция до сих пор широко используется в современных языках программирования.

Содержание

  • 1 Программная память
    • 1.1 Текст
    • 1.2 Данные
    • 1.3 BSS
    • 1.4 Куча
    • 1.5 Стек
  • 2 Интерпретируемые языки
  • 3 См. Также
  • 4 Ссылки
  • 5 Внешние ссылки

Программная память

Память компьютерных программ можно в основном разделить на две категории: только для чтения и для чтения / записи. Это различие выросло из ранних систем, хранящих свою основную программу в постоянной памяти, такой как Mask ROM, PROM или EEPROM. По мере того, как системы становились более сложными и программы загружались с других носителей в ОЗУ вместо выполнения из ПЗУ, идея о том, что некоторые части памяти программы не должны изменяться, сохранилась. Они стали сегментами.text и.rodata программы, а остальные, которые можно было записать, были разделены на ряд других сегментов для конкретных задач.

Текст

В сегменте кода, также известном как текстовый сегмент или просто как текст, находится часть объектного файла или соответствующего раздела адресного пространства программы, содержащего исполняемые инструкции, сохраняется и обычно имеет фиксированный размер только для чтения.

Данные

Здесь показан типичный макет программной памяти простого компьютера с текстом, различными данными, разделами стека и кучи.

Сегмент.data содержит любые глобальные или статические переменные, которые имеют предопределенное значение и может быть изменено. Это любые переменные, которые не определены в функции (и, следовательно, могут быть доступны из любого места) или определены в функции, но определены как статические, поэтому они сохраняют свой адрес при последующих вызовах. Примеры в C включают:

int val = 3; char string = "Hello World";

Значения этих переменных изначально хранятся в постоянной памяти (обычно в пределах.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 для резервирования / снятия резервирования потенциально не- непрерывные области виртуальной памяти в виртуальное адресное пространство процесса ). Область кучи используется всеми потоками, разделяемыми библиотеками и динамически загружаемыми модулями в процессе.

Стек

Область стека содержит программу stack, структуру LIFO, обычно расположенную в верхних частях памяти. Регистр «указатель стека» отслеживает вершину стека; он корректируется каждый раз, когда значение «помещается» в стек. Набор значений, передаваемых для одного вызова функции, называется «стековым фреймом». Кадр стека состоит как минимум из адреса возврата. Автоматические переменные также размещаются в стеке.

Область стека традиционно примыкала к области кучи, и они росли друг к другу; когда указатель стека встретился с указателем кучи, свободная память была исчерпана. Благодаря большим адресным пространствам и технологиям виртуальной памяти они, как правило, размещаются более свободно, но все же обычно растут в сходящемся направлении. На стандартной архитектуре ПК x86 стек увеличивается по направлению к нулю, что означает, что более свежие элементы, расположенные глубже в цепочке вызовов, находятся по численно меньшим адресам и ближе к куче. На некоторых других архитектурах он растет в противоположном направлении.

Интерпретируемые языки

Некоторые интерпретируемые языки предлагают аналогичные возможности для сегмента данных, особенно Perl и Ruby. В этих языках строка __DATA__(Perl) или __END__(Ruby, старый Perl) отмечает конец сегмента кода и начало сегмента данных. Выполняется только содержимое до этой строки, а содержимое исходного файла после этой строки доступно как файловый объект: PACKAGE :: DATAв Perl (например, main :: DATA) и DATAна Ruby. Это можно рассматривать как форму , здесь документ (литерал файла).

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-17 14:11:07
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте