Hocam sanırım sorunun amacı, access violation'dan virtual memory'nin çalışma mekanizmasına uzanan yolculuk gibi görünüyor.
Hafıza Yönetimi Hakkında
32-bit Microsoft Windows işletim sistemi üzerinde çalışan her bir Process kendi sanal adres alanına sahiptir ve hafızanın 4 GB'ına kadar adresleme yapabilir.64-bit Microsoft Windows işletim sistemi üzerinde çalışan her bir Process sanal adres alanının 8 terabayt'ına sahiptir.
Bir Process'in tüm thread'leri kendi adres alanına erişebilir.
Ancak thread'ler başka bir Process'in hafızasına erişemez.Böylece bir Process'in başka bir Process'deki veriye erişip bozması engellenmiş olur.
Sanal Adres Alanı Ve Fiziksel Hafıza
Windows işletim sisteminde, windows sürümüne bağlı olarak, maximum bellek desteği 2 GB ile 2 TB arasındadır.Her bir Process'in sanal adress alanı, bilgisayarın toplam fiziksel belleğinden daha küçük veya daha büyük olabilir
.Eğer Process'in thread'leri mevcut fiziksel belleğin daha fazlasını kullanmak isterse, hafızadaki bazı sayfalar diske gönderilir.Bir Process için kullanılabilen sanal adres alanının toplam miktarı, fiziksel bellek ve mevcut diskteki boş alan ile sınırlıdır.
VirtualAlloc Function
Process'in sanal adres alanındaki sayfaların bir bölgesini ayırır(rezervasyon), commit eder veya durumunu değiştirir.Bu fonksiyon ile hafızadan alan tahsis edildiğinde, otomatik olarak 0 olarak başlatılır.Yani fazladan hafızayı sıfırlayan ZeroMemory gibi fonksiyonları kullanmamıza gerek yok.
Working Set
Bir Process'in working set'inin anlamı;Fiziksel bellekte bulunan Process'in sanal adres alanı içerisindeki sayfalar kümesidir.
Working Set = Sayfalar kümesi.
Working Set'ler sadece sayfalanabilir hafıza tahsisatlarını içerir.
AWE gibi sayfalanamayan hafıza tahsisatlarını veya büyük sayfa tahsisatları working set'e dahil edilmez.
Aşağıdaki faaliyetlerden sonra Process'in working set'inden sayfalar kaldırabilir.
-
SetProcessWorkingSetSize,
SetProcessWorkingSetSizeEx,
EmptyWorkingSet fonksiyonları ile Process'in working set'i azaltılıp, boşaltılabilir.
- Process kilitli olmayan bir hafıza aralığında
VirtualUnlock fonksiyonunu çağırabilir.
- Process
UnmapViewOfFile fonksiyonunu çağırarak bir dosyanın mapped view'ini hafızadan kaldırabilir.
- Hafıza yönetimi, daha fazla hafıza oluşturmak için, working set'deki sayfaları tıraşlar.
- Hafıza yönetimi, yeni bir sayfaya yer açmak için working set'den bir sayfa kaldırmalıdır.(Çünkü working set en büyük boyuttadır)
Birden fazla Process, bir sayfayı paylaşıyorsa, bir Process'in working set'inden sayfa silmek diğer Process'leri etkilemez.
Her Process en düşük ve en büyük working set boyutlarına sahiptir.Bu boyutlar Process'in sanal bellek sayfalama davranışını etkiler.
Belirtilen Process'in working set güncel boyutunu elde etmek için
GetProcessMemoryInfo fonksiyonu kullanılır.
Aynı şekilde Process'in en düşük ve büyük working set boyutlarını okumak veya değiştirmek için
GetProcessWorkingSetSizeEx ve
SetProcessWorkingSetSizeEx
fonksiyonları kullanılır.
Page State
Process'in sanal adres alanındaki sayfa durumları aşağıdakilerden biridir.
- Free :
Sayfa ne commit edilmiştir ne de reservasyon yapılmıştır.Sayfa Process için erişebilir durumda değildir.
Bu sayfa reservasyon yapmak, commit etmek veya aynı anda(eş zamanlı) reservasyon yapmak ve commit etmek için müsaittir.
Bu sayfaya okuma veya yazma gibi bir hamle yaparsanız, bunun sonuçu erişim ihlali istinası/hatası(access violation exception)dır.
Bir Process
VirtualFree,
VirtualFreeEx fonksiyonlarını çağırarak, adres alanı içerisindeki reservasyon veya commit edilmiş sayfaları serbest bırakabilir.Sayfanın durumu bu aşamadan sonra Free durumuna döner.
- Reserved :
Sayfa gelecekte kullanılmak üzere ayrılmıştır.Adres aralığı diğer tahsisat fonksiyonları ile kullanılamaz.
Sayfa erişilebilir değildir ve fiziksel bellek ile bir ilişkisi yoktur.Sayfa durumu commit edilmeye müsait durumdadır.
VirtualAlloc,
VirtualAllocEx ile reservasyon yapılabilir.Daha sonra reservasyon yapılan sayfalara commit edilebilir.
VirtualFree,
VirtualFreeEx ile commit edilen sayfalardaki commitler kaldırabilir.Sayfanın durumu reserved durumuna döner.
- Committed :
Hafıza tahsisat işlemi RAM'in (Fiziksel bellek) tüm boyutu ve disk üzerindeki sayfalama dosyalarından oluşmuştur.
Sayfa erişilebilir ve hafıza koruma sabitlerinden(memory protection constants) biri ile kontrol edilir.
Sistem commit edilen her sayfayı, ilk defa okuma ve yazma esnasında fiziksel belleğe yükler.
Process sonladığında commit edilen sayfalar serbest bırakılır.
Rezervasyon yapılan bir hafıza alanından,
VirtualAlloc veya
VirtualAllocEx ile fiziksel sayfalar oluşturabilir.
GlobalAlloc ve
LocalAlloc fonksiyonları commit edilen sayfaları okuma/yazma yetkisi ile birlikte tahsis eder.
Memory Protection Constants
Aşağıda hafıza koruma sabitleri seçenekleri bulunmaktadır.Hafızada bir sayfayı tahsis etmek veya koruma yapmak için aşağıdaki değerlerden bir tanesi ile belirtmelisiniz.Koruma nitelikleri bir sayfanın bir kısmına atanamaz;koruma nitelikleri sadece tüm sayfaya atanabilir.
... devamı reklamlardan sonra
var
P: PInteger;
V : Integer;
begin
P := VirtualAlloc(nil, // If this parameter is NULL, the system determines where to allocate the region.
SizeOf(Integer),
MEM_COMMIT,
PAGE_NOACCESS); // Disables all access to the committed region of pages. An attempt to read from, write to, or execute the committed region results in an access violation.
if P = nil then
RaiseLastOSError();
P^ := 31; // Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005c9d69: write of address 0x03b10000'.
V := P^; // Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005c9d69: read of address 0x03b10000'.
var
P: PInteger;
V: Integer;
begin
P := VirtualAlloc(nil, SizeOf(Integer), MEM_COMMIT, PAGE_READWRITE);
if P = nil then
RaiseLastOSError();
P^ := 31;
V := P^;
Henüz diğer dokümanları çok detaylı inceleyemedim.Vakit bulursam yine yazarım.
Eksik ya da yanlış gören düzeltirse de sevinirim.