.bss
В компьютерном программировании ( начальный символ блока сокращенно .bss или bss ) — это часть объектного файла , исполняемого файла или языка ассемблера кода , которая содержит статически выделенные переменные , которые объявлены, но которым еще не присвоено значение. Его часто называют «разделом bss» или «сегментом bss».
сохраняется только длина раздела bss, но не данные Обычно в объектном файле . Загрузчик программы выделяет память для раздела bss при загрузке программы. Помещая переменные без значений в раздел .bss вместо раздела .data или .rodata, для которого требуются данные начального значения, размер объектного файла уменьшается.
На некоторых платформах часть или весь раздел bss инициализируется нулями. Unix-подобные системы и Windows инициализируют раздел bss нулем, который, таким образом, можно использовать для статически выделенных переменных C и C++ , которые инициализируются всеми нулевыми битами. Операционные системы могут использовать метод, называемый «заполнение нулями по требованию», для эффективной реализации сегмента bss. [1] инициализируется нулем системой времени выполнения C. Во встроенном программном обеспечении сегмент bss отображается в памяти, которая перед этим main()
вводится. Некоторые системы времени выполнения C могут разрешать не инициализировать часть сегмента bss; Переменные C должны быть явно помещены в эту часть сегмента bss. [2]
В некоторых компьютерных архитектурах также двоичный интерфейс приложения поддерживает сегмент sbss для «малых данных». Обычно доступ к этим элементам данных можно получить с помощью более коротких инструкций, которые могут иметь доступ только к определенному диапазону адресов. Архитектуры, поддерживающие локальное хранилище потока, могут использовать раздел tbss для неинициализированных статических данных, помеченных как локальные для потока. [3]
Источник
[ редактировать ]Исторически BSS (от Block Started by Symbol ) — это псевдооперация в UA-SAP (United Aircraft Символическая программа сборки самолетов), ассемблере, разработанном в середине 1950-х годов для IBM 704 Роем Наттом, Уолтером Рэмшоу и другими в United. Авиационная корпорация . [4] [5] Ключевое слово BSS позже было включено в программу ассемблера FORTRAN. [6] (FAP) и программа сборки макросов [7] (MAP), компьютеров стандартные ассемблеры IBM для 709 и 7090/94 . Он определял метку (то есть символ) и резервировал блок неинициализированного пространства для заданного количества слов . [8] В этой ситуации BSS служил сокращением вместо индивидуального резервирования ряда отдельных небольших ячеек данных. Некоторые ассемблеры поддерживают дополнительную или альтернативную директиву BES для блока, завершенного символом , где указанный символ соответствует концу зарезервированного блока. [9]
BSS на языке C
[ редактировать ]В C статически выделенные объекты без явного инициализатора инициализируются нулем (для арифметических типов) или нулевым указателем (для типов указателей). Реализации C обычно представляют нулевые значения и значения нулевого указателя с использованием битового шаблона, состоящего исключительно из битов с нулевыми значениями (несмотря на то, что заполнение bss нулем не требуется по стандарту C, все переменные в .bss должны быть индивидуально инициализированы до определенного типа). нулей в соответствии с разделом 6.7.8 стандарта C ISO 9899:1999 или разделом 6.7.9 для более новых стандартов). Следовательно, сегмент BSS обычно включает в себя все неинициализированные объекты (как переменные, так и константы ), объявленные в области файла (т. е. вне любой функции), а также неинициализированные статические локальные переменные ( локальные переменные, объявленные с помощью static
ключевое слово ); Однако статические локальные константы должны быть инициализированы при объявлении, поскольку они не имеют отдельного объявления и, следовательно, обычно не находятся в разделе BSS, хотя они могут быть неявно или явно инициализированы нулем. Реализация также может назначать разделу BSS статически выделенные переменные и константы, инициализированные значением, состоящим исключительно из нулевых битов.
Питер ван дер Линден , программист и автор C, говорит: «Некоторым людям нравится помнить это как «Лучше экономить пространство». Поскольку сегмент BSS содержит только переменные, которые еще не имеют никакого значения, на самом деле в этом нет необходимости. сохраните образ этих переменных. Размер, который потребуется BSS во время выполнения, записывается в объектный файл, но BSS (в отличие от сегмента данных) не занимает никакого фактического места в объектном файле». [10]
BSS на Фортране
[ редактировать ]В Фортране в этом сегменте размещаются общие переменные блока. [11] Некоторые компиляторы могут для 64-битных наборов команд ограничивать смещения в инструкциях, обращающихся к этому сегменту, до 32 бит, ограничивая его размер 2 ГБ или 4 ГБ. [12] [13] [14] Также обратите внимание, что Фортран не требует инициализации статических данных нулевым значением. В тех системах, где сегмент bss инициализируется нулевым значением, помещение общих переменных блока и других статических данных в этот сегмент гарантирует, что он будет нулевым, но для переносимости программистам не следует от этого зависеть.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ МакКьюсик, Маршалл Кирк ; Карелс, Майкл Дж. (1986). «Новая реализация виртуальной памяти для Berkeley UNIX» (PDF) . Калифорнийский университет, Беркли. п. 3. CiteSeerX 10.1.1.368.432 .
- ^ «Разделы памяти» . Домашняя страница AVR Libc .
- ^ «Специальные секции ELF» . Стандартная базовая спецификация КПК Linux 3.0RC1 .
- ^ Сетевой словарь . Джаввин Пресс, 2007, с. 70.
- ^ Кодирование для компьютера MIT-IBM 704, октябрь 1957 г., стр. В-10
- ^ ПРОГРАММА АССАМБЛЕИ ФОРТРАНА (FAP) для IBM 709/7090 (PDF) . ИБМ. 1961. с. 30. J28-6098-1 . Проверено 18 октября 2017 г.
- ^ IBM 7090/7094 Операционная система IBSYS версии 13 Язык программы макросов (MAP) (PDF) . ИБМ. 1963. С28-6392-4.
- ^ Тимар, Тед; и др. (1996). «Unix — Часто задаваемые вопросы (1/7)» . Вопрос 1.3.
- ^ Фонд свободного программного обеспечения, Inc. «38.9. Директивы» . Использование как: Использование ассемблера Gnu . Архивировано из оригинала 19 марта 2014 года . Проверено 22 февраля 2014 г.
- ^ Питер ван дер Линден, Экспертное программирование на C: Секреты Deep C , Prentice Hall 1994, стр. 141
- ^ Как Fortran 77 распределяет переменные общего блока?
- ^ «Опции IBM RS/6000 и PowerPC» . Использование коллекции компиляторов GNU (GCC) — GCC 7.2.0 .
- ^ «СПАРК Опционы» . Использование коллекции компиляторов GNU (GCC) — GCC 7.2.0 .
- ^ «Параметры x86» . Использование коллекции компиляторов GNU (GCC) — GCC 7.2.0 .
- Стивенс, В. Ричард (1992). Расширенное программирование в среде Unix . Аддисон-Уэсли . Раздел 7.6. ISBN 0-201-56317-7 .