0

出于学习目的,我正在尝试在堆内存中实现一个堆栈。

当我推送某些东西时,我只需要执行 systemcall sbrk,这很好。

当我继续弹出时,我可以检索我的值,但我无法释放分配的空间。有没有办法做到这一点?

系统sbrk调用不接受负数。我已经试过了。

4

1 回答 1

2

sbrkUNIX 中的实际不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回到系统。

但是,您可以sbrk自己实现功能,因为它相当简单。(malloc/free涉及自由列表等会更复杂,但这要简单得多。)

当然,您需要一个像 real 一样获取调整数的子例程sbrk,并维护少量的持久/全局状态 - 可能是两个词:UNIX 样式的sbrk地址和 MARS 样式的系统调用 #9 地址,或者,一个那些或其他的和一个免费的计数。

释放内存(负sbrk参数)只是意味着将 UNIX 样式的sbrk地址移回和/或增加空闲计数,否则什么也不做。

稍后的分配(正sbrk参数)在分配新堆空间时考虑标记或空闲计数之间的间隙,并且仅在空闲计数变为 0 并且分配请求中还有更多字节时才增加底层 MARS 堆。

于 2022-01-02T22:28:40.247 回答