Çalışabilen Dosyanın Bölümleri ve UNIX/Linux Sistemlerinde Process’in Bellek Alanı
Tipik bir çalışabilen dosya temelde 5 bölümden oluşur.
Header
.text // Kod
.data // Data (ilk değer verilmiş)
.bss // Data (ilk değer verilmemiş)
.stack // Stack
Bu bölümler şüphesiz çalışabilen dosyanın formatı ile ilgilidir. Örneğin MZ, ELF, a.out
formatlarında tipik olarak bölümler yukarıdaki gibidir. Programın kod bölümünde
fonksiyonların makine komutları tutulur (bu bölüm genellikle .text biçiminde
isimlendirilmektedir).
.data bölümü static ömürlü nesnelerin tutulduğu bölümdür. .data bölümü genellikle ikiye
ayrılır; .data ismi ile belirtilen bölüm ilk değer verilmiş static nesneleri, .bss biçiminde
isimlendirilen alan ise ilk değer verilmemiş static nesneleri içerir. Yerel değişkenler tipik
olarak stack bölümünde tutulurlar. İlk değer verilmemiş static ömürlü nesnelerin ayrı bir
bölümde tutulmasının nedeni çalışabilen dosyada gereksiz yer kaplamasını engellemektir.
Örneğin,
int g_a[1000000];
bu global dizi .data bölümünde tutulsaydı, çalışabilen dosya en azından 4MB olurdu. Halbuki
.bss bölümünde bu dizi bilgisi “burada şu uzunlukta dizi var” biçiminde yazılmaktadır.
Şüphesiz .bss bölümü açılıp yüklendiğinde yükleyici tarafından bu bölüm sıfırlar ile
doldurulmaktadır. .bss bölümü bazı sistemlerde yükleyici tarafından değil, derleyicinin
başlangıç kodu tarafından sıfırlanmaktadır.
UNIX/Linux sistemelrinde tipik olarak process’in bellek alanı şöyledir:
Header
.text
.data
.bss
Heap
Stack
System
Görüldüğü gibi stack bölümü boşuna büyürse heap bölgesiyle çakışır ve probleme yol açar.
Bazı dosya formatlarında ve sistemlerde stack bölgesinin en fazla ne kadar büyütüleceği
belirlenmektedir. Örneğin Win32 sistemlerinde stack uzunluğu PE formatında belirlenir ve
stack bu uzunluğu çalışma zamanında aşamaz. Eğer aşarsa koruma mekanizmasından
faydalanılarak program sonlandırılır. Bazı sistemlerde (örneğin DOS ve UNIX sistemlerinde)
stack sınırlanmaz, ancak programın çalışma zamanı sırasında heap bölgesiyle çakışma
sonucunda program çökebilir. Tabii işletim sistemleri koruma mekanizmasından
faydalanılarak stack ile heap bölgesinin çakışmasını kolaylıkla tespit ederler. Yani stack
bölgesinin serbest büyüyebildiği sistemlerde stack çakışması yine tespit edilebilmektedir.