我打电话给munmap
没有错误,但映射仍然是可见的/proc/<pid>/maps
,当我试图mmap(address_overlapping_with_what_I_tried_to_munmap, ...)
时,我没有得到我要求的地址。
这是一个错误还是一个功能?我可以做些什么来确保某些内容未映射?
详细信息:32 位 Linux 4.1.18
编辑
最初,地图条目是
bfe50000-bfe71000 rw-p 00000000 00:00 0
然后在我用参数调用munmap
之后0xbfe50000, 0x21000
条目是
bfe50000-bfe50000 rw-p 00000000 00:00 0
当我尝试mmap(address_overlapping_with_what_I_tried_to_munmap,...(时我没有收到我要求的地址。
再次仔细阅读 mmap(2(:
如果 addr 为 NULL,则内核选择地址 创建映射;这是创建 新映射。 如果 addr 不是 NULL,则内核将其作为提示 关于放置映射的位置
后来:
MAP_FIXED
不要将 addr 解释为提示:将映射精确地放置在 那个地址。 addr 必须是页面大小的倍数。
因此,如果您确实需要将地址作为有用的地址传递给mmap
,则应使用MAP_FIXED
(谨慎使用,因为它可以覆盖和"粉碎"非常有用的预先存在的内存映射(。
换句话说,我知道mmap
的地址最好是0,除非你说MAP_FIXED
。否则,这只是一个"提示",我不知道这实际上意味着什么(尤其是对于 ASLR(。
AFAIU,即/proc/self/maps
或/proc/1234/maps
即时反映内核对进程虚拟地址空间的感知。当然,您需要open
该伪文件,快速按顺序read
它,并尽快close
它(不要将文件描述符保留到 open
-ed /proc/self/maps
几秒钟(。如果你的进程在该/proc/*/maps
文件的open
和close
之间mmap
-ing 或 munmap
-ing(或以其他方式更改其地址空间(会发生什么,恕我直言,这是未定义的行为 - 或至少是未指定的行为 - 你不应该依赖它。
但是mmap
和munmap
在返回系统调用后立即生效;更改虚拟地址空间没有"延迟"。虚拟内存机制可能会给出一些延迟(例如,从某个远程网络获取某些页面时......(,但应用程序无法访问该延迟(进程将处于D
状态(。另请阅读有关捶打的信息。