首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将“`sbrk`”改为“`mmap`”

将“`sbrk`”改为“`mmap`”
EN

Stack Overflow用户
提问于 2016-06-28 09:12:46
回答 2查看 1.1K关注 0票数 1

我读过sbrk是一个不受欢迎的调用,人们应该更喜欢带有MAP_ANONYMOUS标志的mmap。我需要一个连续的(逻辑的)内存块,可以增长。但是,mmap将第一个参数视为提示,因此它可以造成空白,这在我的情况下是不可接受的。我尝试使用MAP_FIXED标志(不推荐使用文档状态),我可以获得连续内存,但是在映射了几个页面之后,我得到了程序的奇怪行为:像printfclock_gettime这样的系统功能开始失败。我想,我调用的第一个mmap (没有MAP_FIXED )返回的页面后面有一些映射的页面,其中包含系统数据。那么,使用mmap而不是sbrk的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 18:32:25

使用Linux,您可以使用mmapMAP_NORESERVE (可能还有PROT_NONE)在不实际分配任何内存的情况下占用大量地址空间。您可以映射您可能需要的最大区域(并且可以得到),然后用MAP_FIXED重新映射其中的一些部分,以便根据需要实际分配内存。

票数 2
EN

Stack Overflow用户

发布于 2016-06-29 17:02:19

我读到过斯布鲁克是个不受欢迎的电话

不要相信你所读到的所有东西,尤其是如果你的资料来源不是权威的话。

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

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

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

使用MMAP_FIXED时,您必须非常小心:系统将很高兴地映射以前存在的任何东西(如果有的话),包括libc数据和代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38071916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档