Memory management 内存管理
如何在mips assembly(特别是SPIM模拟器)中手动管理堆 我发现,当使用sbrk系统调用时,堆开始于0x10040000,例如Memory management 内存管理,memory-management,assembly,mips,spim,Memory Management,Assembly,Mips,Spim,如何在mips assembly(特别是SPIM模拟器)中手动管理堆 我发现,当使用sbrk系统调用时,堆开始于0x10040000,例如 li$t0,1 li$s0,9 syscall sw$t0,($s0)#1位于0x10040000处 那么,对sbrk的调用是否不能保证您将获得下一个可用内存插槽?例如,如果我为单个4字节空间调用sbrk,SPIM可能会分配地址:0x10040000-0x10040003。但是,对另一个4字节空间的第二次调用可能与之前的4字节分配无关?因此,需要一个数据结构
li$t0,1
li$s0,9
syscall
sw$t0,($s0)#1位于0x10040000处
那么,对sbrk的调用是否不能保证您将获得下一个可用内存插槽?例如,如果我为单个4字节空间调用sbrk,SPIM可能会分配地址:0x10040000-0x10040003。但是,对另一个4字节空间的第二次调用可能与之前的4字节分配无关?因此,需要一个数据结构来跟踪分配了哪些内存插槽?最后,内存管理器是否通过确定特定数据结构跟踪的地址之间的可用空间来减少对sbrk的调用次数?在实际系统中,sbrk返回页面粒度分配。我不确定SPIM模拟器是否会(少量的在线文档暗示它将返回任何面向字节的粒度) 通常,sbrk系统调用只设置“堆结束”指针。底层操作系统只知道堆的开始(sbrk在程序开始时启动),以及堆的当前结束指针。从操作系统的角度来看,该绑定中的所有内存都被认为是程序正在使用的堆内存 (注意,在您的例子中,我相信SPIM模拟器需要一个整数来缓冲指针,因此隐式地所有内存都是连续的,我认为中断总是在增加?) 通常构建在sbrk上的“malloc”API提供的不仅仅是一个简单的连续不断增长的内存区域。一个好的malloc库通常允许您将内存区域标记为“空闲”(这样就可以使用它来满足后续的malloc调用)。请注意,操作系统通常不知道这种“免费”。Malloc跟踪内存是否可用。通常,malloc无法将堆的这个任意区域返回到操作系统,因为从操作系统的角度来看,堆是一个单独的连续区域 真正的malloc实现必须处理分配请求和页面大小之间的不匹配(正常的sbrk只返回页面对齐、页面大小分配的倍数)。您的模拟器案例没有这个问题,因为sbrk是细粒度的 请注意,跟踪哪个内存正在使用或未使用需要内存,因此malloc有一些开销。一些实现被设计为将大部分簿记存储在“空闲”内存中(减少客户端的明显成本)。有很多其他的策略来匹配malloc和sbrk。。。。(在您的例子中,将malloc映射到sbrk,并且只要不分配太多内存,就可以免费使用no-op…) 以下概述了
malloc
和sbrk
之间的关系,它勾勒出了一些我没有耐心转录的ASCII艺术: