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 en lenguaje ensamblador que contiene variables asignadas estáticamente que se declaran pero que aún no se les ha asignado un valor. A menudo se 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 la sección .data o .rodata que requieren datos de valor inicial, se reduce el tamaño del archivo objeto.
En algunas plataformas, parte o toda la sección bss se inicializa a ceros. Los sistemas tipo Unix y Windows inicializan la sección bss a cero, lo que permite que las variables asignadas estáticamente de C y C ++ inicializadas a valores representados con todos los bits cero se coloquen en el segmento bss. Los sistemas operativos pueden usar una técnica llamada zero-fill-on-demand 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 C inicializa a cero antes de main()
ingresarlo. Algunos sistemas de tiempo de ejecución de C pueden permitir que parte del segmento bss no se inicialice; Las variables C deben colocarse explícitamente en esa parte del segmento bss. [2]
En algunas arquitecturas de computadora , la interfaz binaria de la aplicación también admite un segmento sbss para "datos pequeños". Por lo general, se puede acceder a estos elementos de datos mediante instrucciones más breves que solo pueden acceder a un cierto rango de direcciones. Las arquitecturas que admiten el almacenamiento local de subprocesos pueden usar una sección tbss para datos estáticos no inicializados marcados como locales de subprocesos. [3]
Origen
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 Corporación de Aeronaves . [4] [5] La palabra clave BSS se incorporó posteriormente 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 . Definió una etiqueta (es decir, un símbolo) y reservó un bloque de espacio no inicializado para un número determinado de palabras . [8] En esta situación, BSS sirvió como una abreviatura en lugar de reservar individualmente una serie de ubicaciones de datos más pequeñas separadas. Algunos ensambladores admiten una directiva complementaria o alternativa BES , para bloque terminado por símbolo , donde el símbolo especificado corresponde al final del bloque reservado. [9]
BSS en C
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 generalmente representan valores cero y valores de puntero nulo utilizando un patrón de bits que consta únicamente de bits de valor cero (aunque esto no es requerido por el estándar C). Por lo tanto, el segmento BSS generalmente 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 asignadas estáticamente y constantes inicializadas con un valor que consiste únicamente en bits de valor cero a la sección BSS.
Peter van der Linden , programador y autor de C, dice: "A algunas personas les gusta recordarlo como 'Mejor ahorrar 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]
BSS en Fortran
En Fortran , las variables de bloque comunes se asignan en este segmento. [11] Algunos compiladores pueden, para conjuntos de instrucciones de 64 bits , limitar las compensaciones, en las instrucciones que acceden a este segmento, a 32 bits, limitando 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, poner 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.
Ver también
Referencias
- ^ McKusick, Marshall Kirk ; Karels, Michael J. (1986). "Una nueva implementación de memoria virtual para Berkeley UNIX" (PDF) . Universidad de California, Berkeley. pag. 3. CiteSeerX 10.1.1.368.432 .
- ^ "Secciones de memoria" . Página de inicio de AVR Libc .
- ^ "Secciones especiales ELF" . Especificación de PDA base estándar de Linux 3.0RC1 .
- ^ Diccionario de red . Javvin Press, 2007, pág. 70.
- ^ Codificación para la computadora MIT-IBM 704, octubre de 1957, p. V-10
- ^ PROGRAMA DE MONTAJE DE FORTRAN (FAP) para IBM 709/7090 (PDF) . archive.computerhistory.org . IBM. 1961. p. 30. J28-6098-1 . Consultado el 18 de octubre de 2017 .
- ^ IBM 7090/7094 IBSYS Sistema operativo Versión 13 Lenguaje del programa de ensamblaje de macros (MAP) (PDF) . IBM. 1963. C28-6392-4.
- ^ Timar, Ted; et al. (1996). "Unix - Preguntas frecuentes (1/7)" . Pregunta 1.3.
- ^ Free Software Foundation, Inc. "38.9. Directivas" . Usando como: Usando como, el ensamblador GNU . Archivado desde el original el 19 de marzo de 2014 . Consultado el 22 de febrero de 2014 .
- ^ Peter van der Linden, Programación experta en C: Secretos profundos de C , Prentice Hall 1994, p. 141
- ^ ¿Cómo asigna Fortran 77 las variables de bloque común?
- ^ "Opciones de IBM RS / 6000 y PowerPC" . Usando la colección de compiladores GNU (GCC) - GCC 7.2.0 .
- ^ "Opciones SPARC" . Usando la colección de compiladores GNU (GCC) - GCC 7.2.0 .
- ^ "Opciones x86" . Usando la colección de compiladores GNU (GCC) - GCC 7.2.0 .
- Stevens, W. Richard (1992). Programación avanzada en el entorno Unix . Addison – Wesley . Sección 7.6. ISBN 0-201-56317-7.