MIPS内存管理

4
如何在MIPS汇编中手动管理堆内存,特别是SPIM模拟器?
当使用sbrk系统调用时,我发现堆从0x10040000开始,例如: li $t0, 1 li $s0, 9
syscall
sw $t0, ($s0) # 1位于0x10040000处
那么,调用sbrk是否不能保证您会得到下一个可用的内存空间?例如,如果我为单个4字节空间调用sbrk,则SPIM可能分配地址:0x10040000-0x10040003。然而,对另一个4字节空间的第二次调用可能与先前的4字节分配无关?因此,需要数据结构来跟踪已分配的内存空间?最后,内存管理器是否通过确定特定数据结构跟踪的地址之间的空闲空间来减少对sbrk的调用次数?
1个回答

6
在实际系统中,sbrk返回以页面为粒度的分配。我不确定SPIM模拟器是否这样做(简陋的在线文档暗示它将返回任何字节定向的粒度)。
一般来说,sbrk系统调用只设置“堆结束”指针。底层操作系统所知道的是堆的起始位置(程序开始时sbrk的位置)和当前的堆结束指针。该范围内的所有内存都被认为是程序使用的堆内存(从操作系统的角度来看)。
(注意,在您的情况下,我相信SPIM模拟器需要一个整数来增加指针,因此隐含地所有内存都是连续的,并且我认为断点总是在增加?)
通常建立在sbrk上的“malloc” API提供了更多不仅仅是简单的连续增长内存区域。一个好的malloc库通常允许你标记一块内存区域为“free”(这样就可以用来满足后续的malloc调用)。请注意,操作系统通常不知道这个“free”。Malloc跟踪内存是否空闲。一般情况下,malloc不能将堆中的任意区域返回给操作系统,因为从操作系统的角度来看,堆是单个连续区域。
真正的malloc实现必须处理分配请求和页面大小之间的不匹配(正常的sbrk只返回页面对齐、页面大小的倍数)。您的模拟器情况没有这个问题,因为sbrk是细粒度的。
请注意,跟踪哪些内存正在使用或未使用需要内存,因此malloc有一些开销。一些实现被设计为将大部分的簿记存储在“free”内存中(降低了对客户端的表面成本)。还有很多其他将malloc与sbrk匹配的策略...(在您的情况下,将malloc映射到sbrk,并使free成为无操作将“有效”,只要您不分配太多内存...)
这里是关于mallocsbrk的概述,它画了一些我没有耐心转录的ASCII艺术:http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接