.bss - .bss

В компьютерное программирование, то начальный символ блока (сокращенно .bss или же bss) является частью объектный файл, исполняемый файл или язык ассемблера код, содержащий статически распределенные переменные которые объявлены, но еще не присвоены значения. Его часто называют «секцией bss» или «сегментом bss».

Обычно в файле сохраняется только длина секции bss, но не данные. объектный файл. В загрузчик программ выделяет память для секции bss при загрузке программы. Помещая переменные без значений в раздел .bss вместо раздела .data или .rodata, который требует данных начального значения, размер объектного файла уменьшается.

На некоторых платформах часть или вся секция bss инициализируется нулями. Unix-подобный системы и Windows инициализировать секцию bss до нуля, разрешив C и C ++ статически распределенные переменные инициализируются значениями, представленными всеми нулевыми битами, которые должны быть помещены в сегмент bss. Операционные системы могут использовать метод, называемый нулевым заполнением по требованию, для эффективной реализации сегмента bss.[1] Во встроенном программном обеспечении сегмент bss отображается в память, которая инициализируется нулевым кодом C система времени выполнения перед главный() введен. Некоторые системы времени выполнения C могут не допускать инициализации части сегмента bss; Переменные C должны быть явно помещены в эту часть сегмента bss.[2]

На некоторых компьютерные архитектуры, то двоичный интерфейс приложения также поддерживает sbss сегмент для «малых данных». Обычно к этим элементам данных можно получить доступ, используя более короткие инструкции, которые могут иметь доступ только к определенному диапазону адресов. Поддержка архитектур локальное хранилище потока может использовать tbss раздел для неинициализированных статических данных, помеченных как локальные для потока.[3]

Источник

Здесь показана типичная структура памяти программ простого компьютера с текстом, различными данными, а также разделами стека и кучи.

Исторически, BSS (из Блокировать по символу) это псевдооперация в UA-SAP (Объединенная программа символической сборки самолетов), ассемблер разработан в середине 1950-х годов для IBM 704 Роя Натта, Уолтера Рэмшоу и других в Объединенная авиастроительная корпорация.[4][5] Ключевое слово BSS позже было включено в Программа сборки FORTRAN[6] (FAP) и программа сборки макросов[7] (КАРТА), IBM стандартные сборщики для своих 709 и 7090/94 компьютеры. Он определил метку (то есть символ) и зарезервировал блок неинициализированного пространства для заданного количества слова.[8] В этой ситуации BSS служил сокращением вместо индивидуального резервирования ряда отдельных небольших местоположений данных. Некоторые ассемблеры поддерживают дополнительную или альтернативную директиву BES, за Блок завершен символом, где указанный символ соответствует концу зарезервированного блока.[9]

BSS на C

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

Питер ван дер Линден, программист на C и автор, говорит: «Некоторым нравится запоминать это как« Лучше сэкономить место ». Поскольку сегмент BSS содержит только переменные, которые еще не имеют никакого значения, на самом деле ему не нужно хранить изображение этих переменных. Размер, который потребуется BSS во время выполнения, записывается в объектном файле, но BSS (в отличие от сегмент данных) не занимает фактического места в объектном файле ".[10]

BSS на Фортране

В Фортран, в этом сегменте размещаются общие переменные блока.[11]Некоторые компиляторы могут для 64-битный наборы команд, ограничивают смещения в инструкциях, которые обращаются к этому сегменту, до 32 бит, ограничивая его размер до 2 ГБ или 4 ГБ.[12][13][14] Также обратите внимание, что Fortran не требует, чтобы статические данные были инициализированы нулем. В тех системах, где сегмент bss инициализирован нулем, помещение переменных общего блока и других статических данных в этот сегмент гарантирует, что он будет равен нулю, но для переносимости программисты не должны зависеть от этого.

Смотрите также

Рекомендации

  1. ^ МакКьюзик, Маршалл Кирк; Карелс, Майкл Дж. (1986). «Новая реализация виртуальной памяти для Berkeley UNIX» (PDF). Калифорнийский университет в Беркли. п. 3. CiteSeerX  10.1.1.368.432.
  2. ^ «Разделы памяти». Домашняя страница AVR Libc.
  3. ^ "Особые секции ELF". Стандартная базовая спецификация КПК Linux 3.0RC1.
  4. ^ Сетевой словарь. Javvin Press, 2007, стр. 70.
  5. ^ Кодирование для компьютера MIT-IBM 704 Октябрь 1957 г., стр. V-10
  6. ^ ПРОГРАММА СБОРКИ FORTRAN (FAP) для IBM 709/7090 (PDF). archive.computerhistory.org. IBM. 1961. с. 30. J28-6098-1. Получено 18 октября 2017.
  7. ^ IBM 7090/7094 IBSYS Операционная система Версия 13 Язык программы сборки макросов (MAP) (PDF). IBM. 1963. C28-6392-4.
  8. ^ Тимар, Тед; и другие. (1996). «Unix - Часто задаваемые вопросы (1/7)». Вопрос 1.3.
  9. ^ Фонд свободного программного обеспечения, Inc. «38.9. Директивы». Использование as: Использование as, Gnu Assembler. Получено 22 февраля, 2014.
  10. ^ Питер ван дер Линден, Экспертное программирование на C: секреты Deep C, Прентис Холл 1994, стр. 141
  11. ^ Как Fortran 77 выделяет переменные общего блока?
  12. ^ «Опции IBM RS / 6000 и PowerPC». Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0.
  13. ^ «Параметры SPARC». Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0.
  14. ^ «Параметры x86». Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0.