Из Википедии, бесплатной энциклопедии
  (Перенаправлено с .data )
Перейти к навигации Перейти к поиску

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

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

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

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

Программная память [ править ]

Память компьютерных программ в значительной степени можно разделить на две части: только для чтения и для чтения / записи. Это различие выросло из ранних систем, хранящих свою основную программу в постоянной памяти, такой как Mask ROM , PROM или EEPROM . По мере того, как системы становились более сложными, и программы загружались с других носителей в RAM вместо того, чтобы выполняться из ROM, идея о том, что некоторые части памяти программы не должны изменяться, была сохранена. Они стали сегментами .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. Это можно рассматривать как форму здесь документа (литерала файла).

См. Также [ править ]

  • Сегментация (память)
  • Ошибка сегментации
  • Компоновщик (вычисления)
  • Сегмент кода
  • .bss
  • Неинициализированная переменная
  • Стек (абстрактный тип данных)
  • Блок управления технологическим процессом

Ссылки [ править ]

  1. ^ perldata: специальные литералы
  2. ^ Рубин: Объект: __END__

Внешние ссылки [ править ]

  • «C автозагрузка» . bravegnu.org .
  • «mem_sequence.c - последовательно перечисляет области памяти в процессе» . Архивировано из оригинала на 2009-02-02.
  • ван дер Линден, Питер (1997). Экспертное программирование на C: секреты Deep C (PDF) . Прентис Холл. стр. 119 и далее.