Относительно сегмента bss и сегмента данных в Unix - PullRequest
5 голосов
/ 15 декабря 2009

Я прочитал в своем учебнике по Unix, что bss используется для хранения неинициализированных переменных (глобальных объявлений) Это будет означать, что статические переменные хранятся отдельно, а не в BSS. Единственное другое место - сегмент данных.

Вот мой вопрос: является ли сегмент bss частью сегмента данных или это два совершенно разных набора сегментов памяти? Кроме того, зачем хранить глобальные переменные отдельно от статических переменных?

Ответы [ 2 ]

11 голосов
/ 15 декабря 2009

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

Но все по-прежнему основано на оригинальной простой модели, и это стоит знать. Идея состоит в том, что есть три сегмента.

  • .text
    Это код программы.
  • .data
    Это инициализированные данные.
  • .bss
    Это неинициализированные данные.

Bss является особенным: .bss объекты не занимают места в файле объектов, и, группируя все символы, которые специально не инициализированы вместе, их можно легко обнулить сразу.

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

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

0 голосов
/ 15 декабря 2009

bss традиционно являются так называемыми неинициализированными переменными, но C и Unix гарантируют, что они инициализируются нулем. (См. this .) Это часть сегмента данных, обычно сразу после пространства статически-инициализированной переменной программы. Просто в памяти выше чем bss обычно начало кучи.

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