我尝试创建MAP_GROWSDOWN
映射,期望它会自动增长。如手册页中所指定:
因此,我编写了以下示例来测试映射的增长:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <errno.h>
#include <sys/mman.h>
#include <stdio.h>
int main(void){
char *mapped_ptr = mmap(NULL, 4096,
PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_STACK | MAP_GROWSDOWN,
-1, 0);
if(mapped_ptr == MAP_FAILED){
int error_code = errno;
fprintf(stderr, "Cannot do MAP_FIXED mapping."
"Error code = %d, details = %s\n", error_code, strerror(error_code));
exit(EXIT_FAILURE);
}
volatile char *c_ptr_1 = mapped_ptr; //address returned by mmap
*c_ptr_1 = 'a'; //fine
volatile char *c_ptr_2 = mapped_ptr - 4095; //1 page below the guard
*c_ptr_2 = 'b'; //crashes with SEGV
}
所以我得到了
SEGV
而不是扩大映射。在这里生长意味着什么? 最佳答案
代替:
volatile char *c_ptr_1 = mapped_ptr - 4096; //1 page below
和
volatile char *c_ptr_1 = mapped_ptr;
因为:
请注意,我测试了该解决方案,并且可以在内核4.15.0-45-generic上按预期工作。
关于c - 为什么MAP_GROWSDOWN映射不增长?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56888725/