Aracılığıyla paylaş


Sanal adres alanları

İşlemciler, bellek konumlarını okurken veya bu konumlara yazarken sanal adresleri kullanır. Bu işlemler sırasında işlemci sanal adresi fiziksel bir adrese çevirir.

Sanal adresleri kullanarak belleğe erişmenin çeşitli avantajları vardır:

  • Bir program, fiziksel bellekteki büyük, bitişik olmayan bir bellek arabelleğine erişmek için bitişik bir sanal adres aralığı kullanabilir.

  • Bir program, kullanılabilir fiziksel bellekten daha büyük bir bellek arabelleğine erişmek için bir dizi sanal adres kullanabilir. Fiziksel bellek düşük olduğunda, bellek yöneticisi fiziksel bellek sayfalarını (genellikle 4 kilobayt boyutunda) bir disk dosyasına kaydeder. Sistem, veri veya kod sayfalarını gerektiğinde fiziksel bellekle disk arasında taşır.

  • Farklı işlemler tarafından kullanılan sanal adresler yalıtılır. Bir işlemdeki kod, başka bir işlem veya işletim sistemi tarafından kullanılan fiziksel belleği değiştiremez.

Bir işlem için kullanılabilen sanal adres aralığı, işleminsanal adres alanı olarak bilinir. Her kullanıcı modu işlemi kendi özel sanal adres alanına sahiptir.

  • 32-bit bir işlem genellikle 0x00000000 ile 0x7FFFFFFF arasındaki 2 gigabayt aralığında bir sanal adres alanına sahiptir.

  • 64 bit Windows'da 64 bit işlem, 0x000'00000000 ile 0x7FFF'FFFFFFFF arasında, 128 terabayt aralığında bir sanal adres alanına sahiptir.

Sanal adres aralığı bazen sanal bellekaralığı olarak adlandırılır. Daha fazla bilgi için bkz. Bellek ve Adres Alanı Sınırları.

Aşağıdaki diyagramda sanal adres alanlarının bazı temel özellikleri gösterilmektedir.

Notepad.exe ve MyApp.exeiki 64 bit işlem için sanal adres alanlarını gösteren diyagram.

Diyagramda iki 64 bit işlem için sanal adres alanları gösterilir: Notepad.exe ve MyApp.exe. Her işlemin 0x000'0000000 ile 0x7FF'FFFFFFFF arasında değişen kendi sanal adres alanı vardır. Her gölgeli blok, sanal veya fiziksel belleğin bir sayfasını (4 kilobayt boyutunda) temsil eder. Not Defteri işlemi, 0x7F7'93950000'den başlayarak üç bitişik sanal adres sayfası kullanır. Ancak, sanal adreslerden oluşan bu üç bitişik sayfa, fiziksel bellekteki ayrık sayfalara eşlenir. Ayrıca, her iki işlem de 0x7F7'93950000 ile başlayan bir sanal bellek sayfası kullanır, ancak bu sanal sayfalar farklı fiziksel bellek sayfalarına eşler.

Kullanıcı alanı ve sistem alanı

Notepad.exe ve MyApp.exe gibi işlemler kullanıcı modunda çalışır. Çekirdek işletim sistemi bileşenleri ve birçok sürücü daha ayrıcalıklı çekirdek modunda çalışır. İşlemci modları hakkında daha fazla bilgi için bkz. Kullanıcı modu ve çekirdek modu.

Her kullanıcı modu işleminin kendi özel sanal adres alanı vardır, ancak çekirdek modunda çalışan tüm kodlar sistem alanıadlı tek bir sanal adres alanını paylaşır. Kullanıcı modu işleminin sanal adres alanı, kullanıcı alanı olarak adlandırılır.

32 bit Windows'ta toplam kullanılabilir sanal adres alanı 2^32 bayttır (4 gigabayt). Genellikle kullanıcı alanı için alt 2 gigabayt, sistem alanı için ise üst 2 gigabayt kullanılır.

32 bit Windows'taki toplam kullanılabilir sanal adres alanının kullanıcı alanına ve sistem alanına bölünmesini gösteren diyagram.

32 bit Windows'ta, (önyükleme zamanında) kullanıcı alanı için 2 gigabayttan fazla alanın kullanılabilir olduğunu belirtebilirsiniz. Ancak bu, sistem alanı için daha az sanal adres olduğu anlamına gelir. Sistem alanı için yalnızca 1 gigabayt bırakarak kullanıcı alanının boyutunu 3 gigabayta kadar artırabilirsiniz. Kullanıcı alanının boyutunu artırmak için BCDEdit /set increaseuservakullanın.

64 bit Windows'ta, teorik sanal adres alanı miktarı 2^64 bayttır (16 eksabayt), ancak 16 exabayt aralığının yalnızca küçük bir kısmı kullanılır.

Kullanıcı modunda çalışan kod, kullanıcı alanına erişebilir ancak sistem alanına erişemez. Bu kısıtlama, kullanıcı modu kodunun korumalı işletim sistemi veri yapılarını okumasını veya değiştirmesini engeller. Çekirdek modunda çalışan kod hem kullanıcı alanına hem de sistem alanına erişebilir. Diğer bir ifadeyle, çekirdek modunda çalışan kod sistem alanına ve geçerli kullanıcı modu işleminin sanal adres alanına erişebilir.

Çekirdek modunda çalışan sürücüler, kullanıcı alanında adreslerden doğrudan okurken veya adreslere yazarken dikkatli olmalıdır. Aşağıdaki senaryoda bunun nedeni gösterilmektedir.

  1. Kullanıcı modu programı, bir cihazdan bazı verileri okuma isteği başlatır. Program, verileri almak için bir arabelleğin başlangıç adresini sağlar.

  2. Çekirdek modunda çalışan bir cihaz sürücüsü yordamı, okuma işlemini başlatır ve denetimi çağırana döndürür.

  3. Daha sonra cihaz, okuma işleminin tamamlandığını belirtmek için çalışmakta olan iş parçacığını kesintiye uğratır. Çekirdek modu sürücü yordamları, rastgele bir işleme ait olan bu rastgele iş parçacığındaki kesmeyi işler.

  4. Bu noktada, sürücü verileri kullanıcı modu programının 1. Adımda sağladığı başlangıç adresine yazmamalıdır. Bu adres, isteği başlatan işlemin sanal adres alanındadır ve bu büyük olasılıkla geçerli işlemle aynı değildir.

Sayfalı havuz ve sayfasız havuz

Kullanıcı alanında, tüm fiziksel bellek sayfaları ihtiyaç duyulduğunda bir disk dosyasına sayfalanabilir. Sistem alanında, bazı fiziksel sayfalar bellekten çıkarılabilir, diğerleri ise çıkarılamaz. Sistem alanı, belleği dinamik olarak ayırmak için iki bölgeye sahiptir: sayfalı havuz ve sayfasız havuz.

Sayfalı havuzda tahsis edilen bellek, gerektiğinde bir disk dosyasına aktarılabilir. Sayfasız havuzda ayrılan bellek, disk dosyasına asla aktarılmaz.

Disk belleği havuzundaki bellek ayırma arasındaki farkı gösteren diyagram.

cihaz düğümlerini ve cihaz yığınlarını

Kullanıcı modu ve çekirdek modu