Articulo de referencia

.bss

En programación informática , el símbolo de inicio de bloque (abreviado como .bss o bss ) es la parte de un archivo objeto , ejecutable o código en lenguaje ensamblador que cont...

En programación informática , el símbolo de inicio de bloque (abreviado como .bss o bss ) es la parte de un archivo objeto , ejecutable o código en lenguaje ensamblador que contiene variables asignadas estáticamente que se declaran pero aún no tienen un valor asignado. A menudo se le denomina "sección bss" o "segmento bss".

Normalmente, solo se almacena la longitud de la sección bss, pero no los datos, en el archivo objeto . El cargador de programas asigna memoria para la sección bss al cargar el programa. Al colocar variables sin valor en la sección .bss, en lugar de en las secciones .data o .rodata, que requieren datos de valor inicial, se reduce el tamaño del archivo objeto.

En algunas plataformas, parte o la totalidad de la sección bss se inicializa a cero. Los sistemas tipo Unix y Windows inicializan la sección bss a cero, lo que permite utilizarla para variables asignadas estáticamente en C y C++ que se inicializan con todos los bits a cero. Los sistemas operativos pueden utilizar una técnica denominada relleno a cero bajo demanda para implementar eficientemente el segmento bss. [ 1 ] En el software embebido, el segmento bss se asigna a una memoria que el sistema de ejecución de C inicializa a cero antes main()de su entrada. Algunos sistemas de ejecución de C permiten que parte del segmento bss no se inicialice; las variables de C deben colocarse explícitamente en esa porción 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 datos mediante instrucciones más cortas que solo pueden acceder a un rango determinado de direcciones. Las arquitecturas que admiten almacenamiento local de subprocesos podrían usar una sección tbss para datos estáticos no inicializados marcados como locales de subprocesos. [ 3 ]

Origen

Esto muestra la disposición típica de la memoria de programa de una computadora simple, con las secciones de texto, datos diversos, pila y montón.

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ó posteriormente al FORTRAN Assembly Program [ 6 ] (FAP) y al Macro Assembly Program [ 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 un número determinado de palabras . [ 8 ] En esta situación, BSS servía como una abreviatura en lugar de reservar individualmente varias ubicaciones de datos más pequeñas por separado. 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 ]

BSS en C

En C , los objetos asignados estáticamente sin un inicializador explícito se inicializan a cero (para tipos aritméticos) o a un puntero nulo (para tipos de puntero). Las implementaciones de C suelen representar los valores cero y los valores de puntero nulo mediante un patrón de bits compuesto únicamente por bits con valor cero (aunque el estándar C no exige que se rellene bss con cero, todas las variables en .bss deben inicializarse individualmente con algún tipo de cero según la Sección 6.7.8 del Estándar ISO 9899:1999 de C o la Sección 6.7.9 para estándares más recientes). 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 las variables locales estáticas no inicializadas ( variables locales declaradas con la staticpalabra 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 con valor cero, a la sección BSS.

Peter van der Linden , programador y autor de C, dice: "Algunas personas prefieren recordarlo como 'Better Save Space' (Ahorro de espacio mejor). 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 objeto, pero BSS (a diferencia del segmento de datos) no ocupa ningún espacio real en el archivo 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 los desplazamientos, 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, 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.

Véase también

Referencias

  1. McKusick, Marshall Kirk ; Karels, Michael J. (1986). "Una nueva implementación de memoria virtual para Berkeley UNIX" (PDF) . Universidad de California, Berkeley. pág.  3. CiteSeerX 10.1.1.368.432 . 
  2. "Secciones de memoria" . Página principal de AVR Libc .
  3. "Secciones especiales de ELF" . Especificación PDA base estándar de Linux 3.0RC1 .
  4. Diccionario de redes . Javvin Press, 2007, pág. 70.
  5. Programación para el ordenador MIT-IBM 704, octubre de 1957, pág. V-10
  6. PROGRAMA DE ENSAMBLAJE FORTRAN (FAP) para IBM 709/7090 (PDF) . IBM. 1961. pág. 30. J28-6098-1 . Consultado el 18 de octubre de 2017 . 
  7. IBM 7090/7094 IBSYS Sistema Operativo Versión 13 Lenguaje de Programación de Macrosensamblaje (MAP) (PDF) . IBM. 1963. C28-6392-4.
  8. Timar, Ted; et al. (1996). "Unix - Preguntas frecuentes (1/7)" . Pregunta 1.3. 
  9. Free Software Foundation, Inc. "38.9. Directivas" . Uso como: Uso como, el ensamblador Gnu . Archivado del original el 19 de marzo de 2014. Recuperado el 22 de febrero de 2014 .
  10. Peter van der Linden, Expert C Programming: Deep C Secrets , Prentice Hall 1994, pág. 141
  11. ¿Cómo asigna Fortran 77 las variables de bloque común?
  12. "Opciones de IBM RS/6000 y PowerPC" . Uso de la colección de compiladores GNU (GCC) GCC 7.2.0 . 
  13. "Opciones SPARC" . Uso de la colección de compiladores GNU (GCC) GCC 7.2.0 . 
  14. "Opciones x86" . Uso de la colección de compiladores GNU (GCC) GCC 7.2.0 .