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