我必须使用c / asm来创建内存管理系统,因为malloc / free还不存在。我需要才能拥有malloc / free!
我在考虑使用内存堆栈作为内存的空间,但这会失败,因为当堆栈指针收缩时,分配的空间会发生丑陋的事情。
1)哪里会分配内存?如果我将它随机放置在堆/堆栈的中间并且堆/堆扩展,则会与分配的空间发生冲突!
12什么最简单/最干净的内存管理解决方案?这些是我研究过的唯一选择:
谢谢!
答案 0 :(得分:4)
This article提供了对内存管理技术的良好回顾。底部的资源部分链接到几个开源malloc实现。
答案 1 :(得分:2)
声明一个巨大的静态字符缓冲区并使用此内存编写自己的malloc&免费功能。
编写malloc和free的算法可以像你想要的那样复杂(和优化)或简单。
一种简单的方法可能是......
根据应用程序中内存分配需求的类型,尝试查找最常用的缓冲区大小
希望这会有所帮助。
答案 2 :(得分:2)
对于嵌入式系统,内存在链接时分为几个部分或池,即: ro(代码+常量) rw(堆) zi(静态变量的零初始化内存)
您可以在链接器配置文件中添加第4部分,以便在内存映射中有效地分配空间以进行动态分配。
但是,一旦为动态内存创建了原始存储,那么您需要了解动态分配的发生次数,大小和频率。从这里你可以建立一个记忆如何随着时间的推移而分裂的图片。
通常,运行OS的应用程序不会使用动态内存,因为您不希望必须处理malloc失败的后果。如果可能的话,更好的解决方案是设计避免它。如果这根本不可能,请尝试使用一些大型结构来简化动态行为,这些结构在需要使用之前预先分配了数据。
例如,假设您有一个处理10字节数据的应用程序,同时接收要处理的下一个10字节数据,您可以实现一个简单的缓冲解决方案。驱动程序将始终请求相同大小的缓冲区,并且需要3个缓冲区。向结构添加一些元数据:
{
int inUse;
char data[10];
}
你可以采用这三种结构的数组(记住初始化inUse为0并在[0]和[1]之间轻弹,[2]保留用于发生一些太多中断和下一个缓冲的情况是必需的缓冲区1被释放(需要第三个缓冲区).ADC算法需要检查第一个缓冲区!inUse并返回一个指向数据的指针。空闲只需要将其更改回使用。
根据您使用的可用RAM和机器(物理/虚拟寻址)的数量,有许多可能的算法,但算法越复杂,分配的时间就越长。
答案 3 :(得分:0)
使用GNU C library。您只能使用malloc()
和free()
或该库的任何其他子集。借用设计和/或实施以及不重新发明轮子是提高工作效率的好方法。
当然,除非这是家庭作业,否则练习的目的是实施malloc
和free
....