Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
AV (Access Violation) nedir, neden bu hatayı alırız ? (+50 Puan)
#11
Cevaplar için teşekkür ederim, lâkin daha da detaylandırmak icap ediyor 50 puan verebilmem için;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol gibi konu başlıklarının incelenmesi ve bu konular hakkında daha detaylı ve anlaşılır açıklamalarda bulunulması gerekiyor.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'nin verdiği bilgilerin biraz daha açılması icap ediyor. Elbette burada maksat 50 puan gibi değersiz bir şeyi elde etmek değil. Amacımız öğrenmek ve öğrendiklerimizi paylaşmak. Bu nedenle yüzeysel olarak geçiştirmemeye çalışalım. Puanımız bol Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#12
(26-09-2017, Saat: 20:52)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlÖncelikle sayfalamadan başlarsak,Modern işlemcilerin neredeyse artık tamamında sayfalama (paging)  mekanizması vardır.

Arm işlemcilerde 4-64k arasında intel işlemcilerde 4k ile 2Mb arasında olabilir ki genellikle sayfalar 4k olur. intel işlemcilerde adreslerin bir kısmı sayfa no bir kısmı da ofsetten oluşur ki intel işlemciler genelde adresi 3 parçaya ayırır.

Yani bizim programlarda kullandığımız adresler gerçek adresler değildir, Sanal(mantıksal yada doğrusal da denebilir) adreslerdir. 

İntel işlemcilerde cr3 yazmacında sayfa tablosunun adresi yer alır. işletim sistemi sayfa tablosunu oluşturur ve adresi bu yazmaca yazar. Sayfa tablosunda sanal sayfa no, fiziksel sayfa no, erişim durumları(okuma,yazma gibi) özellikler yer alır bu tablodaki özellikler işlemcilere göre değişebilir. 

Bir prosesin sanal adresleri ardışıldır ama fiziksel adresleri ardışıl olmak zorunda değildir ve her prosesin ayrı bir sayfa tablosu vardır. Sayfa tablosundan fiziksel noyu alan işlemci ofset değerini de ekleyerek gerçek adresi bulur. Sayfalama sisteminin bir prosesin bellekte tek başına çalıştığını sanması diğerlerinden ayrıştırılması, fragmentasyonu(hafıza boşluklarını) engellemek gibi faydaları vardır.

Prosesler iki modda çalışabilir birincisi standart programlar için user mod, ikincisi aygıt sürücüleri ve kernel modulleri için kernel mod. 

User modda proses sadece kendi sayfalarına ulaşabilir, 
Kernel modda ise tüm sayfalara ulaşabilir. Ayrıca user modddaki proses kritik makine kodlarını kullanamazken kernel modda kullanır.

User moddaki bir proses kernel mod bir sayfaya ulaşmaya çalışırsa page fault denilen içsel bir kesme oluşur ve acces violation hatası oluşur ve işletim sistemi prosesi hemen cezalandırır ve bir hata bilgisiyle sonlandırır.  Ayrıca proses kendisine ait olmayan başka bir prosesin sayfasına user modda erişmeye çalışırsa yine aynı sonuç oluşur ve cezalandırılır. 

Fakat user moddaki bir proses sistem fonksiyonlarını kullanırken işletim sistemi onu fonksiyon sonlanana kadar kernel moda aldığı için sistem fonksiyonlarının izin verdiği ölçüde diğer proseslerin bilgisine erişebilir bu kez acces violation oluşmaz. 

Ayrıca son olarak bütün page fault kesmeleri kötü değildir özellikle windows'ta bir programın tamamı yüklenmez belleğe yalnızca kullanılan kısmı yüklenir fakat kullanılmayan kısımla ilgili bir talepte bulunduğumuzda yine bu kesme oluşur ve işletim sistemi eksik olan sayfaları yükler ve biz bir şey fark etmeden kullanmaya devam ederiz. Aklıma şimdilik gelenler bunlar.

Anlatım ve Örneklemeler anlaşılır olmuş teşekkürler.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#13
Hocam ben özet geçtim Smile
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#14
(27-09-2017, Saat: 10:59)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam ben özet geçtim Smile

Detaylandırın, puanlarınız hazır  Smile

Çok detaylı ve gerçekten emek sarfedilerek yapılacak bir açıklamaya +100 puan vereceğim. Puanı yükselttim Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#15
(27-09-2017, Saat: 12:29)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(27-09-2017, Saat: 10:59)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam ben özet geçtim Smile

Detaylandırın, puanlarınız hazır  Smile

Çok detaylı ve gerçekten emek sarfedilerek yapılacak bir açıklamaya +100 puan vereceğim. Puanı yükselttim Wink

Hocam yazarım ama zaman alır,çünkü bu konuları ayrıntılarıyla anlatmak kapsamlı bir çalışma gerektirir.Ama taahhüdüm olsun işten fırsat buldukça yazayım bir çalışma hazırlayayım foruma.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#16
(27-09-2017, Saat: 18:43)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(27-09-2017, Saat: 12:29)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDetaylandırın, puanlarınız hazır  Smile

Çok detaylı ve gerçekten emek sarfedilerek yapılacak bir açıklamaya +100 puan vereceğim. Puanı yükselttim Wink

Hocam yazarım ama zaman alır,çünkü bu konuları ayrıntılarıyla anlatmak kapsamlı bir çalışma gerektirir.Ama taahhüdüm olsun işten fırsat buldukça yazayım bir çalışma hazırlayayım foruma.

Tabii, maksat zaten araştırmaya sevk etmek. Bekliyoruz Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#17
Hocam sanırım sorunun amacı, access violation'dan virtual memory'nin çalışma mekanizmasına uzanan yolculuk gibi görünüyor.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
 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.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
 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.
My name is nobody.
WWW
Cevapla
#18
Teşekkürler güzel kardeşim. Evet Access Violation'ın nedenlerini anlamak uzun bir yolculuk gerektiriyor. Çok fazla detay bilmeden de kısaca hafıza erişim ihlali olarak bakabilirsiniz ama daha fazla bilmenin kimseye bir zararı olmaz elbette.

Bu yolculuk Virtual Memory'den başlar, process ve thread'lerin virtual memory'yi kullanma biçimleri ile devam eder; kernel'daki yapılara kadar iner oradan da CPU yazmaçlarına kadar gider.

Sabır ile bu yolculuğa devam edenler bir çok şeyin farkındalığına varacaklar ve artık çok daha bilinçli olacaklardır. Dediğin gibi bu basit bir soru değildi, bu nedenle +100 puanı var  Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#19
Hocam teşekkür etmesi gereken birisi varsa, öğrenen taraf olarak ben/biz olduğumuz için ben teşekkür ederim.

Acaba AV hatası alacak mıyım bir deneyeyim, göreyim düşüncesiyle denedim.
AV hatasını alıp, fonksiyonun nasıl çalıştığını anladığını sanmak doğru değil tabi, insan anladığını, bildiğini sanmak ile kalır.
Her bir fonksiyonun, parametrelerinin ansiklopedi gibi dokümanı var.

Eğer yanlış bilmiyorsam, C/C++ gibi dillerde malloc, new operatörü çağırımında windows'da internal olarak VirtualAlloc fonksiyonuna kadar gidiyor.
My name is nobody.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Tek dizi içinde öncelik sırası belirleme (+10 puan) Abdullah ILGAZ 4 780 29-11-2017, Saat: 12:07
Son Yorum: SimaWB
  Bir Record'un içini doldurma (+20 puan) Tuğrul HELVACI 21 2.180 05-10-2017, Saat: 16:33
Son Yorum: ismailkocacan
  Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) Tuğrul HELVACI 21 1.915 08-09-2017, Saat: 13:55
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi