【问题标题】:How mmap with NULL addr works?带有 NULL addr 的 mmap 如何工作?
【发布时间】:2018-08-20 12:43:20
【问题描述】:

指定当使用mmapNULL addr 时,内核选择创建映射的(页面对齐的)地址:

mmap() 在虚拟地址空间中创建一个新的映射 调用过程。新映射的起始地址是 在地址中指定。长度参数指定的长度 映射(必须大于 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 之后?

谢谢。

【问题讨论】:

  • 你引用的文字中哪里提到了这种保证?
  • 它表示内核可以进行选择。这应该清楚地表明您不应该对其选择做出任何假设。
  • 为什么要将返回的内存分配给函数指针?你打算用它做什么?
  • man mmapIf addr is not NULL, then the kernel takes it as a hint about where to place the mapping; on Linux, the mapping will be created at a nearby page boundary. The address of the new mapping is returned as the result of the call. 哪个部分不清楚?
  • 实际的问题是:你为什么要关心?这显然是一个 XY 问题。

标签: c memory null mmap


【解决方案1】:

不,它没有说明映射的相对位置,因此您不能对此做出任何假设。将每个映射视为与所有其他映射完全分开。

【讨论】:

  • 谢谢。即使我因为对 mmap 手册页的误解而做出假设,我认为这个问题仍然是相关的,当然答案也是如此。
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 2013-01-24
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多