ecos内存分布
简介
站在内存管理的角度看eCos操作系统,就是一个进程。eCos系统中只有线程概念(任务),并没有进程概念。整个内存规划简单看就是一个进程的内存分布。
既然一个进程,内存中会有text、data、bss、heap段等。
eCos查看内存
1 | mbuf |
乍一看,mbuf打印信息很多,系统到底剩余多少内存呢?我第一次看就是一头雾水,并不像linux那么直观.
1 | $ free |
拆解mbuf命令
- 系统内存总共32M,先看Memory system
1 | Memory system: |
Total 为总内存:
33554432/1024/1024
32.0
Heap为应用线程使用的内存。533024 bytes.
这里的Heap内存为上图中的heap区域。
- pool内存
1 | Misc mpool: total 7602176, free 1797136, max free block 1794852 |
- Misc mpool为驱动kmalloc提供内存分配(没有slab机制,后期内存碎片化较严重)
- Mbufs pool是一个真正意义上的内存池(固定长度内存),为网络协议栈mbuf m_mballoc提供内存。
- Clust pool是另一个内存池,为网络协议栈mbuf m_clalloc提供内存。
Misc mpool、Mbufs pool、Clust pool这三块内存是eCos定义的三个大buff,然后自己玩的。这点可以从bss段大小可以说明,这三个buf占了总内存的72%。
(7602176+1834752+14801600)/1024/1024
23.11566162109375
- bss段
通过readelf -sa ecos.elf | grep __bss
命令,查看bss段。
1 | 12329: 8063d5a0 0 NOTYPE GLOBAL DEFAULT 7 __bss_start |
可以看到bss段有25M以上。
1 | >>> int('81f80000',16) - int('8063d5a0',16) = 26487392 |
这里也可以说明eCos的内存管理方式很暴力,在程序中开一个buff,然后自己来玩这块buff。
eCos提供两种内存机制
- 固定大小内存
固定大小内存分配其实就时内存中,在ecos中使用cyg_mempool_fix_create
创建,使用cyg_mempool_fix_alloc
和cyg_mempool_fix_try_alloc
申请。
- 不固定大小内存
不固定大小内存系统启动前期可以最大限度使用内存,但是随着系统运行会产生内存碎片。ecos中使用cyg_mempool_var_create
创建,cyg_mempool_var_alloc
和cyg_mempool_var_try_alloc
申请内存。
eCos中的函数接口
1 | ./ecos-3.0/packages/net/bsd_tcpip/v3_0/src/ecos/support.c |
- cyg_net_malloc
驱动中kmalloc的内存申请,
- cyg_net_mbuf_alloc
1 | // ./ecos-3.0/packages/net/bsd_tcpip/v3_0/src/sys/kern/uipc_mbuf.c |
- cyg_net_cluster_alloc
1 | // ./ecos-3.0/packages/net/bsd_tcpip/v3_0/src/sys/kern/uipc_mbuf.c |
总结
eCos再我所在的公司目前用在家用路由器产品中,可以看到内存基本都是在服务协议栈mbuf这块。而供给驱动(kmalloc)内存较少,而且目前内存模块老旧,不支持slab等先进内存分配机制。顾随着系统运行时间增加,kmalloc部分内存碎片化验证,在设备高负载情况下,后期驱动很难分配出大块内存。