MIPS 程序集中的动态内存 allocation/deallocation

Dynamic memory allocation/deallocation in MIPS asembly

我正在我的计算机组织中开展一个项目 class,涉及 MIPS 汇编中的动态内存分配和释放。我们使用 SPIM 或 MARS 模拟环境。

当我开始设置我的代码时,我开始意识到 MIP 中有些东西我不知道该怎么做。

首先,我了解了如何使用系统调用代码 9 (sbrk) 从堆中分配内存。但是,我不明白如何将内存释放回堆。几年前有人问过这个问题但没有很好的答案,堆栈溢出有一个 post。大多数人说在参数寄存器中使用负数,但这在 SPIM 或 MARS 中不起作用。

其次,我不确定用户如何保存动态变量。例如,如果用户从堆中请求 32 个字节,系统会提示他们为变量保存一个名称。我们如何动态创建一个新变量并为其分配我们提供的新内存?本质上,我知道我们可以在代码的 .data 部分创建变量,但我不确定如何动态地执行此操作。我在网上找不到太多好的文档,而且我对 MIPS 还不太满意。

总的来说,这个学期过得很迷茫,我们被仓促地完成了这项作业(在此之前我们只有一个 MIPS 作业),所以非常感谢大家的帮助。组装真是一头野兽。

这是好奇的项目提示:

In this assignment, you are required to design and implement in MIPS a project for dynamic allocation and deallocation of memory on user demand. However, you can make the following simplifying assumptions:

  • The memory pool is limited to 4096 bytes
  • The memory pool divided into equal chunks of 32 bytes (chosen due to MIPS architecture). Thus, the 4096 bytes memory will be divided into 128 chunks.
  • Despite allocation requests coming in any size, the actual allocations should be performed in integer multiples of chunks. Therefore, the byte size request will be rounded up to the closest multiple of 32.
  • To succeed in this task, the code must allocate and deallocate memory upon request. If some of the requests cannot be handled, exception handling must activate to resolve the issue.

However, I do not understand how it is possible to deallocate memory back to the heap.

MARS/SPIM 不允许将内存返回到堆,AFAIK。即使他们确实像 unix 那样允许负值 sbrk,它也只支持返回最近分配的(由 sbrk)项目——这与客户期望的任何堆项目都可以被释放是不同的。

因此,您唯一能做的就是提供一个中间分配器,它跟踪已释放的 space,并且更喜欢已释放的 space(例如,增加堆 space 与 sbrk) 尽可能进行新分配。

Second, I am unsure how to save dynamic variables by the user.

这是程序责任——我指的是测试程序或用户程序,而不是实现 malloc 和 free 的库。我想会有一些测试程序。该程序将调用您的 malloc 和 free 实现,并且可能只会通过分配和释放大量内存来通过测试,但保持在最大内存的 4k 限制内。

To succeed in this task, the code must allocate and deallocate memory upon request. If some of the requests cannot be handled, exception handling must activate to resolve the issue.

我很难想象这意味着什么。显然,当无法满足内存请求(即内存不足)时,我们可以终止程序,但本文建议某种异常处理可以解决问题。