GNU/Linux >> Znalost Linux >  >> Linux

Proč je vyžadován segment .bss?

Důvodem je zmenšení velikosti programu. Představte si, že váš program v jazyce C běží na vestavěném systému, kde jsou kód a všechny konstanty uloženy ve skutečné paměti ROM (flash paměti). V takových systémech musí být před voláním main() provedeno počáteční "copy-down", aby se nastavily všechny objekty doby trvání statického úložiště. Obvykle to bude vypadat takto pseudo:

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

memset(.bss, 
       0, 
       all_implicitly_initialized_objects);

Kde jsou .data a .bss uloženy v RAM, ale init_value je uložena v ROM. Pokud by to byl jeden segment, pak by ROM musela být zaplněna spoustou nul, čímž se velikost ROM výrazně zvětšila.

Spustitelné soubory založené na RAM fungují podobně, i když samozřejmě nemají skutečnou ROM.

Memset je také pravděpodobně velmi účinný inline assembler, což znamená, že spouštěcí kopírování může být provedeno rychleji.


.bss segment je optimalizace. Celý .bss segment je popsán jedním číslem, pravděpodobně 4 bajty nebo 8 bajty, které udává jeho velikost v běžícím procesu, zatímco .data sekce je stejně velká jako součet velikostí inicializovaných proměnných. Tedy .bss umožňuje menší a rychlejší načítání spustitelných souborů. Jinak by proměnné mohly být v .data segment s explicitní inicializací na nuly; program by jen těžko poznal rozdíl. (Podrobně adresy objektů v .bss by se pravděpodobně lišila od adresy, pokud by byla v .data segmentu.)

V prvním programu a by bylo v .data segment a b by bylo v .bss segmentu spustitelného souboru. Jakmile je program načten, rozdíl se stane nepodstatným. Za běhu b zabírá 20 * sizeof(int) bajtů.

Ve druhém programu var je přidělen prostor a přiřazení v main() upravuje ten prostor. Stane se, že mezera pro var byl popsán v .bss segment spíše než .data segment, ale to neovlivňuje způsob, jakým se program chová při spuštění.


Linux
  1. Proč server zablokoval moji IP?

  2. Proč nefunguje ~/.bash_profile?

  3. Proč je výchozí vidlice mechanismu vytváření procesu?

  1. Proč následující příkaz zabíjí systém?

  2. Linux – Proč nemůže jádro spustit inicializaci?

  3. Proč nemohu exportovat zobrazení Linuxu?

  1. Proč je hlavička programu spustitelná?

  2. Proč nemohu rolovat v terminálu?

  3. Proč je kořenový adresář označen znakem /?