В компьютерном программировании , то блок запуска символ (сокращенно .bss или ПБС ) представляет собой часть из объектного файла , исполняемый файл или ассемблере код , который содержит статически переменные , которые объявлены , но еще не было присвоено значение еще. Его часто называют «секцией bss» или «сегментом bss».
Обычно в объектном файле сохраняется только длина секции bss, но не данные . Программа загрузчик выделяет память для секции ОНБА при загрузке программы. Помещая переменные без значений в раздел .bss вместо раздела .data или .rodata, которые требуют данных начального значения, размер объектного файла уменьшается.
На некоторых платформах часть или вся секция bss инициализируется нулями. Unix-подобные системы и Windows инициализируют секцию bss равной нулю, что позволяет статически распределенным переменным C и C ++, инициализированным значениями, представленными всеми нулевыми битами, помещаться в сегмент bss. Операционные системы могут использовать метод, называемый нулевым заполнением по требованию, для эффективной реализации сегмента bss. [1] В встроенном программном обеспечении, сегмент ПБСА переходят в память , которая инициализируется в нуль C время выполнения системы , прежде чем main()
вводятся. Некоторые системы времени выполнения C могут не допускать инициализации части сегмента bss; Переменные C должны быть явно помещены в эту часть сегмента bss. [2]
На некоторых компьютерных архитектурах , то двоичный интерфейс приложения также поддерживает SBSS сегмент для «маленьких данных». Обычно к этим элементам данных можно получить доступ с помощью более коротких инструкций, которые могут иметь доступ только к определенному диапазону адресов. Архитектуры, поддерживающие локальное хранилище потока, могут использовать раздел tbss для неинициализированных статических данных, помеченных как локальные для потока. [3]
Источник
Исторически BSS (от Block Started by Symbol ) представляет собой псевдооперацию в UA-SAP (United Aircraft Symbolic Assembly Program), ассемблере, разработанном в середине 1950-х годов для IBM 704 Роем Наттом, Уолтером Рамшоу и другими из United. Авиастроительная корпорация . [4] [5] Ключевое слово BSS позже было включено в Программу сборки FORTRAN [6] (FAP) и Программу сборки макросов [7] (MAP), стандартные ассемблеры IBM для компьютеров 709 и 7090/94 . Он определил метку (то есть символ) и зарезервировал блок неинициализированного пространства для заданного количества слов . [8] В этой ситуации BSS служил сокращением вместо индивидуального резервирования ряда отдельных меньших местоположений данных. Некоторые ассемблеры поддерживают дополнительную или альтернативную директиву BES для блока, завершенного символом , где указанный символ соответствует концу зарезервированного блока. [9]
BSS на C
В C статически выделенные объекты без явного инициализатора инициализируются нулем (для арифметических типов) или нулевым указателем (для типов указателей). Реализации C обычно представляют нулевые значения и значения нулевого указателя с использованием битового шаблона, состоящего исключительно из битов с нулевым значением (хотя это не требуется стандартом C). Следовательно, сегмент BSS обычно включает все неинициализированные объекты (как переменные, так и константы ), объявленные в области видимости файла (т. Е. Вне любой функции), а также неинициализированные статические локальные переменные ( локальные переменные, объявленные с помощью static
ключевого слова ); статические локальные константы должны быть инициализированы при объявлении, однако, поскольку они не имеют отдельного объявления и, следовательно, обычно не находятся в разделе BSS, хотя они могут быть неявно или явно инициализированы нулем. Реализация также может назначать статически распределенные переменные и константы, инициализированные значением, состоящим исключительно из битов с нулевым значением, в секцию BSS.
Питер ван дер Линден , программист и автор C, говорит: «Некоторым людям нравится запоминать это как« Лучше сэкономить место ». Поскольку сегмент BSS содержит только переменные, которые еще не имеют никакого значения, на самом деле ему не нужно хранить изображение этих переменных. Размер, который потребуется BSS во время выполнения, записывается в объектном файле, но BSS (в отличие от сегмент данных) не занимает фактического места в объектном файле ". [10]
BSS на Фортране
В Фортране в этом сегменте размещаются общие переменные блока. [11] Некоторые компиляторы могут для 64-битных наборов инструкций ограничивать смещения в инструкциях, которые обращаются к этому сегменту, до 32 бит, ограничивая его размер до 2 ГБ или 4 ГБ. [12] [13] [14] Также обратите внимание, что Fortran не требует, чтобы статические данные были инициализированы нулем. В тех системах, где сегмент bss инициализирован нулем, помещение переменных общего блока и других статических данных в этот сегмент гарантирует, что он будет равен нулю, но для переносимости программисты не должны зависеть от этого.
Смотрите также
Рекомендации
- ^ МакКузик, Маршалл Кирк ; Карелс, Майкл Дж. (1986). «Новая реализация виртуальной памяти для Berkeley UNIX» (PDF) . Калифорнийский университет в Беркли. п. 3. CiteSeerX 10.1.1.368.432 .
- ^ «Разделы памяти» . Домашняя страница AVR Libc .
- ^ "Особые секции ELF" . Стандартная базовая спецификация КПК Linux 3.0RC1 .
- ^ Сетевой словарь . Javvin Press, 2007, стр. 70.
- ↑ Кодирование для компьютера MIT-IBM 704, октябрь 1957 г., стр. V-10
- ^ ПРОГРАММА СБОРКИ FORTRAN (FAP) для IBM 709/7090 (PDF) . archive.computerhistory.org . IBM. 1961. с. 30. J28-6098-1 . Проверено 18 октября 2017 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ IBM 7090/7094 IBSYS Operating System Version 13 Macro Assembly Program (MAP) Language (PDF) . IBM. 1963. C28-6392-4.
- ^ Тимар, Тед; и другие. (1996). «Unix - Часто задаваемые вопросы (1/7)» . Вопрос 1.3.
- ^ Free Software Foundation, Inc. «38.9. Директивы» . Использование as: Использование as, Gnu Assembler . Архивировано из оригинального 19 марта 2014 года . Проверено 22 февраля 2014 года . CS1 maint: обескураженный параметр ( ссылка )
- Перейти ↑ Peter van der Linden, Expert C Programming: Deep C Secrets , Prentice Hall 1994, p. 141
- ^ Как Fortran 77 выделяет переменные общего блока?
- ^ «Опции IBM RS / 6000 и PowerPC» . Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0 .
- ^ «Параметры SPARC» . Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0 .
- ^ «Параметры x86» . Использование коллекции компиляторов GNU (GCC) - GCC 7.2.0 .
- Стивенс, В. Ричард (1992). Расширенное программирование в среде Unix . Аддисон-Уэсли . Раздел 7.6. ISBN 0-201-56317-7.