.bss

Wprowadzenie do sekcji .bss

W kontekście programowania, termin .bss lub bss jest wykorzystywany przez wiele kompilatorów i konsolidatorów do określenia części segmentu danych, która zawiera zmienne statyczne nieprzypisane do żadnej wartości. Często nazywana jest „sekcją bss” lub „segmentem bss”.

W pliku obiektowym zazwyczaj przechowywana jest jedynie długość sekcji bss, a nie konkretne dane. Podczas ładowania programu, program ładujący przydziela pamięć dla sekcji bss. W przypadku niektórych platform, część lub cała sekcja bss jest inicjowana zerami. W systemach uniksopodobnych oraz w Windows, zmienne w sekcji bss otrzymują wartości zero, co umożliwia językom C i C++ umieszczanie w tym segmencie statycznych zmiennych zainicjalizowanych do wartości reprezentowanej przez same zera. W oprogramowaniu wbudowanym segment bss jest mapowany do pamięci, która przez system wykonawczy C jest inicjowana do zera przed wykonaniem funkcji main(). Niektóre systemy wykonawcze C mogą pozwolić na to, że część segmentu bss nie będzie inicjowana; zmienne C muszą być umieszczone w tej nieinicjowanej części segmentu bss.

W niektórych architekturach komputerowych interfejs binarny aplikacji obsługuje także segment sbss dla „małych danych”. Zazwyczaj dostęp do tych danych odbywa się za pomocą krótszych instrukcji, które mogą mieć dostęp tylko do określonego zakresu adresów.

Powstanie

Termin BSS (z ang. Block Started by Symbol) jest pseudooperacją w Assemblerze, która została opracowana w połowie lat pięćdziesiątych dla IBM 704 przez Roya Nutta, Waltera Ramshawa i innych pracowników United Aircraft Corporation. Później słowo kluczowe BSS zostało włączone do FAP (z ang. FORTRAN Assembly Program), standardowego assemblera IBM dla komputerów 709 oraz 7090/94. W tym kontekście BSS definiował etykietę (symbol) i rezerwował blok niezainicjowanej przestrzeni dla określonej liczby słów. BSS w tej sytuacji służył jako skrót dla indywidualnego rezerwowania mniejszych lokalizacji danych. Niektóre asemblery obsługują dyrektywę BES (z ang. Block Ended by Symbol), która określa, że dany symbol odpowiada końcowi zarezerwowanego bloku.

BSS w języku C

W języku C obiekty, które są statycznie deklarowane bez inicjalizatora, są domyślnie inicjowane do zera (dla typów arytmetycznych) lub do wskaźnika zerowego (dla typów wskaźników). Implementacje w języku C na ogół reprezentują zerowe wartości oraz zerowe wskaźniki przez wzór bitowy, w którym wszystkie bity mają wartość zero (chociaż nie jest to wymóg standardu C). W związku z tym segment BSS zazwyczaj obejmuje wszystkie niezainicjowane obiekty (zarówno zmienne, jak i stałe) zadeklarowane w zasięgu pliku (poza wszelkimi funkcjami), a także niezainicjowane statyczne zmienne lokalne (zmienne lokalne zadeklarowane z użyciem słowa static); natomiast statyczne lokalne stałe muszą być zainicjowane w momencie deklaracji, ponieważ nie mają oddzielnej deklaracji i z reguły nie znajdują się w sekcji BSS, choć mogą być zainicjowane do zera. W implementacji można także przypisać statyczne zmienne i stałe zainicjalizowane do wartości składającej się wyłącznie z bitów o zerowej wartości do sekcji BSS.

Peter van der Linden, programista i autor, zauważył: „Niektórzy ludzie zapamiętują to jako «lepsza oszczędność miejsca». Ponieważ segment BSS zawiera jedynie zmienne, które nie mają jeszcze przypisanej wartości, nie ma potrzeby przechowywania obrazu tych zmiennych. Rozmiar wymagany przez BSS podczas wykonywania jest zapisywany w pliku obiektowym, ale BSS (w przeciwieństwie do segmentu danych) nie zajmuje rzeczywistej przestrzeni w pliku obiektowym”.

BSS w języku Fortran

W języku Fortran w tym segmencie przydzielane są wspólne zmienne blokowe. Niektóre kompilatory mogą dla zestawów instrukcji 64-bitowych ograniczyć przesunięcia w instrukcjach dostępu do tego segmentu do 32 bitów, co ogranicza jego rozmiar do 2 GB lub 4 GB. Fortran nie wymaga, aby dane statyczne były inicjowane do zera. W systemach, w których segment bss jest inicjowany do zera, umieszczanie wspólnych zmiennych blokowych oraz innych danych statycznych w tym segmencie zapewnia, że będą one miały wartość zero, ale dla zachowania przenośności programiści nie powinni na tym polegać.

Przypisy

Bibliografia

W. Richard Stevens: Advanced Programming in the Unix Environment. McFarland, 1992. ISBN 0-201-56317-7. Brak numerów stron w książce.