我必须使用c/asm来创建内存管理系统,因为malloc/free还不存在。我需要拥有malloc/免费!
我正在考虑使用内存堆栈作为内存的空间,但是这将失败,因为当堆栈指针缩小时,分配的空间会发生一些丑陋的事情。
1)在哪里分配内存?如果我将它随机放置在堆/堆栈的中间,并且堆/堆栈扩展,就会与分配的空间发生冲突!
12什么是最简单/最干净的内存管理解决方案?这是我研究过的唯一选择:
谢谢!
发布于 2011-09-28 08:40:04
对于嵌入式系统,内存在链接时被划分为几个部分或池,即: ro (代码+常量) rw (堆) zi (静态变量的零初始化内存)
您可以在链接器配置文件中添加第4节,这将有效地为动态分配分配内存映射中的空间。
但是,一旦为动态内存创建了原始存储,就需要了解动态分配的数量、大小和频率。从这一点上,您可以构建一张内存将如何随着时间的推移被分割的图片。
通常,运行OS空闲的应用程序不会使用动态内存,因为您不希望处理malloc失败的后果。如果可能的话,更好的解决方案是设计以避免它。如果这是不可能的,那么尝试使用一些大的结构来简化动态行为,这些结构在需要使用数据之前就已经预先分配了数据。
例如,如果您有一个处理10字节数据的应用程序,同时接收接下来要处理的10字节数据,则可以实现一个简单的缓冲解决方案。驱动程序将始终请求相同大小的缓冲区,并且需要3个缓冲区。向结构中添加少量元数据:
{
int inUse;
char data[10];
}
您可以使用由三个结构组成的数组(记得将inUse初始化为0,并在和1之间切换,其中2只用于当出现过多中断而下一个缓冲区被释放时(需要第三个缓冲区)的情况。分配算法需要检查第一个缓冲区!inUse,并返回指向数据的指针。空闲只需要将inUse更改为0。
根据您正在使用的可用RAM和机器(物理/虚拟寻址)的数量,有很多可能的算法,但是算法越复杂,分配所需的时间就越长。
发布于 2011-09-28 03:28:05
这篇文章很好地回顾了内存管理技术。底部的资源部分有几个开源malloc实现的链接。
发布于 2011-09-28 05:27:55
声明一个巨大的静态char缓冲区,并使用这个内存来编写您自己的malloc & free函数。
编写malloc和free的算法可以是复杂的(和优化的),也可以是您想要的简单的。
一个简单的方法就是跟随..。
根据应用程序中内存分配需求的类型,尝试找到最常见的缓冲区大小。
希望这能有所帮助。
https://stackoverflow.com/questions/7577828
复制相似问题