Что такое область данных? - PullRequest
       37

Что такое область данных?

1 голос
/ 01 октября 2008

В C ++ статический спецификатор класса хранения выделяет память из области данных. Что означает «область данных»?

Ответы [ 8 ]

6 голосов
/ 01 октября 2008

Я не знаком с термином «область данных», но память часто делится на «раздел кода» и «раздел данных». Код находится в первом, данные в последнем. Я предполагаю, что это то, что здесь имеется в виду.

Классически, нет никакого различия между ними. Однако многие современные операционные системы могут запрещать выполнение кода в сегменте данных (при условии, что ЦП поддерживает это различие). Это иногда идет по ключевой фразе «флаг NX», как в «без выполнения», и может эффективно предотвратить некоторые случаи внедрения вредоносного кода.

/ EDIT: обратите внимание, что стандарт C ++ не упоминает «область данных».

5 голосов
/ 01 октября 2008

Названия областей различаются в зависимости от платформы, компилятора и компоновщика.

В общем, есть:

  • текст программы: пространство исполняемого кода.
  • константы: неисполняемые константы.
  • стек: стек.
  • bss: в широком смысле «статика» в терминах C / C ++. «Блок, начатый символом»
  • данные: неинициализированные глобалы
  • куча: память, выделенная во время выполнения.

В этом случае в рассматриваемой документации используется имя «область данных» для того, что традиционно называется сегментом bss.

В терминах Си, спецификатор класса хранения «статический» означает память, которая существует в течение времени жизни программы и инициализируется нулем или значением инициализатора. В примере:

static int s_value_one;
static int s_value_two = 123;

Значение s_value_one гарантированно равно нулю, а значение s_value_type равно 123 в точке первого оператора в main (). Как это становится правдой - вопрос реализации.

3 голосов
/ 01 октября 2008

В дополнение к тому, что сказал Конрад, объявление переменной как статической в ​​основном означает, что память для нее распределяется программой по мере ее загрузки, а не в куче или стеке. Исторически, использование только статических переменных в критических приложениях означало, что объем памяти приложения не изменялся во время выполнения и, следовательно, вероятность его сбоя была меньше из-за ограниченности ресурсов. Не знаю, относится ли это к современным операционным системам.

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

1 голос
/ 01 октября 2008

Что сказал Конрад.

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

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

0 голосов
/ 01 октября 2008

Исполняемый файл содержит много информации.

Исполняемый файл, имеющий много типов / классов данных, хранящихся в его физическом файле.

Например,

  1. Инструкция к исполняемому коду
  2. Ресурсы
  3. Информация о зависимости (от которой зависит этот двоичный файл)
  4. Символы, которые экспортируются из этого двоичного файла

и т.д.

Должен быть какой-то способ организации

вся эта информация внутри формата файла .exe, так что ОС может легко найти всю информацию, загрузить исполняемый файл и заставить его работать. Для этой цели в мире Windows используется общий двоичный формат (созданный M $, конечно), называемый PE (переносимый исполняемый файл). Вся информация, которую я только что перечислил (и многие другие), подробно описана в различных разделах бинарного файла.

.data section

Одним из таких разделов является раздел .data. Раздел .data содержит все инициализированные глобальные и статические данные, а раздел .bss содержит неинициализированные глобальные данные.

Зачем вам нужен отдельный раздел для глобалов?

Что ж, глобальный ведет себя как глобальный, потому что он создается в области памяти, которая существует на протяжении всей жизни программы и не является временной структурой данных, такой как стек, который может быть перезаписан / повторно использован. (как обычные автоматические переменные).

Компилятор

Следовательно, эти переменные должны быть размещены в некотором постоянном адресе в куче, который, к сожалению, не может быть известен во время компиляции. Таким образом, компилятор помещает все глобальные и статические переменные в этот раздел .data / .bss, а инструкции, которые ссылаются на эти переменные, ссылаются на эти относительно постоянные адреса в .data / .bss.

Linker

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

Теперь вы знаете, что такое раздел / область .data и почему глобальным переменным должно быть выделено некоторое пространство в этой области и как это помогает программе в реальном времени. Googling PE формат и компоновщик и .data раздел и т.д. дадут вам ссылки.

0 голосов
/ 01 октября 2008

Есть много мест, где могут оказаться данные. Обычно локальные переменные размещаются в стеке, и вы можете распределять объекты в куче, используя malloc (или версию по умолчанию 'new'). Статические данные, однако, обычно выделяются при запуске вашей программы и могут заканчиваться где угодно - где именно находится компилятор, ОС и формат исполняемого файла.

0 голосов
/ 01 октября 2008

Я думаю, что «область данных» относится к куче, тогда как локальные переменные обычно находятся в стеке.

Или это означает, что память, выделенная для этой переменной, находится в разделе .data исполняемого файла, но это будет характерно для Windows и формата PE.

0 голосов
/ 01 октября 2008

С небольшим поиском в Интернете я нашел больше информации по этим предметам здесь:

...