出于学习目的,我尝试在堆内存中实现堆栈。
当我推送某些东西时,我只需要执行系统调用sbrk
,就可以了。
当我继续弹出时,我可以检索我的值,但无法释放分配的空间。有什么办法可以做到这一点吗?
sbrk
系统调用不接受负数。我已经尝试过了。
最佳答案
与 UNIX 中真正的 sbrk
不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回到系统。
但是,您可以自己实现 sbrk 功能,因为它相当简单。 (malloc
/free
会更复杂,涉及空闲列表等,但这要简单得多。)
当然,您需要一个像真正的 sbrk
一样采用调整编号的子例程,并维护少量的持久/全局状态 - 也许两个词:UNIX 风格 sbrk
地址和 MARS 风格的系统调用 #9 地址,或者其中之一和一个自由计数。
释放内存(负sbrk
参数)仅仅意味着将UNIX风格的sbrk
地址移回和/或增加空闲计数,否则什么也不做。
稍后的分配(正 sbrk
参数)在分配新的堆空间时考虑标记之间的间隙或可用计数,并且仅在可用计数变为 0 并且仍有更多字节时才增加底层 MARS 堆在分配请求中。
关于assembly - 如何释放MIPS中的堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70559682/