W programowaniu, nazwa .bss lub bss jest używana przez wiele kompilatorów i konsolidatorów dla części segmentu danych zawierającego zmienne statyczne, które nie są zainicjowane do żadnej wartości. Jest często określana jako „sekcja bss” lub „segment bss”.

Zazwyczaj w pliku obiektowym przechowywana jest tylko długość sekcji bss, a nie dane. Program ładujący przydziela pamięć dla sekcji bss podczas ładowania programu. Na niektórych platformach część lub cała sekcja bss jest inicjowana na zera. Systemy uniksopodobne i Windows przypisują danym w sekcji bss wartości zero, pozwalając językom C i C++ na umieszczenie w segmencie bss zmiennych statycznych zainicjalizowanych na wartościach reprezentowanych przez wszystkie bity zerowe. W oprogramowaniu wbudowanym segment bss jest mapowany do pamięci, która jest inicjalizowana do zera przez system wykonawczy C przed wprowadzeniem metody main (). Niektóre systemy wykonawcze C mogą pozwolić, aby część segmentu bss nie została zainicjalizowana; zmienne C muszą być umieszczone w tej części segmentu bss.

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

Powstanie edytuj

BSS (z ang. Block Started by Symbol) jest pseudooperacją w Assemblerze, opracowany w połowie lat pięćdziesiątych dla IBM 704 autorstwa Roya Nutta, Waltera Ramshawa i innych w United Aircraft Corporation. Słowo kluczowe BSS zostało później włączone do FAP (z ang. FORTRAN Assembly Program), standardowego assemblera IBM dla komputerów 709 i 7090/94. Określił on etykietę (tj. symbol) i zarezerwował blok niezainicjowanej przestrzeni dla danej liczby słów[1]. W tej sytuacji BSS służył jako skrót w miejscu indywidualnego rezerwowania pewnej liczby odrębnych mniejszych lokalizacji danych. Niektóre asemblery obsługują komplementarną lub alternatywną dyrektywę BES (z ang. Block Ended by Symbol), gdzie określony symbol odpowiada końcowi zarezerwowanego bloku.

BSS w języku C edytuj

W języku C obiekty statycznie bez inicjalizatora są inicjowane do zera (dla typów arytmetycznych) lub wskaźnika zerowego (dla typów wskaźników). Implementacje w języku C zwykle reprezentują wartości zerowe i zerowe wartości wskaźnika za pomocą wzoru bitowego składającego się wyłącznie z bitów o wartości zero (chociaż nie jest to wymagane przez standard C). Dlatego segment BSS zazwyczaj obejmuje wszystkie niezainicjalizowane obiekty (zarówno zmienne, jak i stałe) zadeklarowane w zasięgu pliku (tj. poza dowolną funkcją), jak również niezainicjowane statyczne zmienne lokalne (zmienne lokalne zadeklarowane za pomocą słowa static); statyczne stałe lokalne muszą być zainicjowane w deklaracji, ponieważ nie mają oddzielnej deklaracji, a zatem zazwyczaj nie znajdują się w sekcji BSS, ale mogą być zainicjowane do zera. W implementacji można również przypisać statyczne zmienne i stałe zainicjalizowane wartością składającą się wyłącznie z bitów o zerowej wartości do sekcji BSS.

Peter van der Linden, programista i pisarz, powiedział: „Niektórzy ludzie lubią pamiętać o tym jako «lepsza oszczędność miejsca». Skoro segment BSS zawiera tylko zmienne, które nie mają jeszcze żadnej wartości, nie ma potrzeby przechowywania obrazu tych zmiennych. Rozmiar wymagany przez BSS w czasie wykonywania jest zapisywany w pliku obiektowym, ale BSS (w przeciwieństwie do segmentu danych) nie zajmuje rzeczywistej przestrzeni w pliku obiektowym”[2].

BSS w języku Fortran edytuj

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, ograniczając jego rozmiar do 2 GB lub 4 GB. Fortran nie wymaga inicjalizacji danych statycznych do zera. W systemach, w których segment bss jest inicjowany do zera, umieszczanie wspólnych zmiennych blokowych i innych danych statycznych w tym segmencie gwarantuje, że będzie to zero, ale dla przenośności programiści nie powinni na tym polegać.

Przypisy edytuj

  1. W. Richard Stevens, Advanced Programming in the Unix Enviroment s. 205, luty 2023.
  2. Peter van der Linden, Expert C Programming: Deep C Secrets pkt. 141, Prentice Hall Professional, 1994, ISBN 978-0-13-177429-2 [dostęp 2023-02-18] (ang.).

Bibliografia edytuj