我没有错误地调用了munmap,但是映射在/proc/<pid>/maps中仍然可见,当我尝试使用mmap(address_overlapping_with_what_I_tried_to_munmap, ...)时,我没有得到我请求的地址。

那是错误还是功能?我可以做些什么来确保未映射某些东西吗?

详细信息:32位Linux 4.1.18

编辑

最初, map 条目是

bfe50000-bfe71000 rw-p 00000000 00:00 0

然后我用参数munmap调用0xbfe50000, 0x21000之后

条目是
bfe50000-bfe50000 rw-p 00000000 00:00 0

最佳答案



再次仔细阅读mmap(2):



然后:



因此,如果您确实需要将地址作为有用的地址传递给mmap,则应使用MAP_FIXED (请谨慎使用,因为它会覆盖并“粉碎”一个非常有用的现有内存映射)。

换句话说,我知道mmap的地址最好为0,除非您说MAP_FIXED。否则,这只是一个“提示”,我不知道这实际上意味着什么(尤其是ASLR)。

在AFAIU中,/proc/self/maps/proc/1234/maps立即反射(reflect)内核对进程virtual address space的感知。当然,您需要对该伪文件进行open,对其进行快速且顺序的read编码,并尽快对其进行close编码(不要将文件描述符保留在open编码的/proc/self/maps中几秒钟)。如果您的进程在该mmap文件的munmapopen之间进行close -ing或/proc/*/maps -ing(或以其他方式更改其地址空间)是IMHO undefined behavior-或至少是unspecified behavior-您不应依赖。

但是mmapmunmap从该系统调用返回后立即生效;更改虚拟地址空间没有“延迟”。虚拟内存机制可能会产生一些延迟(例如,当从某个远程网络中获取某些页面时...),但是该延迟无法为应用程序所访问(该过程将处于D状态)。另请参阅thrashing

关于linux - linux munmap无法正常运行(或至少无法立即正常运行),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36508965/

10-12 04:25