用 `mmap` 替换 `sbrk`
Replacing `sbrk` with `mmap`
我读到 sbrk
是一个已弃用的调用,应该更喜欢带有 MAP_ANONYMOUS
标志的 mmap
。我需要一个可以增长的连续(逻辑)内存块。但是,mmap
将第一个参数视为提示,因此它会产生间隙,这在我的情况下是不可接受的。我尝试使用 MAP_FIXED
标志(不推荐使用该标志)并且我可以获得连续内存,但是在映射多个页面之后我的程序出现了奇怪的行为:系统函数如 printf
和 clock_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,您可以使用 mmap
和 MAP_NORESERVE
(可能还有 PROT_NONE
)来声明一大块地址 space,而无需实际分配任何地址记忆。您映射您可能想要(并且可以获得)的最大区域,然后使用 MAP_FIXED
重新映射它的位以根据需要实际分配内存。
我读到 sbrk
是一个已弃用的调用,应该更喜欢带有 MAP_ANONYMOUS
标志的 mmap
。我需要一个可以增长的连续(逻辑)内存块。但是,mmap
将第一个参数视为提示,因此它会产生间隙,这在我的情况下是不可接受的。我尝试使用 MAP_FIXED
标志(不推荐使用该标志)并且我可以获得连续内存,但是在映射多个页面之后我的程序出现了奇怪的行为:系统函数如 printf
和 clock_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,您可以使用 mmap
和 MAP_NORESERVE
(可能还有 PROT_NONE
)来声明一大块地址 space,而无需实际分配任何地址记忆。您映射您可能想要(并且可以获得)的最大区域,然后使用 MAP_FIXED
重新映射它的位以根据需要实际分配内存。