Исполняемый файл содержит много информации.
Исполняемый файл, имеющий много типов / классов данных, хранящихся в его физическом файле.
Например,
- Инструкция к исполняемому коду
- Ресурсы
- Информация о зависимости (от которой зависит этот двоичный файл)
- Символы, которые экспортируются из этого двоичного файла
и т.д.
Должен быть какой-то способ организации
вся эта информация внутри формата файла .exe, так что ОС может легко найти всю информацию, загрузить исполняемый файл и заставить его работать. Для этой цели в мире Windows используется общий двоичный формат (созданный M $, конечно), называемый PE (переносимый исполняемый файл). Вся информация, которую я только что перечислил (и многие другие), подробно описана в различных разделах бинарного файла.
.data section
Одним из таких разделов является раздел .data. Раздел .data содержит все инициализированные глобальные и статические данные, а раздел .bss содержит неинициализированные глобальные данные.
Зачем вам нужен отдельный раздел для глобалов?
Что ж, глобальный ведет себя как глобальный, потому что он создается в области памяти, которая существует на протяжении всей жизни программы и не является временной структурой данных, такой как стек, который может быть перезаписан / повторно использован. (как обычные автоматические переменные).
Компилятор
Следовательно, эти переменные должны быть размещены в некотором постоянном адресе в куче, который, к сожалению, не может быть известен во время компиляции. Таким образом, компилятор помещает все глобальные и статические переменные в этот раздел .data / .bss, а инструкции, которые ссылаются на эти переменные, ссылаются на эти относительно постоянные адреса в .data / .bss.
Linker
Когда компоновщик загружает исполняемый файл в реальном мире, он решает, где эти разделы должны быть размещены, и создает FIX UP для этих временных адресов, так что инструкции, которые ссылаются на глобальные переменные, ссылаются на теперь реальные виртуальные адреса в программах объем памяти.
Теперь вы знаете, что такое раздел / область .data и почему глобальным переменным должно быть выделено некоторое пространство в этой области и как это помогает программе в реальном времени. Googling PE формат и компоновщик и .data раздел и т.д. дадут вам ссылки.