GNU/Linux >> Belajar Linux >  >> Linux

Mengapa segmen .bss diperlukan?

Alasannya adalah untuk mengurangi ukuran program. Bayangkan program C Anda berjalan pada sistem tertanam, di mana kode dan semua konstanta disimpan dalam ROM sebenarnya (memori flash). Dalam sistem seperti itu, "copy-down" awal harus dijalankan untuk menyetel semua objek durasi penyimpanan statis, sebelum main() dipanggil. Ini biasanya akan seperti pseudo ini:

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

memset(.bss, 
       0, 
       all_implicitly_initialized_objects);

Di mana .data dan .bss disimpan di RAM, tetapi init_value disimpan di ROM. Jika hanya satu segmen, maka ROM harus diisi dengan banyak nol, meningkatkan ukuran ROM secara signifikan.

Executable berbasis RAM bekerja dengan cara yang sama, meskipun tentu saja mereka tidak memiliki ROM yang sebenarnya.

Selain itu, memset kemungkinan merupakan assembler inline yang sangat efisien, artinya penyalinan startup dapat dijalankan lebih cepat.


.bss segmen adalah optimasi. Seluruh .bss segmen dijelaskan oleh satu nomor, mungkin 4 byte atau 8 byte, yang memberikan ukurannya dalam proses yang berjalan, sedangkan .data bagian sebesar jumlah ukuran variabel yang diinisialisasi. Jadi, .bss membuat executable lebih kecil dan lebih cepat dimuat. Jika tidak, variabel bisa berada di .data segmen dengan inisialisasi eksplisit ke nol; program akan kesulitan untuk membedakannya. (Secara rinci, alamat objek di .bss mungkin akan berbeda dari alamat jika berada di .data segmen.)

Pada program pertama, a akan berada di .data segmen dan b akan berada di .bss segmen yang dapat dieksekusi. Setelah program dimuat, perbedaan menjadi tidak penting. Saat dijalankan, b menempati 20 * sizeof(int) byte.

Pada program kedua, var dialokasikan ruang dan tugas di main() memodifikasi ruang itu. Kebetulan ruang untuk var dijelaskan dalam .bss segmen daripada .data segmen, tetapi itu tidak memengaruhi perilaku program saat dijalankan.


Linux
  1. Mengapa Server Memblokir IP Saya?

  2. Mengapa ~/.bash_profile Tidak Berfungsi?

  3. Mengapa Garpu Mekanisme Pembuatan Proses Default?

  1. Mengapa Perintah Berikut Membunuh Sistem?

  2. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  3. Mengapa 'rm -rf /' yang mengerikan bahkan diizinkan?

  1. Mengapa saya tidak bisa menggulir di terminal?

  2. Mengapa direktori root dilambangkan dengan tanda /?

  3. Mengapa kata sandi 'sudo' berbeda dengan kata sandi 'su root'