作者:手机用户2602936797 | 来源:互联网 | 2023-05-21 15:16
我一直在查看mmap函数的不同标志,即MAP_FIXED,MAP_SHARED,MAP_PRIVATE.有人可以向我解释MAP_FIXED的目的吗?我们无法保证首先使用地址空间.
1> R....:
MAP_FIXED
是dup2
内存映射,它是在什么地方相同的情况下有用的dup2
是文件描述符有用:当你想进行更换操作是原子重新分配(在的情况下,内存范围内的资源标识符MAP_FIXED
中的情况下,或fd dup2
)至如果您首先发布旧资源然后尝试为新资源重新获取资源,则可以引用新资源,而不会出现可能会被重新分配给其他内容的竞争.
例如,加载共享库(通过动态加载程序).它由至少三种类型的映射组成:read + exec-only程序代码映射和可执行文件的只读数据,初始化数据的读写映射(也来自可执行文件,但通常具有不同的映射)相对偏移量)和读写零初始化匿名内存(for .bss
).将它们创建为单独的映射是行不通的,因为它们必须相对于彼此处于固定的相对地址.因此,您首先要对所需的总长度进行虚拟映射(此映射的类型无关紧要),而不是MAP_FIXED
仅在内核分配的位置保留足够范围的连续地址,然后使用MAP_FIXED
映射到部件顶部您需要创建的三个或更多映射根据需要使用此范围.
此外,请注意,使用MAP_FIXED
硬编码地址或随机地址始终是一个错误.使用的唯一正确的方法MAP_FIXED
是,以取代现有的映射其地址由先前成功调用分配到mmap
无MAP_FIXED
,或在你觉得它是安全的替代整页一些其他的方式.这方面也完全类似于dup2
; dup2
当调用者在目标fd上没有打开文件并且意图替换它时,它总是一个错误.