1

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

4

2 回答 2

2

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

于 2016-06-29T18:32:25.223 回答
0

我读过 sbrk 是一个已弃用的电话

不要相信你读到的所有东西,特别是如果来源不是权威的。

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

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

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

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

于 2016-06-29T17:02:19.937 回答