怎么写一个内存分配器

如何写一个内存分配器
我想在应用程序里写一个内存分配器
已知:内存起始地址 char * p;
长度int length= 4012;

接口类似于 malloc free
求参考例子
------解决方案--------------------
这是要实现内存池?
------解决方案--------------------
见我博客了。。。
------解决方案--------------------
这篇文章详述了如何设计一个内存分类器,并提供了源代码下载地址。
http://article.yeeyan.org/view/25646/6380?from_com
怎么写一个内存分配器

------解决方案--------------------
推荐看看Nginx的内存管理!挺好的
------解决方案--------------------
引用:
Quote: 引用:

这是要实现内存池?

有点类似,不过是在嵌入式MCU上的,RAM最多8K

嵌入式上比较简单,用不着页分配,在嵌入式应用中大多数ram会被一个程序占用,可以简单的这样实现:

int alloced_size = 0;
int total_size = 0x400 * 8;
int mem_start_addr = 0x000d0000;

void* myram_alloc(int size)
{
    void* ptr = NULL;

    if (total_size - alloced_size < size)
    {
        /*no memory remain*/
        return NULL;
    }
    ptr = ioremap(mem_start_addr,size);

    alloced_size += size;
    return ptr;
}

free的时候会麻烦一点,要将已分配的内存的size传入然后进行回收,上面这个版本缺陷太多,仅仅作为一种思路,希望有用
------解决方案--------------------
静态链表 会写吧!MCU 基本够用了
------解决方案--------------------
请参考dlmalloc 和dlfree的实现
------解决方案--------------------
学习了我是菜鸟
------解决方案--------------------
引用:
学习了我是菜鸟

我也是菜鸟,可我学不懂
------解决方案--------------------
大家玩的太高深了,搞不懂!
------解决方案--------------------
还可以参考Linux源代码中malloc和free的实现。
------解决方案--------------------
数组+链表 。。
------解决方案--------------------
最简单的原理:

先初始化你的内存池:
p[0]=0;//0表示未分配,1 表示已分配
p[1]=4010;//可用内存长度

第一次调用mymalloc(10),那么
p[0]=1//表示这是一个已分配的块
p[1]=10//表示分配的长度
p[12]=0;//未分配
p[13]=4012-10-2-2;//剩下的可用内存
retrun p+2;//这是用户得到的地址

第二次调用mymalloc(5),那么
检查发现p[0]==1,所以跳过p[1]指示的长度
检查发现p[12]==0,那么这里可以进行分配了,方法和第一次调用一样。

myfree(ptr)调用的时候
将ptr-2位置置为0,就表示这个块没有分配了。

最后你可以选择在malloc或者free的时候合并相邻的未分配块。

当然以上只是一个最基本的原理,你需要自己处理对齐等问题,也可以添加更多的记录信息。