用 `mmap` 替换 `sbrk`

Replacing `sbrk` with `mmap`

我读到 sbrk 是一个已弃用的调用,应该更喜欢带有 MAP_ANONYMOUS 标志的 mmap。我需要一个可以增长的连续(逻辑)内存块。但是,mmap 将第一个参数视为提示,因此它会产生间隙,这在我的情况下是不可接受的。我尝试使用 MAP_FIXED 标志(不推荐使用该标志)并且我可以获得连续内存,但是在映射多个页面之后我的程序出现了奇怪的行为:系统函数如 printfclock_gettime开始失败。我猜我调用的第一个 mmap 没有 MAP_FIXED returns 页面,后面有一些映射页面,其中包含系统数据。那么使用 mmap 而不是 sbrk 的正确方法是什么?

I've read that sbrk is a deprecated call

不要相信你读到的一切,尤其是当来源不权威时。

I need one continous (logical) memory block that can grow.

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

I tried to use MAP_FIXED flag (which as documentation states is not recommended) and I can get continuos memory, but after mapping several pages I get strange behaviour of my program

使用 MMAP_FIXED 时,您必须 非常 小心:系统将愉快地映射之前存在的任何内容(如果有的话),包括 libc 数据和代码。

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