.bss
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
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
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
- ↑ McKusick, Marshall Kirk. «A New Virtual Memory Implementation for Berkeley UNIX» (en anglès). University of California, Berkeley.
- ↑ «Memory Sections» (en anglès). AVR Libc Home page.
- ↑ «ELF Special Sections» (en anglès). Linux Standard Base PDA Specification 3.0RC1.
- ↑ FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090. IBM, 1961, p. 30. J28-6098-1.
- ↑ IBM 7090/7094 IBSYS Operating System Version 13 Macro Assembly Program (MAP) Language. IBM, 1963. C28-6392-4.
- ↑ Timar, Ted. «Unix - Frequently Asked Questions (1/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].
- ↑ 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].
- ↑ «Memory Segment - Data Segment (DS) - (ES, FS, GS)» (en anglès), 06-01-2019. [Consulta: 18 setembre 2023].
- ↑ «6: MIPS Memory - the Data Segment» (en anglès), 26-06-2020. [Consulta: 18 setembre 2023].
- ↑ TylerMSFT. «data_seg pragma» (en anglès americà), 03-08-2021. [Consulta: 18 setembre 2023].
- ↑ Kumar, Krishan. «Memory Layout of C Program. Code Data BSS Stack Heap Segments» (en anglès). [Consulta: 18 setembre 2023].