uclinux中, 有内存碎片(memory fragment),还是少用busybox

本文探讨了在无MMU的uCLinux系统中BusyBox的内存管理问题,特别是其在内存分配上的挑战及解决方案。文章详细分析了BusyBox运行时的内存占用情况,并提供了减少内存碎片和优化内存使用的策略。
转载时请注明出处和作者联系方式:http://blog.csdn.net/mimepp
作者联系方式:YU TAO <yut616 at sohu dot com>

近来在产品开发中,为了使产品性能更稳定,需要做一些优化,其中涉及到的一个比较大的不稳定因素就是busybox的滥用.
在uclinux的系统中, 由于没有MMU,没有VM,导致不能动态得分配stack,heap.
程序中的malloc/free是基于uclinux kernel的一个大的memory pool,相当于所有的进程都共享一个heap.
这里就有一个问题, 当系统运行一段时间以后,memory可能被打成碎片,导致想再分配一个连续的大块内存会失败, 但空闲的实际内存的总和还是很大.
在busybox运行时, 如在应用程序中经常去调用cp等命令时,每次调用就会将大约280K的内存占用,释放后成为碎片,很快在代码其它地方再malloc时,就会出现out-of-memory了.

root@desktop# ls -l ./bin/busybox
-rwxr-xr-1 root root 140848 Aug 22 20:16 ./bin/busybox

root@desktop# arm
-elf-flthdr ./bin/busybox
bin
/busybox
    Magic:        bFLT
    Rev:          
4
    Build Date:   Wed Aug 
22 20:13:31 2007
    Entry:        
0x50
    Data Start:   
0x37760
    Data End:     
0x3eaa0
    BSS End:      
0x44e10
    Stack Size:   
0x8000
    Reloc Start:  
0x3eaa0
    Reloc Count:  
0xedd
    Flags:        
0x5 ( Load-to-Ram Gzip-Compressed )
编译生成的目标文件一般包含几个段:
.text,或者code, 是正文段,包含指令代码, 只 读的代码区
.data,是数据段,包含固定的数据,如常量,字符串等,可读可写的数据区
.bss,是未初始化数据段,包括未初始化的变量和数组.是可读可写且没有初始化的数据区

从上面的内容可以看出:
data的大小为29504
stack栈的大小为32K
BSS为282128.
BSS是Block Started by Symbol的缩写, 即由符号启始的区块.
BSS的值只是一个标记值, 它并非真的在程序中放入这一整块预留空间,而是先用这个数目表示,在加载时才真的把所需的预留空间定出来。
reloc为3805: relocation重定位, 是重定位使用的中间数据.

从BSS,我们可以大体知道busybox运行起来后需要的内存空间大小大约为280K, 这个大小对一个嵌入系统来说是比较大的了. 如果剩余10M内存的话, busybox调用十多次可能就会导致其它应用无法malloc内存了.

如何避免:
1. 将程序常驻内存中, 不要反复起动
2. 写成API方式, 将经常用到的一些命令, 做到应用程序里, 如copy,可以在自己的代码中实现部分功能, 当然这个应用应该是一直在内存中,不应该反复起动的.
3. 在系统起动过程中, 可以调用一些外部命令, 这个影响是比较有限的,但在后面的一般运行中,尽量避免反复起动其它应用,如busybox.

下面是转的网上的有关一些内容:
目标文件的段:Text(或者Code),Data和BSS区。Text(或者Code)区是只 读的代码区。Data区是可读可写的数据区,举例来说,你在程序定义了一个变量并给它赋值5,那么这个“5”就被存储在Data区。而BSS区则是可读可 写且没有初始化的数据区。它存储着未赋任何值的数组。注意,BSS区是一个虚拟的区域它不存在于二进制映像中,但当二进制映像被加载后,它就存在于内存中 了。

stack是系统自动分配的,主要是给函数参数,局部变量使用
heap是程序员
malloc来分配的,在堆的头部有一个字节指示要分配的堆的大小.放时会用到.
stack栈是从高到低的, 而且大小是固定的,是在系统编译时指定的一个参数.所以能从stack中获得的空间是较小的.
heap堆是从低到高的, 而且可以是不连续的,由一个链表来管理空闲的内存地址, heap的大小是受限于系统的内存大小的, 这样的话heap可以获得的空间就比较大, 比较灵活了.
网上的一个经典例子:
http://my.opera.com/javen/blog/show.dml/265058

int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 
= (char *)malloc(10);
p2 
= (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, 
"123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}


 
Light Gui的新特性。 1图层和绘图: 支持多图层,使用与有多图层支持的处理器平台。 支持多图层的软件模拟,支持图层的alpha合并和滑动。 同时支持多种颜色格式的图层,如ragb8888模式、rgb565模式、256色调色板模式。 对每个图层,支持双缓存(double buffer)模式,内部进行了窗口剪切优化。 也支持直画(direct draw)模式,支持内存设备,两者可以配合使用。 支持图层和窗口之前的映射,支持一组窗口动态切换显示到不同大小、不同颜色格式的图层。 支持窗口旋转90度、180度、270度,无需硬件支持。 2风格支持: 支持css风格配置,代码中设置控件的类名,就可以和css配置配合使用。 支持css配置控件不同状态的背景属性,如图片、填充色;前景属性,如图片、颜色;字体属性,如大小、颜色;边框属性,如宽度、颜色、调色板位图、补白等。 支持css配置窗口的一些基本属性,如宽,透明等。 支持皮肤特性,皮肤的属性包括图标、css配置和调色板位图。 支持多种皮肤,支持在线切换皮肤。 3window模拟器支持: 支持完整的window模拟器,使用visual studio 2005,可以独立于设备,在window环境编写界面代码。 全部由C代码编写,自带基本的C函数库,数学函数库,可以在window,嵌入式设备间无缝移植。 模拟器带来良好的调试特性,界面的相关bug,可以方便的在模拟器上调试,极大的加快软件的开发进度。 支持内存调试模式,可以方便的追踪内存越界,泄漏等问题。 4xml支持: 自带xml解释器,配置文件都使用xml编写,有很好的可读性。 实现了基于xml配置文件的多国语言支持,支持在线切换语言。 5简明易用的控件: 自带多种基本的控件,包括静态文本框、按钮、单行和多行编辑框、列表框、进度条、滚动条、图片、等等。 支持自定义控件,控件代码清晰、简明、容易编写。支持组合控件、对话框控件。配合皮肤配置,能快速实现美工效果和风格。 支持一些较复杂的控件,如文本控件、html显示、软件盘等 6良好的应用移植性 自带基本的C函数库,数学函数库等,可以方便的移植程序库和应用程序。 Light Gui的弱点: 实时性能不是Light GUI强项,不建议使用在实时性要就很的环境。 在使用风格属性的情况下需要有系统盘的支持,用于存放配置文件和资源。 Light Gui目前是一个图形开发包,没有跨任务的窗口管理系统。 目前只有ucos(增强型,支持系统盘),linux,window平台的移植版本。 Light Gui使用的场合: 需要使用图形库快速实现自有风格的嵌入式设备,比如消费电子设备的二次开发,UI设计。 需要使用Light Gui特性的window程序设计。 Light Gui的商业模式: Light Gui是商业收费软件。 提供软件定制服务。 提供自主设计所需的源代码和库。 Light Gui 的其他特性 Light Gui 主要针对嵌入式操作系统,如嵌入式linux, uC/OS-II 等提供支持。在这些 OS 上,Light Gui 支持以多线程模式运行。其主要技术特性描述如下。 1) 硬件适配性: 可支持各种 32 位处理器架构,如 ARM、MIPS、PowerPC、Blackfin等。 支持各种灰度,彩色显示设备。 可支持各种输入设备,键盘(Keypad)、触摸屏、遥控器等等。 2) 资源消耗: Light GUI 的静态存储随配置选项的不同而不同,最少需占用 800K 静态存储空间。 Light GUI 启动后,初始占用动态存储空间最小为128k。建议系统内存为 2MB 以上。 3) 操作系统适配性: 目前支持uC/OS-II 等操作系统,也可以运行在 Linux/uClinux 操作系统之上,Light GUI自带基础的c函数库,可以方便的移植到支持frambuffer的设备上。 针对嵌入式系统的特殊支持,包括一般性的 I/O 流操作,字节序相关函数等。 4) 窗口子系统特性: 完备的任务内窗口机制和消息传递机制。 5) 图形子系统特性: 提供有增强 GDI 函数,包括光栅操作、复杂区域处理、椭圆、圆弧、多边形以及区域填充等函数。 在提供有兼容于 C99 规范的数学库平台上,还提供有级二维绘图函数。 通过 Light GUI 的图形抽象层及图形引擎技术,我们也可以让上述级 GDI 接口在低端显示屏上实现。 各种流行图像文件的支持,包括 Windows BMP、GIF、JPEG、PNG 等(JPEG
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值