mips内存管理

dnb*_*ise 3 assembly memory-management mips spim

你如何在mips程序集中手动管理堆,特别是SPIM模拟器?

堆,我发现在使用sbrk系统调用时从0x10040000开始,例如

li $t0, 1

li $s0, 9

syscall

sw $t0, ($s0) # 1 located at 0x10040000

那么,打电话给sbrk并不能保证你会回到下一个空闲内存插槽吗?例如,如果我为单个4字节空间调用sbrk,SPIM可能会分配地址:0x10040000-0x10040003.但是,对另一个4字节空间的第二次调用可能与之前的4字节分配无关?因此,需要一个数据结构来跟踪哪些内存插槽已被分配?最后,内存管理器是否尝试通过确定特定数据结构跟踪的地址之间的可用空间来减少对sbrk的调用次数?

P.T*_*.T. 6

在实际系统上,sbrk返回页面粒度分配.我不确定SPIM模拟器是否适用(微小的在线文档暗示它将返回任何面向字节的粒度).

通常,sbrk系统调用只是设置"end-of-heap"指针.所有底层操作系统都知道堆的开头(sbrk在程序开始时启动),以及当前的堆尾指针.该边界中的所有内存都被认为(从OS的角度来看)程序使用的堆内存.

(注意,在你的情况下,我相信SPIM模拟器需要一个整数来触发指针,所以隐式地所有内存都是连续的,我认为中断总是在增加?)

通常在sbrk上构建的"malloc"API提供的不仅仅是一个简单的连续,不断增长的内存区域.一个好的malloc库通常允许您将内存区域标记为"free"(因此它可用于满足后续的malloc调用).请注意,操作系统通常不知道这个"免费".Malloc跟踪可用或不可用的内存.通常,malloc不能将堆的任意区域返回给OS,因为从OS的角度来看,堆是一个连续的区域.

真正的malloc实现必须处理分配请求和页面大小之间的不匹配(正常sbrk只返回页面对齐,页面大小分配的多个).你的模拟器案例没有这个问题,因为sbrk是细粒度的.

请注意,跟踪正在使用的内存需要内存,因此malloc有一些开销.一些实现旨在将大部分簿记存储在"免费"存储器中(减少客户端的表观成本).有很多其他的策略可以将malloc与sbrk匹配....(在你的情况下,将malloc映射到sbrk,只要你没有分配太多的内存就可以免费使用no-op''')

这里是一个概述如何mallocsbrk相关的绘制一些ASCII艺术我没有耐心转录:http: //web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html