Forum: D Programlama Dili RSS
Belirli bir adresten itibaren malloc yapmak
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Belirli bir adresten itibaren malloc yapmak
Kafama takıldı acayip merak ettim. Şimdi her programın kendi sanal adreslemesi oluyor. O halde bütün sanal adres bizim sayılmaz mı? Yapmak istediğim şey programın belirli bir adres blokunu sadece belirli bir malloc fonksiyonumuz için ayıracağız ve sadece lazım oldukça ilgili adresi işletim sisteminden isteyeceğiz.

Örnek vermek gerekirse
01000000
04000000

adres bloku arasını kendimize ayıracağız. Diğer malloc veya new işlemleri tarafından hiç bir şekilde kullanılmayacak bu blok ve ram de de yer tutmayacak biz bu bloku muaf tuttuğumuz sırada. Biz malloc yaparken özellikle o adres bloku arasında malloc yapmasını isteyeceğiz ve işte o zaman ram de yer tutmaya başlayacak.

Böyle bir şeyi yapmak mümkün müdür? Mümkünse de sanırsam windows apilerini kullanmak gerekecek.

Biraz anlatımım zayıf oldu kusura bakmayın.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bunu yapamamanın bir nedeni, o adres yine aynı programda zaten başka bir amaçla kullanılıyor olabilir.

Adresin 01000000 gibi özel bir değer olması gerekiyor mu? GC.malloc veya std.c.stdlib.malloc ile ayırsan ve eline geçen adresi kullansan? O bölge sen geri verene kadar sana aittir.

İşletim sistemlerinin çeşitli eniyileştirmeleri var. Örneğin ayırıp da dokunmasan sisteme yük getirmeyecektir. Yine de bellek kullanıyor gibi görünebilir veya o bellek diske yazılmış olabilir ama sen bir daha dokunana kadar sessizce bir kenarda durur.

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu sene kafamdaki şeyi uygulama niyetim yok fakat şu boş birkaç günümü bunu düşünerek değerlendirebilirim diye düşündüm. JIT compiler yapıp jit in kendi ram hafızası ve çalışacak kodun ram hafızasının farklı aralıklarda olmasını istiyorum. Adres değerini de sayfa ve offset şeklinde değerlendireceğim ve bir tablo oluşturup işlemlerimi o tabloya göre yapacağım. Offset ve sayfa olayını yapabilmem için de belirli bir ram aralığına (aslında 3 gb lık bir ram alanı olarak düşünüyorum bunu) kesinlikle benim isteğim dışında bir veri girişi olmayacak. Şimdi malloc ile ayırsam ram kullanımında 3 gb gözükecektir. Bunu istemiyorum onun yerine programın o belirlediğim ram alanına hiç bir şekilde veri yazmadığından emin olmam gerekiyor.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
kendi ram hafızası ve çalışacak kodun ram hafızasının farklı aralıklarda olmasını istiyorum

İki kere ayırırsan farklı yerlerde olur:
    void* kendi = GC.calloc(100);
    void* kod = GC.calloc(200);
Yeterli değil mi?

kesinlikle benim isteğim dışında bir veri girişi olmayacak

Derleyip çalıştırdığın kodun yanlışlıkla sana ait bölgelere yazmasını mı önlemek istiyorsun? Bunu protected memory olanaklarıyla sağlayabilirsin.

Şimdi malloc ile ayırsam ram kullanımında 3 gb gözükecektir

İhtiyacın yoksa 3G ayırmamalısın tabii. Ama ihtiyacın varsa da ayırmak zorundasın ve o zaman 3G gözükmesinde bir sakınca olmamalı.

o belirlediğim ram alanına hiç bir şekilde veri yazmadığından emin olmam gerekiyor

Evet, sanırım protected memory olanaklarından yararlanmak zorundasın. Bunun için mprotect varmış ama erişim hakları bütün programa ait oluyormuş:

  http://man7.org/linux/man-pages/man2/mprotect.2.html

Yani, eğer kendi kodların ve derlediğin kodlar aynı programda (yani, process'te) işleyeceklerse yine birbirlerinden koruyamıyorsun galiba.

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
mprotect ve mmap D ile JIT derleyicisi yazan ve iki kere DConf konuşmacısı olan Maxime Chevalier'nin açtığı bir konuda geçmiş:

  http://forum.dlang.org/thread/vrtbpcrabpcrlbqaheja@forum.d…

Ayrıca, şuradaki yazıya ve örneğe bakılırsa programı kendisinden korumak da mümkünmüş:

  http://www.informit.com/articles/article.a…?p=23618&…

Ali
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Mprotecti biliyorum fakat o konudaki projeyi görmemiştim baya işime yarayacak gibi duruyor.

Aslında ihtiyacım olan şey:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa…(v=vs.85).aspx buradaki reserve. Veya mprotect in windows karşılığı (sanırım) VirtualProtect deki no access.

Bunları denedim ama çalışmadı.

JIT hafızası ile çalıştırılacak olan kodun hafızasının kesinlikle birbirinden ayrı olması ve malloc edilen adresin sürekli aynı olması işime gelecektir. Aslında bir nevi rezerve edeceğim.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
malloc edilen adresin sürekli aynı olması işime gelecektir. Aslında bir nevi rezerve edeceğim.

Bildiğim kadarıyla mümkün değil. Hatta, programlar güvenlik açısından hep farklı adresler üzerinde işliyorlarmış. Böylece kötü niyetli programlar neresini değiştireceklerini bilemiyorlar.

Program yığıtı da o yüzden hep farklı adreste görünüyor diye düşünüyorum; eskiden yerel bir değişkenin adresi hep aynı çıkardı. Aşağıdaki program her işleyişte farklı adres gösteriyor:
import std.stdio;
 
void main()
{
    int i;
    writeln(&i);
}
Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:05:43 (UTC -08:00)