Feragatname: Bu cevabın çoğu Windows merkezli, özellikle terminolojinin bir kısmı ve x86 / x64 merkezli. Kavramların çoğu, diğer genel amaçlı sanal bellek işletim sistemleri ve çoğu diğer platformlar için geçerlidir, ancak ince detaylar ve bazı terimler farklı olacaktır.
Programın bir kısmı yürütme sırasında sabit diskte saklanır, yani sanal bellekte, değil mi?
Evet, ama hepsi bu kadar VM için değil. (n.b .: Bu cevaptaki "VM", her zaman "sanal bellek" anlamına gelmez, asla "sanal makine" anlamına gelir.) Tipik bir VM ortamında, programın + adres alanının tüm adres alanı sanal bellekte kabul edilir.
Herhangi bir anda, bir sanal bellek alt kümesi RAM'de "anlamlıdır" ve bir sayfa hatasına neden olmadan başvuru yapılabilir "anlamına gelir". Geri kalanların çoğu, bugünlerde hemen hemen her zaman genellikle disk veya SSD olan “ikincil depolama” dır. (Özellikle yerleşik olmayan sanal belleği tutmak için özellikle kullanılmakta olan "ikincil depolama" için bir başka ad "yedek depo" dır.)
Sanal adres alanının üçüncü bir alt kümesi var, bu RAM'de olan ama yine de buna ulaşmak için bir sayfa hatası gerektirecek bir şey - Windows'ta bu, değiştirilmiş veya beklemede olan sayfa listesinde veya zaten paylaşılmış bir sayfada olacak RAM’de başka bir işlem için, ancak hataya neden olan işlem için geçerli değil. Ayrıca "sıfır talep" hataları da var. Bunların hepsi "yumuşak hata" örnekleridir, yani disk okumayanlar. Bu davalara girmeyeceğim çünkü bu zaten uzun bir cevap olacak ve ayrıca sorunuzla ilgisi yok: hiçbiri sayfanın değiştirilmesini gerektirmiyor.
sanal belleğin, sayfalama sisteminde bu sayfaların sabit büyüklükte olduğu (4KByte gibi) veri bloklarına bölündüğü yerlerde, bu sayfaların bazıları (ana bellekte var olan ve yüklü) gerçek fiziksel adreslere eşlenir ve saklanır. sabit boyutlu veri bloğu (örneğin 4kbayt olan sayfalarla aynı boyutta) ve bu veri bloklarına sayfa çerçeveleri "ya da Sadece Kareler" denir.
RAM, sayfalarının içeriği değil, "veri çerçevesi" olarak adlandırılan sayfalardır. Ayrıca btw, bu sadece veri değil, aynı zamanda programlamanın sayfalama tarafından getirilen kodudur.
sanal hafıza ile fiziksel hafıza arasında eşleştirme tablosu var mı?
Evet. Sayfa tabloları denir. Bunu düşünmenin daha iyi bir yolu, sayfa tablolarının sanal sayfa numaraları ile fiziksel sayfa numaraları, yani sayfa çerçeve numaraları arasında eşleşmesidir. Yani izin veriyorlar adres çevirisi sanal adreslerden fiziğe.
btw: Yerleşik öğelerin hala "sanal" olduğunu düşünüyoruz, çünkü başvurmak için kullandığımız adreslerin hala fiziksel olarak çevrilmesi gerekiyor. Ve yerleşik olan şeyler bile fiziksel konumlarını istediğiniz zaman değiştirebilir.
ve ayrıca cpu tarafından oluşturulan ve gerçek fiziksel bellek adresiyle eşleştirilen bir mantıksal adres var. yani sayfa haritalama ve mantıksal adres haritalama iki farklı şeydir, fakat bazıları nasıl aynı doğru veya yanlış gibi çalışır ?!
Hem "mantıksal adres" hem de "doğrusal adres", genellikle x86 bölümlenmiş adresleme ile ilişkili terimlerdir. (ya da 70'li yıllardan beri düz adres alanlarında yaşayan bizlere "hileli adresleme" diyoruz.) "mantıksal adres", komut işlenenden gelen bir "yer değiştirme" veya "ofset" ve tabandan oluşur Bu işlenen tarafından örtük veya açıkça kullanılan "bellek bölümünün" adresi. Kod için C (CALL ve JMP komutları gibi komut akışına referans veren herhangi bir şey için dolaylı olarak kullanılır), veri için D (kod olmayan çoğu başvuru için dolaylı olarak kullanılır), yığın için S (yığın ile ilgili referanslar için dolaylı olarak kullanılır) olarak adlandırılan altı olası segment vardır. yığın işaretçisi yazmacı) ve istediğiniz ne için kullanılabilecek üç "ekstra", E, F ve G. İşlenen kodlaması bazı durumlarda varsayılan kesimi geçersiz kılmanıza izin verir. MMU, "doğrusal bir adres" oluşturmak için yer değiştirmeyi parçanın taban adresine ekler.
Uygulamada, modern işletim sistemlerinde, segmentleme neredeyse devre dışı bırakılmıştır - bunun anlamı, hemen hemen tüm segmentlerin (F ve G segmentleri hariç), 0 temel adrese sahip olmasıdır, bu nedenle komut işleçlerinin iddia ettiği "yer değiştirme" sadece doğrusal adres olur . İşlemcide "çağrı" açıldığında (bu işletim sistemi önyüklemesinde çok erken olur ve işletim sistemi çalışırken asla kapanmaz), doğrusal adres daha sonra sayfa tabloları aracılığıyla sanal bir adres olarak çevrilir. Bu yüzden VM işletim sistemlerinde "doğrusal adresler" anlamında düşünmüyoruz. Yer değiştirme, doğrusal adresle aynıdır, sanal adresle aynıdır ve biz sadece sanal adresleri düşünürüz.
btw, AMD'deki x64 tasarımcıları, çeşitli işletim sistemlerinde çalışan çekirdek mühendislere danıştıktan sonra, Windows ve diğer işletim sistemlerinin temel işletim sistemi veri yapılarını bulmak için kullandıkları F ve G segmentleri hariç, neredeyse tamamen parçalama mekanizmasını bıraktı.
İşletim sisteminde bunu düşündüğümüz yol şudur: VM ortamında talimatlar yürütürken CPU: her zaman sanal adresler aracılığıyla belleğe gönderme. Sanal adres, sanal sayfa numarası ve sayfa içindeki bir bayt ofsetinden oluşur; ikincisi, düşük sıralı 12 bit'tir. CPU'nun bellek yönetim birimi (MMU) sanal sayfa numarasının çevirisini sayfa tablolarındaki fiziksel sayfa numarasına çevirir. Sayfa tablosu girişi (PTE) "geçerli" bit ayarına sahip değilse, sayfa "yerleşik" değildir ve işlemci bir sayfa hatası istisnası oluşturur anlamına gelir. İşletim sisteminin çağrı cihazı, bu istisna türünün istisna işleyicisidir. Mümkünse, geçerli bir PTE ile sonuçlanan hatayı giderir ve ardından istisnayı reddeder. İşlemci daha sonra hatayı kaldıran talimatı yeniden uygular - fakat bu sefer hatayı arttırmaz.
Şimdi program diskte (sayfalar) depolanan fakat bellekte eşleştirilmemiş (çerçeveler) veri kullanmak istediğinde, belleğin sayfa değiştirme hakkı sağlaması gerekir ?!
Şart değil. Bir "zor" sayfa hatasını çözme, genel olarak aşağıdakilerden oluşur:
- Diskte istenen sayfanın içeriğinin nerede depolandığını belirleme
- Kullanılabilir bir RAM sayfasını bulma ve faylanma işlemine atama
- Disk içeriğini mevcut sayfaya okuma
- Sayfanın konumu için sayfa tablosu girişini güncelleme ve "geçerli" bit ayarını yapma
- Sayfa hatası istisnasını reddetme
2. Adım, sayfa değişimini içerebilir, ancak şu anda kullanımda olmayan bir sayfayı kullanır. Tipik VM işletim sistemleri bu tür sayfaların listesini tutar.
gerçekten tam bir sayfanın veya sayfanın içindeki baytların yerini alıyor mu (bu bir sayfa çerçevesidir), çünkü bu örneği aşağıdaki videoda gördüm ve videonun başında söylediklerinin kafasını karıştırdım. (hafızada 3 kare değil) ve 3 boyutta bir sayfa içindeki sayfaları değiştirmeye başlar yani 3 haftayı değiştirmelisiniz.
Yukarıdaki listemdeki 3. adımda, hedef sayfa (ların) her zaman tam olarak üzerine yazılır. Açıkçası "3 sayfa büyüklüğündeki sayfaları değiştir" ne anlama geldiğini bilmiyorum.
Şimdi, yukarıda bahsettiğim optimizasyonlardan biri, sanal sayfaya ihtiyacınız varsa n şimdi, muhtemelen sanal sayfaya ihtiyacınız olacak n Yakında + 1, vb. Ileride okuyun , bir kerede bir sayfadan daha fazla okuma. Evet, üç sayfada okumak istiyorsanız, üç sayfayla fiziksel bellekte uğraşırsınız. Çalışma grubu listesinde ya da fiziksel RAM adresleri açısından mutlaka bitişik olmaları gerekmez. Aslında, sanal belleğin en büyük yararlarından biri, bitişik ücretsiz sanal belleğe yönelik kaygının temelde ortadan kalkmasıdır.
Referanslar:
Hafıza yönetimi bölümleri Windows Internals Solomon, Russinovich ve Ionescu tarafından - yukarıdakilerin hiçbiri gibi Windows sürümüne özgü olmayan herhangi bir sürüm.
Intel® 64 ve IA-32 Architectures Yazılım Geliştirici El Kitapları , Cilt 3A ("Sistem Programlama"), Bölüm 3 ("Korumalı Mod Bellek Yönetimi") ve 4 ("Sayfalama").