我没有错误地调用了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
文件的munmap
和open
之间进行close
-ing或/proc/*/maps
-ing(或以其他方式更改其地址空间)是IMHO undefined behavior-或至少是unspecified behavior-您不应依赖。
但是mmap
和munmap
从该系统调用返回后立即生效;更改虚拟地址空间没有“延迟”。虚拟内存机制可能会产生一些延迟(例如,当从某个远程网络中获取某些页面时...),但是该延迟无法为应用程序所访问(该过程将处于D
状态)。另请参阅thrashing。
关于linux - linux munmap无法正常运行(或至少无法立即正常运行),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36508965/