问题标签 [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.
c - 为什么调用 sbrk() 时会出现这样的错误?
所以我这样称呼 sbrk :
当我调试时,它在该特定行上给了我这个错误:
为什么会这样?这个错误是什么?
编辑:示例代码
这是我的代码中出错的部分。
assembly - 如何在 MIPS 中释放堆内存
出于学习目的,我正在尝试在堆内存中实现一个堆栈。
当我推送某些东西时,我只需要执行 systemcall sbrk
,这很好。
当我继续弹出时,我可以检索我的值,但我无法释放分配的空间。有没有办法做到这一点?
系统sbrk
调用不接受负数。我已经试过了。
gcc - 尝试使用 sbrk 减小数据段大小时在 glibc 中中止
在使用 glibc 时,我尝试使用sbrk使用负参数来减少数据段,并发现了一个最奇怪的行为。
我先是malloc
,然后free
是它,然后用 减少数据段sbrk
,然后malloc
再次使用与第一个相同的大小。
问题是,如果malloc
大小(两个malloc
s 大小相同)足够小(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
可能使用有符号整数调用的评论 - 因此是负整数 - 内存参数减少值,并且确实对调用brk
和sbrk
与malloc
. 的工作malloc
并非对 不敏感sbrk
,它们不是来自“不同级别”的编码,它们应该和谐地协同工作,至少在代码注释方面是这样。另外,我的第一个测试用例运行良好,这意味着它sbrk
本身不是一个可以使用的问题malloc
,但只是在某些特定情况下不处理。
最后,重要的是有人可以破坏 glibc 分配,这可能是一个安全漏洞。例如,黑客可以使用被另一层间接访问的 glibc 的某个实例来调用sbrk
以导致库崩溃。我不是安全专家,但鉴于 glibc 在全球范围内有如此多的不同用途,原则上某些恶意程序员可能会利用此sbrk
崩溃来访问未受保护的系统。不确定,但肯定应该由 glibc 开发人员进行调查。
我敢肯定这不是一个无聊的问题。