我尝试创建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/

10-16 10:23