assembly 如何在MIPS中释放堆内存

0ejtzxu1  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(65)

出于学习的目的,我尝试在堆内存中实现堆栈。
当我推送一些东西时,我只需要执行系统调用sbrk,这很好。
当我继续弹出时,我可以取回我的值,但我不能释放分配的空间。有什么方法可以做到这一点吗?
sbrk系统调用不接受负数。我已经试过了。

elcex8rz

elcex8rz1#

与UNIX中的真实的sbrk不同,QtSpim/MARS系统调用#9不支持将内存从堆返回到系统。
但是,您可以自己实现sbrk功能,因为它相当简单。(malloc/free会更复杂,涉及自由列表等,但这要简单得多。)
当然,您需要一个子例程,它像真实的sbrk一样接受调整号,并维护少量的持久/全局状态--可能是两个字:UNIX风格的sbrk地址和MARS风格的syscall #9地址,或者,其中之一或另一个和一个空闲计数。
释放内存(负的sbrk参数)仅仅意味着将UNIX风格的sbrk地址移回和/或增加空闲计数,否则什么也不做。
稍后的分配(正sbrk参数)在分配新堆空间时考虑标记之间的差距或空闲计数,并且仅在空闲计数变为0并且分配请求中仍有更多字节时才增加底层MARS堆。

23c0lvtd

23c0lvtd2#

在MIPS中,可以通过使用sbrk系统调用并相应地调整程序中断地址来释放堆内存。

相关问题