Tam mekanizması Linux üzerinde, burada verilmektedir: in anonim eşleştirmeleri bir sayfa hatasına taşıma Eğer bir "yetişkin bir tahsisat yok" olup olmadığını görmek için kontrol , bir yığını gibi genişletmek gerektiğini söyledi. VM alan kaydı yapmanız gerektiğini söylüyorsa, yığını genişletmek için başlangıç adresini ayarlarsınız.
Bir sayfa hatası meydana geldiğinde, adrese bağlı olarak, yığının genişletilmesi yoluyla servis edilebilir (ve hata bozulabilir). Sanal bellek için bu "hata üzerinde aşağı doğru" davranışı, MAP_GROWSDOWN
bayrak mmap
sistem çağrısına geçirilen rasgele kullanıcı programları tarafından istenebilir .
Bir kullanıcı programında da bu mekanizma ile uğraşabilirsiniz:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
int main() {
long page_size = sysconf(_SC_PAGE_SIZE);
void *mem = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_GROWSDOWN|MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (MAP_FAILED == mem) {
perror("failed to create growsdown mapping");
return EXIT_FAILURE;
}
volatile char *tos = (char *) mem + page_size;
int i;
for (i = 1; i < 10 * page_size; ++i)
tos[-i] = 42;
fprintf(stderr, "inspect mappping for originally page-sized %p in /proc... press any key to continue...\n", mem);
(void) getchar();
if (munmap(mem, page_size))
perror("failed munmap");
return EXIT_SUCCESS;
}
İstendiğinde, programın pidini bulursunuz (üzerinden ps
) ve /proc/$THAT_PID/maps
orijinal alanın nasıl büyüdüğüne bakın.
ulimit -s
) ile sınırlıdır .