Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否必须将映射的长度添加到mmap返回的带有MAP_GROWSDOWN和MAP_STACK标志的指针上?_C_Linux_Mmap - Fatal编程技术网

我是否必须将映射的长度添加到mmap返回的带有MAP_GROWSDOWN和MAP_STACK标志的指针上?

我是否必须将映射的长度添加到mmap返回的带有MAP_GROWSDOWN和MAP_STACK标志的指针上?,c,linux,mmap,C,Linux,Mmap,我正在为a.out加载程序创建一个简单的堆栈,我得出了以下结论: stack = (char *)mmap(NULL, 65535, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_STACK | MAP_GROWSDOWN | MAP_UNINITIALIZED |

我正在为a.out加载程序创建一个简单的堆栈,我得出了以下结论:

stack = (char *)mmap(NULL,
                     65535,
                     PROT_READ | PROT_WRITE,
                     MAP_PRIVATE | MAP_STACK |
                       MAP_GROWSDOWN | MAP_UNINITIALIZED |
                       MAP_ANONYMOUS,
                     -1,
                     0);
然而,我对此并不确定

因为我使用了
MAP_stack
MAP_GROWSDOWN
标志,所以在将结果指针移动到堆栈指针之前,是否必须向其添加
65535
(映射的大小)?或者我可以直接使用它吗

这方面的文档不是很清楚,我在网上搜索时也找不到任何东西

具体来说,这(来自mmap(2))让我感到困惑:

返回地址比进程虚拟地址空间中实际创建的内存区域低一页

  • 是的,您必须将65536添加到结果指针。注意,不是65535。大多数体系结构将push(x)实现为*--sp=x;因此,让sp位于堆栈之上是可以开始的。更重要的是,它必须对齐,而65535不是

  • 文件似乎有误。我认为它的意图是“比…高一页”。这与源代码实现以及下面的小示例程序的结果更为一致:


  • 在我的系统上:

    $ uname -a
    Linux u2 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    

    你为什么要注释掉未初始化的映射?我的linux没有启用这个功能[参见:最后一条注释]?我在3.18上启用了它(不过我使用的是
    asm/mman.h
    /usr/local/include/asm generic/mman common.h:#define MAP_UNINITIALIZED 0x4000000/*对于匿名mmap,内存可能未初始化*/
    这是一个安全问题,这就是为什么我想ubuntu会拒绝它。请注意,glibc可以过滤您的选项,以便能够规范;如果您以strace-e trace=mmap./a.out的形式运行它,您可能在args中看不到您的选项。
    $ ./a.out
    stack 0x7f805c5fb000
    (11): sp = -4096
    
    $ uname -a
    Linux u2 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux