一种嵌入式系统的内存分配方案
这种方案必然涉及到一个缓冲池的结构。一般缓冲池的结构由以下几部分组成:单元尺寸、块尺寸(或者单元数目)、缓冲池指针、空闲链表、用于统计和调试的参数等。对缓冲池的操作包括创建缓冲池、释放缓冲池、从缓冲池中分配1个内存单元、释放内存单元回缓冲池等。下面举2个例子说明一下该方案的具体使用情况。
4.1 Intel交换机驱动程序中内存分配
在以Intel的交换芯片为基础的交换机方案中,因为采用的是软件地址学习的方式,需要在内存中维护许多数据,如MAC地址表的软拷贝、VLAN表、静态单播地址表、组播地址表等。这些表都是由一些树组成,每个树由一些固定尺寸的节点组成。一般每个节点几十个字节,每棵树的节点数是可增长的,少则几十,最多可到16K个节点。因此,很适合于采用该方案,具体的实现如下:
(1)缓冲池结构BlockMemMgr
typedef struct{
MemSize data_cell_size; /*数据单元的尺寸*/
MemSize block_size; /*块尺寸*/
/*下面的变量为预定义的每个管理器最多包含的块数,如64
MAX_BLOCKS_OF_MEM_SIZE*/
Unsigned short blocks_being_used;/*已使用的块数*/
Void mem_ptr[PAX_BLOCKS_OF_MEM_SIZE];
/*块数组*/
SLList free_data_cells_list; /*空闲链表*/
}BlockMemMgr;
结构中的参数包括:单元尺寸、块尺寸、已用块数、所有块的地址、空闲链表(单向链表)。
(2)缓冲池的管理函数
◆block_mem_create:创建块内存管理器,参数包括内存指针(如为NULL,表示自己分配)、块尺寸、单元尺寸、返回管理器指针。
过程如下:
①检验参数合法性。
②单元尺寸4字节对齐,计算每个块中的单元数。对内存指针进行4字节对齐或者分配内存指针。
③初始化结构BlockMemMgr,包括单元尺寸和块尺寸。设置第1个内存块的指针。如果内存是外来的,设置块已用标志(已用为0),表示不能增加块;否则,已用块数设为1。
④创建空闲链表,将块内所有单元添加到链表中,最后一个单元处于链表的最前面。
⑤返回BlockMemMgr。
◆block_mem_destroy:解构一个块内存管理器,释放它所分配的所有内存,调用者负责外部内存的释放。参数为BlockMemMgr。返回成功失败标志。
①参数合法性检测。
《一种嵌入式系统的内存分配方案(第3页)》