Операционная система, C и распределение памяти процесса - PullRequest
2 голосов
/ 21 июля 2011

Мы говорим, что глобальные переменные и статические переменные всегда инициализируются равными 0. Тогда мой вопрос: почему у нас есть отдельные секции в двоичном файле для инициализированных и неинициализированных данных.

Я написал следующий код -

int i;
int j=0;
static int k;
static int l=0;

int main()
{
  static int m=0;
  static int n;
    printf("%d, %d\n",i,j);
    printf("%d, %d\n",k,l);
    printf("%d, %d\n",m,n);
    return 0;
}

И вывод был -

0, 0
0, 0
0, 0

Я проверил вывод objdump секции bss, и только этот раздел содержал переменные.Но по ссылке -

http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

Как правило, в каждом процессе виртуальная память, доступная этому процессу, называется его адресным пространством.Адресное пространство каждого процесса обычно состоит из 6 разделов, которые показаны на следующем рисунке: раздел среды - используется для хранения переменных среды и аргументов командной строки;стек, используемый для хранения памяти для аргументов функций, возвращаемых значений и автоматических переменных;куча (свободное хранилище), используемая для динамического выделения, две секции данных (для инициализированных и неинициализированных статических и глобальных переменных) и текстовая секция, где хранится фактический код.

Итак, я просто запутался,Если у нас есть два раздела данных, почему все данные помещаются в раздел .bss?А также я хочу понять, что содержит .data.

Может кто-нибудь помочь мне в этом?

1 Ответ

5 голосов
/ 21 июля 2011

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

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