Stack ve Heap Bölgesi Hakkında

Başlatan fatihinanc, 07 Temmuz 2011, 09:52:12

yamak

@gerbay hocam
Alıntı Yapeğer sizin programınızda malloc/calloc/alloc/strdup/new     vs. çağrısı yapılmıyorsa hiç bir zaman (kullandığınız kütüphanelerin içi dahil) bu durumda heap in boyunu 0 (sıfır) olarak tanımlayın boş yere yer ayrılmasın..
Bunun tam tersi de doğru mudur.Yani en ufak bir dinamik bellek tahsisi yapsak heap artırmak zorunda mıyız? Yani start up dosyasında heap i 0 olarak bıraksak dinamik bellek tahsisatı yapamaz mıyız?
Bi de bu stack olayı mimariye göre değişiyo değil mi? Yani PIC MCU larda stack te artırıp azaltma yapamyız di mi? Çünkü PIC lerde stack ram den ayrı biryer.

yamak

Peki hocam fragmentation oluşmaması için nasıl bi yol izlememiz gerekir.Ya da dinamik bellek kullanıyorsak bu durum kaçınılmaz mı?

Tagli

İşletim sistemleri bu sorunu nasıl çözüyor? İşletim sistemi kullanmasak bile, belli aralıklarla çalışıp hafızayı düzene sokan bir programcık yazabilir miyiz? Bu durumda mevcut adresleme yapısının çökmesi nasıl engellenir? Modern işletim sistemlerinde kullanılan sanal bellek olayının çıkış noktası bu mu? Yani program içinde sanal adresler değişmiyor ama ayrılan alan programın haberi olmadan başka bir yere taşınabiliyor (yanlış bilmiyorsam...).
Gökçe Tağlıoğlu

z

Alıntı yapılan: Tagli - 05 Aralık 2012, 11:33:00
İşletim sistemleri bu sorunu nasıl çözüyor? İşletim sistemi kullanmasak bile, belli aralıklarla çalışıp hafızayı düzene sokan bir programcık yazabilir miyiz? Bu durumda mevcut adresleme yapısının çökmesi nasıl engellenir? Modern işletim sistemlerinde kullanılan sanal bellek olayının çıkış noktası bu mu? Yani program içinde sanal adresler değişmiyor ama ayrılan alan programın haberi olmadan başka bir yere taşınabiliyor (yanlış bilmiyorsam...).

İşlemcinin memory erişim komutları adresi iki registerin toplamı şeklinde kullanabiliyorsa bu dediğiniz oldukça kolay bir işlem.

Örneğin MOV  A,[B+C] gibi sanal bir komut düşün.

Memory'nin 0x1000 adresinde değişkenlerin olsun.

B=0x1000 yaptığında örneğin C=0......0x100 aralığında program 0x1000...0x1100 aralığındaki değişkenlere erişir.

Programdaki jump adresler, relatif adres olarak oluşturulduğunda artık hiç sorun kalmaz.

Aynı programı dilediğin adrese taşıyabilirsin.  Değişkenleri de 0x2000...0x2100 aralığında kullanmak istersen

Bu durumda sadece B=0x2000 yapman yeterli olur.

Bu durumda programda hiç bir değişiklik yapmana gerek kalmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam PC lerde dediğim gibi değilmi?

İşletilecek exe program çalıştırılmak istendiğinde programın, ramın hangi adresine yükleneneceği, değişkenlerin hangi adrese yerleşeceği program yazım aşamasında en başta kestirilemez.

Fakat işletim sistemi ramın o anki kullanılabilir durumdaki adresine programı yükler CS, DS, ES işletim sistemi tarafından init edilir ve kod koşmaya bırakılır.

MMU kullanmadan ARM işlemcide pozisyondan bağımsız kod yazmamı engelleyen durum nedir?

80x86 da da ARM işlemcide de MMU suz bu iş olur çünkü işlemcinin adresleme yeteneği bu işe uygun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com