快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
ADI bf561 DSP
优视BF561EVB开发板
uclinux-2008r1-rc8 (移植到vdsp5)
Visual DSP++ 5.0
cygwin gcc 3.4.4
codeblocks 8
欢迎转载,但请保留作者信息
bfin-uclinux内核的内存管理主要涉及三种算法,bootmem,buddy和slab。其中bootmem在内核启动的初期发挥作用,它将系统的可用内存以页的形式组织起来。然后Buddy算法接管这些页,将之分成不同大小的页块,这个工作完成后,bootmem退出舞台且不再出现。而slab算法则从buddy中取一些页面出来进行小对象的分配,内核的实际对象分配都是使用它来完成的。在这三种算法的配合下,内核得以高效利用内存。
那么,高效到底高到什么程度呢?在《The Slab Allocator: An Object-Caching Kernel Memory Allocator》这篇文章中,Jeff Bonwick对此有了非常完整的说明并给出了一些实验数据。这篇文章发表于1994年,这么多年了,内核经过无数次的修改,这篇文章中的数据是否还能适用?最近刚好在研究内存管理,就来验证一下吧!
虽然在VDSP下可以进行一些验证工作,但是效率偏低。况且这个算法本身应该是可以独立于内核的。怎么办?将之移植出来似乎是一个不错的办法。
为了尽可能少地改动内核的代码,选用一个兼容的编译器就成了很好的选择。经过考虑,决定选择如下平台:
AMD Sempron 2800+
Windows XP
CodeBlocks 8 IDE
Cygwin gcc 3.4.4
Mingw做为备选编译器
在此平台下验证通过后再到VDSP下跑得到一组内核实际运行的数据。
在cygwin下编译时取消开关中断和同步处理。
先做了个简单测试:
int main()
{
int i;
void *p;
srand(time(NULL));
start_kernel();
for(i = 0; i < 100000; i++)
{
//p = kmalloc(rand() % 1000000, GFP_KERNEL);
//kfree(p);
p = malloc(rand() % 1000000);
free(p);
}
return 0;
}
这段代码用于不断分配随机大小的内存块,然后释放。
在不启用优化的情况下,经过运行,使用slab算法进行1千万次的分配只要3.343秒,而直接使用malloc进行十万次的分配却要6.640秒,看来有很多个数量级的差距啊。
在启用优化的情况下(-O3),经过运行,使用slab算法进行1千万次的分配只要1.031秒,而直接使用malloc进行十万次的分配却要6.535秒,看来有很多个数量级的差距啊。
从这里还可以看到,GCC的优化效率还是不错的,一下提高了3倍的效率,还啥事都不要做。呵呵。
更多精彩,稍后继续~~~~~~~~~~~~~~~
uClinux2.6(bf561)中的CPLB( 2008/2/19 )
uclinux2.6(bf561)中的bootmem分析(1):猜测( 2008/5/9 )
uclinux2.6(bf561)中的bootmem分析(2):调用前的参数分析( 2008/5/9 )
uclinux2.6(bf561)中的bootmem分析(3):init_bootmem_node( 2008/5/9 )
uclinux2.6(bf561)中的bootmem分析(4):alloc_bootmem_pages( 2008/5/9 )
uclinux2.6(bf561)内核中的paging_init( 2008/5/12 )
uclinux-2008r1(bf561)内核的icache支持(1):寄存器配置初始化( 2008/5/16 )
uclinux-2008r1(bf561)内核的icache支持(2):icplb_table的生成( 2008/5/16 )
uclinux-2008r1(bf561)内核的icache支持(3):__fill_code_cplbtab( 2008/5/16 )
uclinux-2008r1(bf561)内核的icache支持(4):换页问题( 2008/5/16 )
再读uclinux-2008r1(bf561)内核中的bootmem( 2008/6/3 )
uclinux-2008r1(bf561)内核中与存储管理相关的几个全局变量( 2008/6/4 )
uclinux-2008r1(bf561)内核存储区域初探( 2008/6/4 )
uclinux-2008r1(bf561)内核中的zonelist初始化( 2008/6/5 )
uclinux-2008r1(bf561)内核中内存管理相关的几个结构体( 2008/6/5 )
再读内核存储管理(1):相关的全局变量( 2008/6/17 )
再读内核存储管理(2):相关的数据结构( 2008/6/17 )
再读内核存储管理(3):bootmem分配策略( 2008/6/17 )
再读内核存储管理(4):存储区域管理( 2008/6/17 )
再读内核存储管理(5):buddy算法( 2008/6/17 )
再读内核存储管理(6):高速缓存的应用( 2008/6/17 )
再读内核存储管理(7):icache支持( 2008/6/17 )
再读内核存储管理(8):片内SRAM的使用( 2008/6/17 )
初读SLAB( 2008/6/26 )
三读bootmem( 2008/7/24 )
再读uclinux-2008r1(bf561)内核存储区域管理(1):相关数据结构( 2008/7/25 )
再读uclinux-2008r1(bf561)内核存储区域管理(2):可用页表初始化( 2008/7/25 )
再读uclinux-2008r1(bf561)内核存储区域管理(3):zone初始化( 2008-7-25 )
再读uclinux-2008r1(bf561)内核存储区域管理(4):zonelist初始化( 2008-7-25 )
再读uclinux-2008r1(bf561)内核存储区域管理(5):page初始化( 2008-7-25 )