.bss

De la Viquipèdia, l'enciclopèdia lliure
Això mostra la disposició típica de la memòria de programa d'un ordinador simple amb el text, diverses dades i les seccions de pila (stack) i pila (heap).

A la programació d'ordinadors, el símbol d'inici de bloc (abreujat a .bss o bss) és la part d'un fitxer objecte, executable o codi de llenguatge ensamblador que conté variables assignades estàticament que es declaren però encara no se'ls ha assignat un valor. Sovint es coneix com a "secció bss" o "segment bss".

Normalment només la longitud de la secció bss, però cap dada, s'emmagatzema al fitxer objecte. El carregador de programes assigna memòria per a la secció bss quan carrega el programa. Si col·loqueu variables sense valor a la secció .bss, en comptes de la secció .data o secció rodata que requereixen dades de valor inicial, es redueix la mida del fitxer objecte.

En algunes plataformes, part o tota la secció bss s'inicialitza a zeros. Els sistemes semblants a Unix i Windows inicialitzen la secció bss a zero, permetent que les variables C i C++ assignades estàticament inicialitzades a valors representats amb tots els bits zero es posin al segment bss. Els sistemes operatius poden utilitzar una tècnica anomenada zero-fill-on-demand per implementar de manera eficient el segment bss.[1] Al programari incrustat, el segment bss s'assigna a la memòria que el sistema de temps d'execució C inicialitza a zero abans que s'introdueixi main(). Alguns sistemes C en temps d'execució poden permetre que part del segment bss no s'inicialitzi; Les variables C s'han de col·locar explícitament en aquesta part del segment bss.[2]

En algunes arquitectures d'ordinadors, la interfície binària de l'aplicació també admet un segment sbss per a "dades petites". Normalment, es pot accedir a aquests elements de dades mitjançant instruccions més breus que només poden accedir a un determinat rang d'adreces. Les arquitectures que admeten l'emmagatzematge local del fil poden utilitzar una secció tbss per a dades estàtiques no inicialitzades marcades com a fil local.[3]

Origen[modifica]

Històricament, BSS (de Block Started by Symbol) és una pseudooperació a UA-SAP (United Aircraft Symbolic Assembly Program), l'assemblador desenvolupat a mitjans dels anys 50 per a l'IBM 704 per Roy Nutt, Walter Ramshaw i altres a United. Corporació Aeronautica. La paraula clau BSS es va incorporar més tard al programa d'assemblatge FORTRAN [4] (FAP) i al programa d'assemblatge macro [5] (MAP), els assembladors estàndard d' IBM per als seus ordinadors 709 i 7090/94. Va definir una etiqueta (és a dir, símbol) i va reservar un bloc d'espai no inicialitzat per a un nombre determinat de paraules.[6] En aquesta situació, BSS va servir com a abreviatura en lloc de reservar individualment diverses ubicacions de dades més petites per separat. Alguns assembladors admeten una directiva complementària o alternativa BES, per a Block Ended by Symbol, on el símbol especificat correspon al final del bloc reservat.[7]

BSS en C[modifica]

A C, els objectes assignats estàticament sense un inicialitzador explícit s'inicien a zero (per als tipus aritmètics) o un punter nul (per als tipus de punter). Les implementacions de C solen representar valors zero i valors de punter nul amb un patró de bits que consisteix únicament en bits de valor zero (malgrat que l'estàndard C no requereix omplir bss amb zero, totes les variables en .bss s'han d'inicialitzar individualment en algun tipus). de zeros segons la secció 6.7.8 de la norma C ISO 9899:1999 o la secció 6.7.9 per a estàndards més nous). Per tant, el segment BSS normalment inclou tots els objectes no inicialitzats (tant variables com constants) declarats a l'àmbit del fitxer (és a dir, fora de qualsevol funció) així com variables locals estàtiques no inicialitzades (variables locals declarades amb la paraula clau static); Les constants locals estàtiques s'han d'inicialitzar en la declaració, però, ja que no tenen una declaració separada i, per tant, normalment no es troben a la secció BSS, encara que es poden inicialitzar implícitament o explícitament a zero. Una implementació també pot assignar variables i constants assignades estàticament inicialitzades amb un valor que consisteix únicament en bits de valor zero a la secció BSS.[8][9][10][11][12]

Referències[modifica]

  1. McKusick, Marshall Kirk. «A New Virtual Memory Implementation for Berkeley UNIX» (en anglès). University of California, Berkeley.
  2. «Memory Sections» (en anglès). AVR Libc Home page.
  3. «ELF Special Sections» (en anglès). Linux Standard Base PDA Specification 3.0RC1.
  4. FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090. IBM, 1961, p. 30. J28-6098-1. 
  5. IBM 7090/7094 IBSYS Operating System Version 13 Macro Assembly Program (MAP) Language. IBM, 1963. C28-6392-4. 
  6. Timar, Ted. «Unix - Frequently Asked Questions (1/7)».
  7. Free Software Foundation, Inc.. «38.9. Directives». Using as: Using as, the Gnu Assembler. Arxivat de l'original el 19 març 2014. [Consulta: Feb 22, 2014].
  8. Jason W. Bacon. «Chapter 10. Subprogram Calls and the Stack» (en anglès). cs.uwm.edu, 13-03-2012. Arxivat de l'original el 2014-05-02. [Consulta: 2 maig 2014].
  9. «Memory Segment - Data Segment (DS) - (ES, FS, GS)» (en anglès), 06-01-2019. [Consulta: 18 setembre 2023].
  10. «6: MIPS Memory - the Data Segment» (en anglès), 26-06-2020. [Consulta: 18 setembre 2023].
  11. TylerMSFT. «data_seg pragma» (en anglès americà), 03-08-2021. [Consulta: 18 setembre 2023].
  12. Kumar, Krishan. «Memory Layout of C Program. Code Data BSS Stack Heap Segments» (en anglès). [Consulta: 18 setembre 2023].