出于学习目的,我正在尝试在堆内存中实现一个堆栈。
当我推送某些东西时,我只需要执行 systemcall sbrk
,这很好。
当我继续弹出时,我可以检索我的值,但我无法释放分配的空间。有没有办法做到这一点?
系统sbrk
调用不接受负数。我已经试过了。
出于学习目的,我正在尝试在堆内存中实现一个堆栈。
当我推送某些东西时,我只需要执行 systemcall sbrk
,这很好。
当我继续弹出时,我可以检索我的值,但我无法释放分配的空间。有没有办法做到这一点?
系统sbrk
调用不接受负数。我已经试过了。
与sbrk
UNIX 中的实际不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回到系统。
但是,您可以sbrk
自己实现功能,因为它相当简单。(malloc
/free
涉及自由列表等会更复杂,但这要简单得多。)
当然,您需要一个像 real 一样获取调整数的子例程sbrk
,并维护少量的持久/全局状态 - 可能是两个词:UNIX 样式的sbrk
地址和 MARS 样式的系统调用 #9 地址,或者,一个那些或其他的和一个免费的计数。
释放内存(负sbrk
参数)只是意味着将 UNIX 样式的sbrk
地址移回和/或增加空闲计数,否则什么也不做。
稍后的分配(正sbrk
参数)在分配新堆空间时考虑标记或空闲计数之间的间隙,并且仅在空闲计数变为 0 并且分配请求中还有更多字节时才增加底层 MARS 堆。