정확한 메커니즘은 리눅스, 여기에 주어진 :에 익명 매핑에 페이지 오류를 처리 하면 그것은 "어른이 할당 않는다"인지 확인 당신이 스택처럼 확대해야한다고는. VM 영역 레코드에 필요한 것으로 표시되면 시작 주소를 조정하여 스택을 확장합니다.
페이지 오류가 발생하면 주소에 따라 스택 확장을 통해 페이지 오류가 처리 될 수 있습니다. 가상 메모리에 대한 이러한 "오류 발생시 아래쪽으로 증가"동작은 임의의 사용자 프로그램이 MAP_GROWSDOWN
플래그를 mmap
syscall 에 전달하여 요청할 수 있습니다 .
사용자 프로그램에서도이 메커니즘을 망칠 수 있습니다.
#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;
}
메시지가 표시되면 (을 통해 ps
) 프로그램의 pid를 찾고 /proc/$THAT_PID/maps
원래 영역이 어떻게 성장했는지 확인하십시오.
ulimit -s
)로 제한됩니다 .