GNU/Linux >> Linux Esercitazione >  >> Linux

Perché è necessario il segmento .bss?

Il motivo è ridurre le dimensioni del programma. Immagina che il tuo programma C venga eseguito su un sistema embedded, in cui il codice e tutte le costanti vengono salvate nella vera ROM (memoria flash). In tali sistemi, deve essere eseguito un "copy-down" iniziale per impostare tutti gli oggetti di durata dell'archiviazione statica, prima che venga chiamato main(). In genere sarà così pseudo:

for(i=0; i<all_explicitly_initialized_objects; i++)
{
  .data[i] = init_value[i];
}

memset(.bss, 
       0, 
       all_implicitly_initialized_objects);

Dove .data e .bss sono memorizzati nella RAM, ma init_value è memorizzato nella ROM. Se fosse stato un segmento, la ROM doveva essere riempita con molti zeri, aumentando significativamente le dimensioni della ROM.

Gli eseguibili basati su RAM funzionano in modo simile, sebbene ovviamente non abbiano una vera ROM.

Inoltre, memset è probabilmente un assemblatore inline molto efficiente, il che significa che il copydown di avvio può essere eseguito più velocemente.


Il .bss segmento è un'ottimizzazione. L'intero .bss segmento è descritto da un singolo numero, probabilmente 4 byte o 8 byte, che ne indica la dimensione nel processo in esecuzione, mentre il .data section è grande quanto la somma delle dimensioni delle variabili inizializzate. Pertanto, il .bss rende gli eseguibili più piccoli e più veloci da caricare. Altrimenti, le variabili potrebbero trovarsi nel .data segmento con inizializzazione esplicita a zero; il programma farebbe fatica a capire la differenza. (In dettaglio, l'indirizzo degli oggetti in .bss sarebbe probabilmente diverso dall'indirizzo se fosse nel .data segmento.)

Nel primo programma, a sarebbe nell'.data segmento e b sarebbe nel .bss segmento dell'eseguibile. Una volta caricato il programma, la distinzione diventa irrilevante. In fase di esecuzione, b occupa 20 * sizeof(int) byte.

Nel secondo programma, var è lo spazio allocato e l'assegnazione in main() modifica quello spazio. Accade così che lo spazio per var è stato descritto nel .bss segmento anziché il .data segmento, ma ciò non influisce sul modo in cui il programma si comporta durante l'esecuzione.


Linux
  1. Perché il meccanismo di creazione del processo predefinito è fork?

  2. Linux:perché il kernel non può eseguire Init?

  3. Perché non riesco a esportare il display Linux?

  4. Perché il terribile 'rm -rf /' è persino permesso?

  5. Perché non riesco a scorrere nel terminale?

Perché ora è il momento migliore per usare GNOME

Perché usare il desktop Pantheon per Linux Elementary OS

Perché sono passato da Mac a Linux

La mia storia su Linux:perché presentare alle persone il Raspberry Pi

Perché non installare pacchetti software da Internet

Perché è possibile capovolgere lo schermo?