Как хранятся глобальные переменные? - PullRequest
6 голосов
/ 03 ноября 2010

AFAIK, есть 2 типа глобальных переменных, инициализированные и неинсталлированные . Как они хранятся? Они оба хранятся в исполняемом файле? Я могу думать об инициализированных глобальных переменных, чьи начальные значения хранятся в исполняемом файле. Но что нужно хранить для неинициализированных?

Мое нынешнее понимание таково:

Исполняемый файл состоит из нескольких разделов, таких как .text, .data и .bss. Код хранится в секции .text, инициализированные глобальные или статические данные хранятся в секции .data, а неинициализированные глобальные или статические данные хранятся в секции .bss.

Спасибо за ваше время, чтобы просмотреть мои вопросы.

Обновление 1 - 9:56 11.03.2010

Я нашел хорошую ссылку здесь:

Сегменты в языке ассемблера - Построение сегментов текста и данных с помощью директив .text, .data и .bss

Обновление 2 - 10:09 11.03.2010

@ Michael

  1. Я определяю 100 байтов неинициализированной области данных в моем коде сборки, эти 100 байтов не сохраняются в моем исполняемом файле, поскольку НЕ инициализируются.

  2. Кто выделит 100-байтовое пространство неинициализированной памяти в ОЗУ? Программный загрузчик ?

Предположим, я получил следующий код:

int global[100];

void main(void)
{
   //...
}

Глобальный [100] не инициализирован. Как глобальная [100] будет перекодирована в моем исполняемом файле? И кто будет выделять это в какое время? Что делать, если он инициализирован?

Ответы [ 4 ]

7 голосов
/ 03 ноября 2010

Инициализированные значения переменных хранятся в сегменте .data исполняемого файла.Неинициализированные не должны храниться .Они попадают в сегмент .bss в ОЗУ, но размер сегмента в исполняемом файле равен нулю, в дескрипторе сегмента хранится только необходимый объем памяти.Код в разделе .text обращается к этим через смещения в сегменте. компоновщик-загрузчик среды выполнения исправляет эти ссылки на действительные виртуальные адреса .См., Например, Исполняемый и связываемый формат , который используется в большинстве Unix-подобных операционных систем.

2 голосов
/ 03 ноября 2010

Хранилище для глобальных переменных выделяется в виртуальной памяти вашего компьютера компоновщиком / загрузчиком ОС во время загрузки вашей программы. Фактическое хранилище глобальных переменных находится где-то в иерархии физической памяти (кеш, оперативная память, резервное хранилище SSD / HD и т. Д.) В соответствии с кешем и системой виртуальных машин. Все может закончиться довольно фрагментированным.

Значения инициализированных глобалов копируются из сегмента .data в часть выделенной виртуальной памяти. Неинициализированные глобальные переменные могут быть обнулены или могут содержать ненужные файлы, в зависимости от безопасности конкретной ОС, под которой работает программа.

Существуют другие варианты, в зависимости от языка, компилятора, времени выполнения и ОС.

1 голос
/ 03 ноября 2010

В PE-файлах для каждого сегмента указаны два размера: RAWsize (размер на диске) и Vsize (размер в ОЗУ).

Когда Vsize больше, чем RAWsize, остаток сегмента в ОЗУ обнуляется.

.bss (если имеется) всегда имеет размер RAW 0, и там находятся неинициализированные глобальные переменные.

Другой распространенный подход - сделать Vsize из .data больше, чем его RAWsize, чтобы остальная часть сегмента содержала унифицированные переменные.

0 голосов
/ 03 ноября 2010

Неинициализированные переменные - это просто указатели на уровне машины.Пространство для них выделяется во время выполнения, и программа заполнит его позднее.

Например, если в ассемблере вы создадите глобальную переменную global BYTE 100, которая зарезервирует global в качестве указателяв область 100 байт.Затем программа получает доступ к этому региону для всего, что ей нужно.

РЕДАКТИРОВАТЬ: я посмотрел в своей сборочной книге, и похоже, что неинициализированные глобальные переменные определены в разделе .data так же, как и инициализированные переменные.Из моего понимания пространство выделяется в exe (скажем, 100 байтов, как указано выше), но будет иметь неопределенное содержимое.На машинах Intel в Windows это будет фигня;программа отвечает за его инициализацию.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...