Введение

В компьютерном программировании, блок начального символа (сокращенно bss или BSS) — это часть объектного файла, исполняемого файла или кода на языке ассемблера, содержащая статически выделенные переменные, которые были объявлены, но еще не получили начальное значение. Его часто называют «секцией BSS» или «сегментом BSS». Как правило, в объектном файле сохраняется только размер секции BSS, но сами данные не сохраняются. Загрузчик программы выделяет память для секции BSS при загрузке программы. Размещая переменные без начального значения в секции BSS, а не в секциях данных или rodata, которым требуются данные для инициализации, удается уменьшить размер объектного файла. На некоторых платформах секция BSS полностью или частично инициализируется нулями. Системы, подобные Unix, и Windows инициализируют секцию BSS нулями, что позволяет использовать ее для статически выделенных переменных C и C++, инициализированных нулями. Операционные системы могут использовать технику, называемую заполнением нулями по требованию, для эффективной реализации сегмента BSS. Во встроенном программном обеспечении сегмент BSS отображается в память, которая инициализируется нулями средой выполнения C перед входом в функцию main. Некоторые среды выполнения C могут разрешать не инициализировать часть сегмента BSS; в этом случае переменные C должны быть явно помещены в эту часть сегмента BSS. На некоторых компьютерных архитектурах интерфейс двоичного кода приложения (ABI) также поддерживает сегмент sbss для «малых данных». Обычно к этим элементам данных можно обращаться с помощью более коротких инструкций, которые могут работать только с определенным диапазоном адресов. Архитектуры, поддерживающие локальное хранилище потоков, могут использовать секцию tbss для неинициализированных статических данных, помеченных как локальные для потока.

Происхождение

Исторически, BSS (от Block Started by Symbol) — это псевдоинструкция в UA SAP (United Aircraft Symbolic Assembly Program), ассемблере, разработанном в середине 1950-х годов для IBM 704 Роем Наттом, Уолтером Рамшоу и другими сотрудниками United Aircraft Corporation. Ключевое слово BSS позднее было включено в FORTRAN Assembly Program (FAP) и Macro Assembly Program (MAP) — стандартные ассемблеры IBM для компьютеров 709 и 7090/94. Оно определяло метку (то есть символ) и резервировало блок неинициализированной памяти заданного размера в словах. В этом случае BSS служил сокращенной формой записи вместо индивидуального резервирования нескольких отдельных небольших областей данных. Некоторые ассемблеры поддерживают дополнительную или альтернативную директиву BES (Block Ended by Symbol), где указанный символ соответствует концу зарезервированного блока.

BSS в C

В C статически выделенные объекты без явного инициализатора инициализируются нулем (для арифметических типов) или нулевым указателем (для типов указателей). Реализации C обычно представляют нулевые значения и значения нулевого указателя с помощью битовой модели, состоящей исключительно из нулевых битов (хотя стандарт C и не требует заполнения BSS нулями, все переменные в BSS должны быть индивидуально инициализированы некоторым видом нулей в соответствии с разделом 6.7.8 стандарта C ISO 9899:1999 или разделом 6.7.9 для более новых стандартов). Следовательно, сегмент BSS обычно включает все неинициализированные объекты (как переменные, так и константы), объявленные в глобальной области видимости (т.е. вне какой-либо функции), а также неинициализированные статические локальные переменные (локальные переменные, объявленные с ключевым словом `static`); статические локальные константы должны быть инициализированы при объявлении, однако, поскольку у них нет отдельного объявления, они обычно не находятся в сегменте BSS, хотя могут быть неявно или явно инициализированы нулем. Реализация также может помещать в сегмент BSS статически выделенные переменные и константы, инициализированные значением, состоящим исключительно из нулевых битов. Питер ван дер Линден, программист на C и автор, говорит: «Некоторые люди любят запоминать это как "Better Save Space" (Лучше сэкономить место). Поскольку сегмент BSS содержит только переменные, которые еще не имеют значения, ему не нужно хранить образ этих переменных. Размер, необходимый BSS во время выполнения, записывается в объектном файле, но сам BSS (в отличие от сегмента данных) не занимает места в объектном файле».

BSS в Фортре

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