专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
DSP
在gcc下模拟bfin-uclinux的内存管理(1):基本思想
2019-07-13 16:57
发布
生成海报
站内文章
/
DSP
14629
0
1774
快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
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)
Ta的文章
更多
>>
在gcc下模拟bfin-uclinux的内存管理(1):基本思想
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮