用`mmap`替换`sbrk`

时间:2016-06-28 09:12:46

标签: linux posix mmap libc sbrk

我已经读过sbrk是一个不推荐的电话,而且应该更喜欢带有mmap标志的MAP_ANONYMOUS。我需要一个可以增长的连续(逻辑)内存块。但是,mmap将第一个参数视为提示,因此它可以产生间隙,这在我的情况下是不可接受的。我尝试使用MAP_FIXED标志(不建议使用文档状态)并且我可以获得连续内存,但是在映射了几个页面后,我的程序出现了奇怪的行为:系统函数,如printf和{{ 1}}开始失败。我想我在没有clock_gettime的情况下调用的第一个mmap会返回包含一些映射页面的页面,其中包含系统数据。那么使用MAP_FIXED代替mmap的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

使用Linux,您可以mmap使用MAP_NORESERVE(可能还有PROT_NONE)来声明大量的地址空间,而无需实际分配任何内存。您可以映射您可能想要(并且可以获得)的最大区域,然后使用MAP_FIXED重新映射它的位,以根据需要实际分配内存。

答案 1 :(得分:0)

  

我读过sbrk是一个不推荐的电话

不要相信你读过的所有内容,特别是如果来源不具有权威性。

  

我需要一个可以增长的连续(逻辑)内存块。

在这种情况下,mmap不适合您,除非您愿意声明该块可以增长的最大大小。

  

我尝试使用MAP_FIXED标志(不建议使用文档状态)并且我可以获得连续内存,但是在映射了几个页面后,我的程序出现了奇怪的行为

使用MMAP_FIXED时,您必须非常小心:系统会很乐意映射之前的任何内容(如果有的话),包括libc数据和代码。