出于学习的目的,我尝试在堆内存中实现堆栈。当我推送一些东西时,我只需要执行系统调用sbrk,这很好。当我继续弹出时,我可以取回我的值,但我不能释放分配的空间。有什么方法可以做到这一点吗?sbrk系统调用不接受负数。我已经试过了。
sbrk
elcex8rz1#
与UNIX中的真实的sbrk不同,QtSpim/MARS系统调用#9不支持将内存从堆返回到系统。但是,您可以自己实现sbrk功能,因为它相当简单。(malloc/free会更复杂,涉及自由列表等,但这要简单得多。)当然,您需要一个子例程,它像真实的sbrk一样接受调整号,并维护少量的持久/全局状态--可能是两个字:UNIX风格的sbrk地址和MARS风格的syscall #9地址,或者,其中之一或另一个和一个空闲计数。释放内存(负的sbrk参数)仅仅意味着将UNIX风格的sbrk地址移回和/或增加空闲计数,否则什么也不做。稍后的分配(正sbrk参数)在分配新堆空间时考虑标记之间的差距或空闲计数,并且仅在空闲计数变为0并且分配请求中仍有更多字节时才增加底层MARS堆。
malloc
free
23c0lvtd2#
在MIPS中,可以通过使用sbrk系统调用并相应地调整程序中断地址来释放堆内存。
2条答案
按热度按时间elcex8rz1#
与UNIX中的真实的
sbrk
不同,QtSpim/MARS系统调用#9不支持将内存从堆返回到系统。但是,您可以自己实现
sbrk
功能,因为它相当简单。(malloc
/free
会更复杂,涉及自由列表等,但这要简单得多。)当然,您需要一个子例程,它像真实的
sbrk
一样接受调整号,并维护少量的持久/全局状态--可能是两个字:UNIX风格的sbrk
地址和MARS风格的syscall #9地址,或者,其中之一或另一个和一个空闲计数。释放内存(负的
sbrk
参数)仅仅意味着将UNIX风格的sbrk
地址移回和/或增加空闲计数,否则什么也不做。稍后的分配(正
sbrk
参数)在分配新堆空间时考虑标记之间的差距或空闲计数,并且仅在空闲计数变为0并且分配请求中仍有更多字节时才增加底层MARS堆。23c0lvtd2#
在MIPS中,可以通过使用sbrk系统调用并相应地调整程序中断地址来释放堆内存。