Sayfaları Kilitleyen ve Kilitlerini Açan İşlevler
Önceki Sayfaların Kilitlenmesi Sonraki
Sayfaları Kilitleyen ve Kilitlerini Açan İşlevler
Bu bölümdeki işlevler sys/mman.h başlık dosyasında bildirilmiştir. Bu işlevler by POSIX.1b tarafından tanımlanmıştır ama onların kullanılabilirliği çekirdeğinize bağımlıdır. Çekirdeğiniz bu işlevlere izin vermiyorsa onlar var olsalar bile başarısız olacaklardır. Linux çekirdeği ile bu işlevleri kullanabilirsiniz.
Taşınabilirlik Bilgisi:
POSIX.1b, mlock ve munlock işlevleri kullanılabilir olduğunda, _POSIX_MEMLOCK_RANGE makrosunun unistd.h dosyasında ve bir bellek sayfasının bayt cinsinden boyu olan PAGESIZE makrosunun limits.h dosyasında tanımlanmasını gerektirir. Ayrıca, mlockall ve munlockall işlevleri kullanılabilir olduğunda, _POSIX_MEMLOCK makrosunun unistd.h dosyasında tanımlanmasını gerektirir. GNU C kütüphanesi bu gereksinimleri karşılar.
int mlock
(const void *adres,
 size_t      uzunluk)
işlev
adres adresinden başlayan uzunluk bayt uzunluğundaki sanal sayfa aralığını kilitler. Aslında, sayfaları bir bütün olarak kilitlemeniz gerektiğinden belirtilen aralıktaki parçaları içeren sayfaların bir aralığıdır.
İşlev başarılı olarak dönerse, bu sayfaların her biri bir gerçek bellek çerçevesi tarafından (kalıcı olarak) kopyalanır (çerçevelenir) ve kalıcı olarak imlenir. Bu, işlevin sayfayı gerçek belleğe kopyalaması ve orada kalmasına sebep olması demektir.
İşlev başarısız olursa, sayfaların kilitlenme durumu etkin olmaz.
İşlev başarılı olduğunda dönen değer sıfırdır. Aksi takdirde, -1 döner ve errno ilgili hata değerine ayarlanır. Bu işleve özel errno değerleri:
ENOMEM
  • Belirtilen adres aralığının en azından bir kısmı çağrılan sürecin sanal adres aralığında mevcut değildir.
  • Kilitleme, sürecin kilitli sayfa sınırının aşılmasına sebep olacaktır.
EPERM
Süreci çağıran süper kullanıcı değildir.
EINVAL
uzunluk pozitif değildir.
ENOSYS
Çekirdek mlock yeteneği sağlamıyor.
Bir sürecin tüm belleğini mlockall ile kilitleyebilir ve munlock ya da munlockall ile kilitlerini açabilirsiniz.
Bir C yazılımında sayfalama hatalarından kaçınmak için mlockall işlevini kullanmalısınız, çünkü bir yazılımın kullandığı belleğin bir kısmı örneğin, yığıt ve özdevinimli değişkenler C kodundan gizlidir ve hangi adrese mlock deneceğini bilmeyeceksiniz.
int munlock
(const void *adres,
 size_t      uzunluk)
işlev
munlock çağrılan sürecin sanal sayfalarının bir aralığının kilidini açar.
munlock işlevi mlock işlevinin tersidir ve EPERM başarısızlığı söz konusu değildir.
int mlockall
(int bayraklar)
işlev
mlockall bir sürecin sanal adres alanındaki ve/veya ilerde eklenecek tüm sayfaları kilitler. Bu alan, kod sayfalarını, veri ve yığıt bölütünü, paylaşımlı kütüphaneleri, kullanıcı alanı çekirdek verisini, paylaşımlı belleği ve bellek eşlemli dosyaları içerir.
bayraklar aşağıdaki makrolarla ifade edilen tek bitlik bayrakların bir dizgesidir. Bunlar mlockall'dan istediğiniz işlevselliği belirtmek için kullanılır. Tüm diğer bitler sıfır olmalıdır.
MCL_CURRENT
Çağrılan sürecin sanal adres alanında o an mevcut olan tüm sayfalar kilitlenir.
MCL_FUTURE
Sürecin sanal adres alanına gelecekte doğumundan itibaren eklenecek sayfaların kilitlenmesini sağlayacak kipi etkinleştirir. Bu kip aynı süreç tarafından sahiplenilecek alt süreçlerin gelecekteki adres alanları üzerinde etkili değildir. Örneğin süreç bir exec çağrısı ile bir alt süreç çalıştırırsa bu kip, bu alt sürecin sayfaları için etkisizdir. Bkz. Bir Dosyanın Çalıştırılması.
İşlev MCL_CURRENT bayrağıyla çağrılır ve başarılı olarak dönerse, bu sayfaların her biri bir gerçek bellek çerçevesi tarafından (kalıcı olarak) kopyalanır (çerçevelenir) ve kalıcı olarak imlenir. Bu, işlevin sayfayı gerçek belleğe kopyalanmasına ve orada kalmasına sebep olması demektir.
Süreç MCL_FUTURE kipindeyse bu işlev başarılı olduğundan dolayıdır ve MCL_CURRENT belirtildiğinde, süreç tarafından sanal bellek alanına alan eklenmesini gerektiren bir sistem çağrısıyla ek alanın kilitlenmesi sürecin kilitli sayfa sınırının aşılmasına sebep oluyorsa işlev errno = ENOMEM hatasıyla başarısız olur. Bu durumda adres alanı eklemesi yığıt genişletmesi ile bağdaştırılamaz ve yığıt genişlemesi başarısız olur, bunun sonucunda da çekirdek sürece bir SIGSEGV sinyali gönderir.
İşlev başarısız olduğunda, kilitli sayfaların durumu ve gelecektekileri kilitleme kipi bundan etkinemez.
İşlev başarılı olduğunda dönen değer sıfırdır. Aksi takdirde, -1 döner ve errno ilgili hata değerine ayarlanır. Bu işleve özel errno değerleri:
ENOMEM
  • Belirtilen adres aralığının en azından bir kısmı çağrılan sürecin sanal adres aralığında mevcut değildir.
  • Kilitleme, sürecin kilitli sayfa sınırının aşılmasına sebep olacaktır.
EPERM
Süreci çağıran süper kullanıcı değildir.
EINVAL
bayraklar içinde belirtilmeyen bitler sıfır değil.
ENOSYS
Çekirdek mlockall yeteneği sağlamıyor.
Belirli sayfaları mlock ile kilitleyebilirsiniz. Kilitli sayfalardan ise munlockall ve munlock ile kilitleri kaldırabilirsiniz.
int munlockall
(void)
işlev
Çağrılan sürecin sanal adres alanındaki her sayfanın kilidini kaldırır ve MCL_FUTURE gelecekteki kilitleme kipini kapatır.
İşlev başarılı olduğunda dönen değer sıfırdır. Aksi takdirde, -1 döner ve errno ilgili hata değerine ayarlanır. Sadece, tüm işlev ve sistem çağrılarının başarısız olabildiği soysal sebeplerle işlev başarısız olursa bu duruma özel bir errno değeri yoktur.
Önceki Üst Ana Başlık Sonraki
Kilitli Bellekler Hakkında Başlangıç IV. Oylum - Karakterle Çalışma
Bir Linux Kitaplığı Sayfası