- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在查看 mmap 函数的不同标志,即 MAP_FIXED、MAP_SHARED、MAP_PRIVATE。有人可以向我解释 MAP_FIXED 的用途吗?无法保证首先会使用地址空间。
最佳答案
MAP_FIXED
是用于内存映射的 dup2
,它的用处与 dup2
用于文件描述符的情况完全相同:当您需要时执行replace 操作,以原子方式重新分配资源标识符(在 MAP_FIXED
的情况下为内存范围,在 dup2
的情况下为 fd)到引用一个新资源而不可能发生竞争,如果您首先释放旧资源然后尝试为新资源重新获得它,它可能会被重新分配给其他东西。
例如,以加载共享库(通过动态加载程序)为例。它至少包含三种类型的映射:程序代码和可执行文件中的只读数据的只读+执行映射,初始化数据的读写映射(也来自可执行文件,但通常具有不同的相对偏移量)和读写零初始化匿名内存(对于 .bss
)。将它们创建为单独的映射是行不通的,因为它们必须位于相对于彼此的固定相对地址。因此,您首先在没有 MAP_FIXED
的情况下对所需的总长度进行虚拟映射(此映射的类型无关紧要),只是为了在内核分配的位置保留足够范围的连续地址,然后您可以使用 MAP_FIXED
根据需要使用您需要创建的三个或更多映射来映射此范围部分的顶部。
此外,请注意,将 MAP_FIXED
与硬编码地址或随机地址一起使用总是一个错误。使用 MAP_FIXED
的唯一正确方法是替换现有映射,该映射的地址是由先前成功调用 mmap
而没有 MAP_FIXED
分配的,或者在您认为可以安全地替换整个页面的其他方式。这方面也完全类似于dup2
;当调用者在目标 fd 上还没有打开文件并打算替换它时,使用 dup2
总是一个错误。
关于c - 什么时候使用 mmap MAP_FIXED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575893/
我一直在查看 mmap 函数的不同标志,即 MAP_FIXED、MAP_SHARED、MAP_PRIVATE。有人可以向我解释 MAP_FIXED 的用途吗?无法保证首先会使用地址空间。 最佳答案 M
我正在用堆栈运行一些实验,但以下让我卡住了。 可以看出Linux有初始[stack]映射132KiB大小。在 ulimit -s unlimited 的情况下,如果我们相应地调整 rsp,我们可以进一
由于一些与这个问题无关的模糊原因,我需要求助于使用 MAP_FIXED 以获得接近 libc 的文本部分在内存中的位置的页面。 在阅读 mmap(2)(我一开始就应该这样做)之前,如果我使用 MAP_
常量 MAP_FIXED 对 mmap 有什么作用? 我已经在手册中阅读了它,但仍然不明白它的用途以及它适用于哪些情况。 最佳答案 MAP_FIXED 指定 mmap 内存应该位于作为第一个参数传递给
我有一个简单的 mmap 程序,它在两台 linux 机器上的行为不同: cat a.c #include #include #include #include
:) 我正在尝试将一些遗留代码(大型程序)移植到 CentOS 7,但遇到了障碍。代码的核心是一个相当笨拙的结构,围绕使用 mmap 分配硬编码地址并将文件映射到它而构建。该文件就像一个数据库(由一个
在尝试测试时 Is it allowed to access memory that spans the zero boundary in x86?在 Linux 的用户空间中,我编写了一个 32 位
以下程序: #include #include #include #include #include #include void generate_test_file(int count)
我是一名优秀的程序员,十分优秀!