Thread overview
July 22, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 22, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 22, 2014

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 22, 2014

Alıntı (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?

Alıntı:

>

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.

Alıntı:

>

Ş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ı.

Alıntı:

>

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 22, 2014

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.dlang.org

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

http://www.informit.com/articles/article.aspx?p=23618&seqNum=10

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 23, 2014

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/aa366887(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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 23, 2014

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]