Linux Munmap不工作(或者至少不能立即工作)



我打电话给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文件的openclose之间mmap -ing 或 munmap -ing(或以其他方式更改其地址空间(会发生什么,恕我直言,这是未定义的行为 - 或至少是未指定的行为 - 你不应该依赖它。

但是mmapmunmap在返回系统调用后立即生效;更改虚拟地址空间没有"延迟"。虚拟内存机制可能会给出一些延迟(例如,从某个远程网络获取某些页面时......(,但应用程序无法访问该延迟(进程将处于D状态(。另请阅读有关捶打的信息。

最新更新