Mekanisme yang tepat diberikan di sini, di Linux: dalam menangani kesalahan halaman pada pemetaan anonim, Anda memeriksa untuk melihat apakah itu "alokasi yang tumbuh" yang harus Anda kembangkan seperti tumpukan. Jika catatan area VM mengatakan Anda harus, maka Anda menyesuaikan alamat mulai untuk memperluas tumpukan.
Ketika kesalahan halaman terjadi, tergantung pada alamat, itu dapat diperbaiki (dan kesalahan diatasi) melalui ekspansi stack. Perilaku "tumbuh ke bawah karena suatu kesalahan" untuk memori virtual ini dapat diminta oleh program pengguna yang sewenang-wenang dengan MAP_GROWSDOWN
bendera diteruskan ke mmap
syscall.
Anda dapat dipusingkan dengan mekanisme ini di program pengguna juga:
#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;
}
Ketika diminta, Anda menemukan pid dari program (melalui ps
) dan melihat /proc/$THAT_PID/maps
untuk melihat bagaimana daerah asli telah tumbuh.
ulimit -s
).