-
2009-04-23
dlmalloc in u-boot (3) 流程 - [uboot]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://redboot.blogbus.com/logs/38382371.html
接上篇
最后大致讲一下处理流程,主要讲几个函数 malloc, free 和 malloc_extend_top。
- malloc
当申请内存的时候就调用 Void_t* malloc(size_t bytes)
malloc函数首先根据申请内存的大小计算实际需要的内存,因为malloc_chunk本身需要一些内存,还有8字节对齐的pad部分。如果实际需要的内存小于512byte就直接在相应的bin中寻找是否有空余的内存,如果没有可以再到下一个bin中寻找(这个个bin分配到的内存要多8byte。)如果需要内存不小于512就要根据相应算法找到所需的bin。查找空闲内存块。因为这里的内存块大小并不相同,所以要比较大小。如果大于所需内存太多(多过一个最小块的大小)就不能用了。
如果上面步骤没有找到内存,就到last_remainder里面去找,如果last_remainder里面的够大。就在上面分配。
如果还没有找到就全局搜索,寻找 best fitting chunk。这时还没有找到的话,就在top上面分配,如果top上面的大小不够,则调用malloc_extend_top函数向系统申请更多的内存扩充top。如果还申请不到足够的内存,就只能返回空指针了。
- free
free的算法比较简单,当free一块内存时,就把这个malloc_chunk块挂到相应的bin中,不过在挂之前,要先看看邻接的内存块是否空闲,如果空闲则正好合并成大块,这样可以减少内存碎片的问题。
另外,如果当前释放的内存被合并到top上面,会检查一下top有多大,如果非常大了(uboot定义为128k),就通过函数malloc_trim还给系统。
- malloc_extend_topmalloc本身并没有内存,所有的内存都是通过malloc_extend_top函数分配给top, 然后再给malloc函数去分配的。所以,本身malloc_extend_top函数很简单,不过要注意几个事情,一个是向内存申请通常是以一页(4k)为单位申请;另外,每次向系统申请的内存通常来说应当连续,如果不连续说明还有别的程序再想系统申请内存,这时不能把分到的内存直接扩充到top上。
好了,最近看的dlmalloc的部分基本上写完了。
其实,代码本身比较细,很多东西一下子看不清楚,所以难免有理解错的地方。
写下来有个好处,回头如果需要不必重新看起。
读了dlmalloc后,自己在其基础上面写了个非常简单的malloc。
实现一个简单的malloc功能:
只有一个链表,所有free的内存块都挂在上面,
分配的时候,先从这个链表里面找 first-fit,就是只要够大就用,如果非常大就分割一下。
如果链表不够,就调用malloc_extend_top申请新内存。
跑了一下感觉还不错,其实在uboot这种简单应用场景下面这样简单的东西也够用啦。
随机文章:
dlmalloc in u-boot (2) 数据结构 2009-04-23dlmalloc in u-boot (1) 简介 2009-04-22u-boot移植 2009-02-12u-boot命令配置 2009-02-12u-boot编译过程二 2009-02-11
收藏到:Del.icio.us







