如何为mmap选择固定地址?

Soa*_*Box 10 c linux mmap

mmap()可以选择提供固定位置来放置地图.我想mmap一个文件,然后让它可用于每个程序中相同虚拟地址的几个不同的程序.我不在乎地址是什么,只要他们都使用相同的地址.如果需要,可以在运行时由其中一个选择地址(并通过其他方式与其他人通信).

是否存在Linux保证未使用的内存区域(由应用程序和内核),我可以映射到哪个区域?如何在多个正在运行的应用程序中找到一个可用的地址?

Tom*_*omH 7

不是,不是.随着现代Linux系统上的地址空间随机化,很难保证可以使用或不使用哪些地址.

此外,如果您正在考虑使用,MAP_FIXED那么请注意您需要非常小心,因为它会导致mmap取消映射可能已经映射到该地址的任何内容,这通常是一件非常糟糕的事情.

我真的认为你需要找到另一个问题的解决方案......

  • 抛开:`MAP_FIXED`**可以安全使用**如果你首先制作一个没有`MAP_FIXED`的映射,然后使用`MAP_FIXED`在固定地址上创建各种映射,相对于另一个在原始丢弃之上位于内核分配位置的映射.如果映射大小足够大,这可能会解决OP的问题. (13认同)

bob*_*rka 5

两个进程可以使用 shm_open() 和 mmap() 将一个共享内存块映射到同一个虚拟地址;也就是说,从 mmap() 返回的虚拟地址对于两个进程可以是相同的。我发现 Linux 会默认为同一块共享内存的不同进程提供不同的虚拟地址,但是使用 mmap() 和 MAP_FIXED 将强制 Linux 为多个进程提供相同的虚拟地址。

创建共享内存块的进程必须将虚拟地址存储在某个地方,或者在共享内存中,在文件中,或者使用某种其他方法,以便另一个进程可以确定原始虚拟地址。然后在 mmap() 调用中使用已知的虚拟地址以及 MAP_FIXED 标志。

我能够使用共享内存来做到这一点。这样做时,“黄金”虚拟地址存储在共享内存块中;我创建了一个包含多个项目的结构,地址是其中之一,并在块的开头对其进行了初始化。

想要映射共享内存的进程必须执行 mmap() 函数两次;一次获得“黄金”虚拟地址,然后使用 MAP_FIXED 标志将该块映射到该地址。

有趣的是,我正在使用运行 2.6 内核的嵌入式系统。默认情况下,它将为给定文件描述符的所有 mmap() 调用提供相同的虚拟地址。去搞清楚。

鲍勃·维尔卡