问题标签 [sbrk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
53 浏览

c - 为什么调用 sbrk() 时会出现这样的错误?

所以我这样称呼 sbrk :

当我调试时,它在该特定行上给了我这个错误:

为什么会这样?这个错误是什么?

编辑:示例代码

这是我的代码中出错的部分。

0 投票
1 回答
52 浏览

assembly - 如何在 MIPS 中释放堆内存

出于学习目的,我正在尝试在堆内存中实现一个堆栈。

当我推送某些东西时,我只需要执行 systemcall sbrk,这很好。

当我继续弹出时,我可以检索我的值,但我无法释放分配的空间。有没有办法做到这一点?

系统sbrk调用不接受负数。我已经试过了。

0 投票
2 回答
300 浏览

gcc - 尝试使用 sbrk 减小数据段大小时在 glibc 中中止

在使用 glibc 时,我尝试使用sbrk使用负参数来减少数据段,并发现了一个最奇怪的行为。

我先是malloc,然后free是它,然后用 减少数据段sbrk,然后malloc再次使用与第一个相同的大小。

问题是,如果malloc大小(两个mallocs 大小相同)足够小(32k 或 8 个 4k 页),那么一切正常。但是当我增加一点malloc- free-malloc大小(到九个4k 页)然后我得到核心转储。更奇怪的是,当我提高malloc大小以mmap超过阈值(128k)时,我得到了调整中止行为。

C代码:

编译:

这给出了成功的输出MMAP_ALLOC_SIZE (8 * 4096)

的以下中止输出MMAP_ALLOC_SIZE (9 * 4096)

以及以下的调整中止输出MMAP_ALLOC_SIZE (33 * 4096)

因此,sbrk减少调用可以正常工作,但malloc即使仍有足够的内存可用,后续调用也会引发核心转储。

我做错了什么或者这是数据段调整大小的限制?

编辑:除了使用malloc_trim()我在下面发布的代码解决方案外,非常欢迎接受的答案,还有一些关于这个问题的重要信息,从聊天中恢复:

首先,man页面说避免使用sbrk,但 glibc 手册没有。

malloc.c来自 glibc 确实包含关于sbrk可能使用有符号整数调用的评论 - 因此是负整​​数 - 内存参数减少值,并且确实对调用brksbrkmalloc. 的工作malloc并非对 不敏感sbrk,它们不是来自“不同级别”的编码,它们应该和谐地协同工作,至少在代码注释方面是这样。另外,我的第一个测试用例运行良好,这意味着它sbrk本身不是一个可以使用的问题malloc,但只是在某些特定情况下不处理。

最后,重要的是有人可以破坏 glibc 分配,这可能是一个安全漏洞。例如,黑客可以使用被另一层间接访问的 glibc 的某个实例来调用sbrk以导致库崩溃。我不是安全专家,但鉴于 glibc 在全球范围内有如此多的不同用途,原则上某些恶意程序员可能会利用此sbrk崩溃来访问未受保护的系统。不确定,但肯定应该由 glibc 开发人员进行调查。

我敢肯定这不是一个无聊的问题。