En programación informática , el símbolo de inicio de bloque (abreviado como .bss o bss ) es la parte de un archivo de objeto , ejecutable o código de lenguaje ensamblador que contiene variables asignadas estáticamente que se declaran pero a las que aún no se les ha asignado un valor. A menudo se lo denomina "sección bss" o "segmento bss".
Normalmente, en el archivo de objeto solo se almacena la longitud de la sección bss, pero no los datos . El cargador de programas asigna memoria para la sección bss cuando carga el programa. Al colocar variables sin valor en la sección .bss, en lugar de en la sección .data o .rodata que requieren datos de valor inicial, se reduce el tamaño del archivo de objeto.
En algunas plataformas, parte o toda la sección bss se inicializa a cero. Los sistemas tipo Unix y Windows inicializan la sección bss a cero, lo que puede utilizarse para variables asignadas estáticamente en C y C++ que se inicializan en todos los bits cero. Los sistemas operativos pueden utilizar una técnica denominada relleno de ceros a pedido para implementar de manera eficiente el segmento bss. [1] En el software integrado, el segmento bss se asigna a la memoria que el sistema de tiempo de ejecución de C inicializa a cero antes de main()
ingresar. Algunos sistemas de tiempo de ejecución de C pueden permitir que parte del segmento bss no se inicialice; las variables de C deben colocarse explícitamente en esa parte del segmento bss. [2]
En algunas arquitecturas informáticas , la interfaz binaria de la aplicación también admite un segmento sbss para "datos pequeños". Normalmente, se puede acceder a estos elementos de datos mediante instrucciones más cortas que solo pueden acceder a un cierto rango de direcciones. Las arquitecturas que admiten almacenamiento local de subprocesos pueden utilizar una sección tbss para datos estáticos no inicializados marcados como locales de subprocesos. [3]
Históricamente, BSS (de Block Started by Symbol ) es una pseudooperación en UA-SAP (United Aircraft Symbolic Assembly Program), el ensamblador desarrollado a mediados de la década de 1950 para el IBM 704 por Roy Nutt, Walter Ramshaw y otros en United Aircraft Corporation . [4] [5] La palabra clave BSS se incorporó más tarde al Programa de ensamblaje FORTRAN [6] (FAP) y al Programa de ensamblaje macro [7] (MAP), los ensambladores estándar de IBM para sus computadoras 709 y 7090/94 . Definía una etiqueta (es decir, un símbolo) y reservaba un bloque de espacio no inicializado para una cantidad determinada de palabras . [8] En esta situación, BSS sirvió como una abreviatura en lugar de reservar individualmente una cantidad de ubicaciones de datos más pequeñas separadas. Algunos ensambladores admiten una directiva complementaria o alternativa BES , para Block Ended by Symbol , donde el símbolo especificado corresponde al final del bloque reservado. [9]
En C , los objetos asignados estáticamente sin un inicializador explícito se inicializan a cero (para tipos aritméticos) o un puntero nulo (para tipos de puntero). Las implementaciones de C normalmente representan valores cero y valores de puntero nulo utilizando un patrón de bits que consiste únicamente en bits de valor cero (a pesar de que el estándar C no requiere llenar bss con cero, todas las variables en .bss deben inicializarse individualmente a algún tipo de ceros de acuerdo con la Sección 6.7.8 del Estándar C ISO 9899:1999 o la sección 6.7.9 para estándares más nuevos). Por lo tanto, el segmento BSS normalmente incluye todos los objetos no inicializados (tanto variables como constantes ) declarados en el ámbito del archivo (es decir, fuera de cualquier función) así como variables locales estáticas no inicializadas ( variables locales declaradas con la static
palabra clave ); sin embargo, las constantes locales estáticas deben inicializarse en la declaración, ya que no tienen una declaración separada y, por lo tanto, normalmente no están en la sección BSS, aunque pueden inicializarse implícita o explícitamente a cero. Una implementación también puede asignar variables y constantes asignadas estáticamente inicializadas con un valor que consiste únicamente en bits de valor cero a la sección BSS.
Peter van der Linden , un programador y autor de C, dice: "A algunas personas les gusta recordarlo como 'Mejor ahorro de espacio'. Dado que el segmento BSS solo contiene variables que aún no tienen ningún valor, en realidad no necesita almacenar la imagen de estas variables. El tamaño que BSS requerirá en tiempo de ejecución se registra en el archivo de objeto, pero BSS (a diferencia del segmento de datos) no ocupa ningún espacio real en el archivo de objeto". [10]
En Fortran , las variables de bloque comunes se asignan en este segmento. [11] Algunos compiladores pueden, para conjuntos de instrucciones de 64 bits , limitar los desplazamientos, en las instrucciones que acceden a este segmento, a 32 bits, lo que limita su tamaño a 2 GB o 4 GB. [12] [13] [14] Además, tenga en cuenta que Fortran no requiere que los datos estáticos se inicialicen a cero. En aquellos sistemas donde el segmento bss se inicializa a cero, colocar variables de bloque comunes y otros datos estáticos en ese segmento garantiza que será cero, pero para la portabilidad, los programadores no deberían depender de eso.