我是否必须将映射的长度添加到mmap返回的带有MAP_GROWSDOWN和MAP_STACK标志的指针上?
我正在为a.out加载程序创建一个简单的堆栈,我得出了以下结论:我是否必须将映射的长度添加到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 |
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))让我感到困惑:
返回地址比进程虚拟地址空间中实际创建的内存区域低一页
在我的系统上:
$ 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