C 带有空地址的mmap是如何工作的?

C 带有空地址的mmap是如何工作的?,c,memory,null,mmap,C,Memory,Null,Mmap,指定在将mmap与NULLaddr一起使用时,内核选择创建映射的(页面对齐的)地址: mmap()在的虚拟地址空间中创建一个新映射 呼叫过程。新映射的起始地址为 在addr中指定。length参数指定文件的长度 映射(必须大于0)如果addr为NULL,则内核选择(页面对齐的)地址 创建映射的位置;这是最便于携带的方法 创建新映射 假设我有下面的代码: void (*x)(void); void (*y)(void); x=mmap(NULL, 0x500, PROT..., FLAGS...,

指定在将
mmap
NULL
addr一起使用时,内核选择创建映射的(页面对齐的)地址:

mmap()在的虚拟地址空间中创建一个新映射 呼叫过程。新映射的起始地址为 在addr中指定。length参数指定文件的长度 映射(必须大于0)如果addr为NULL,则内核选择(页面对齐的)地址 创建映射的位置;这是最便于携带的方法 创建新映射

假设我有下面的代码:

void (*x)(void);
void (*y)(void);
x=mmap(NULL, 0x500, PROT..., FLAGS..., FD..., 0);
y=mmap(NULL, 0x500, PROT..., FLAGS..., FD..., 0);
这是否意味着
y
将紧跟在
x
之后


谢谢。

不,它没有说明映射的相对位置,因此您不能对此进行任何假设。将每个映射视为完全独立于所有其他映射。

在您引用的文本中,它在哪里谈到了这种保证?它说内核可以进行选择。这应该很清楚,您不应该对它的选择做任何假设。为什么要将返回的内存分配给函数指针?你打算用它做什么?如果addr不为NULL,则内核将其作为放置映射的提示;在Linux上,将在附近的页面边界创建映射。新映射的地址将作为调用的结果返回。哪个部分不清楚?实际问题是:您为什么会在意?这显然是XY的问题。谢谢。即使我因为对mmap手册页的误解而做出了假设,我认为这个问题仍然是相关的,当然答案也是相关的。