VxWorks中mBlk三元组的实现

本文详细介绍了VxWorks中mBlk三元组的实现,包括函数表poolFunc、mBlk内存分配、netPool初始化、资源的申请与释放。通过对相关代码的分析,阐述了mBlk、ClBlk和Cluster如何管理和使用内存,以及如何通过netTupleGet()申请和释放三元组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上文中,对mBlk三元组的原理进行了简单的介绍。下面将简单介绍三元组的实现,对其部分代码进行分析。

mBlk是用C语言实现的,因此其中包含了大量复杂的指针操作和函数指针。

1、函数表poolFunc

poolFunc是一个结构体,其中定义了多个函数指针,用来操作存储池,包括初始化netPool,申请和归还mBlk、ClBlk和Cluster等。

系统定义的默认函数表如下:

LOCAL POOL_FUNC dfltFuncTbl =		/* default pool function table */
    {
    _poolInit,
    _mBlkFree,
    _clBlkFree,
    _clFree,
    _mBlkClFree,
    _mBlkGet,
    _clBlkGet,
    _clusterGet,
    _mClGet,
    _clPoolIdGet,  //由于存在多个Cluster子池,因此申请Cluster时,必须先得到其对应的Cluster池
    };

2、存储池netPool的初始化

通过函数表中的函数指针 STATUS (*pInitRtn) (NET_POOL_ID pNetPool, M_CL_CONFIG * pMclBlkConfig, CL_DESC * pClDescTbl, int clDescTblNumEnt,  BOOL fromKheap);来完成存储池的初始化。

默认情况下,函数指针指向_poolInit()函数。

LOCAL STATUS _poolInit
    (
    NET_POOL_ID		pNetPool,	/* pointer to a net pool */
    M_CL_CONFIG *	pMclBlkConfig,	/* pointer to mBlk,clBlk config */
    CL_DESC *		pClDescTbl,	/* pointer to cluster desc table */
    int			clDescTblNumEnt, /* number of cluster desc entries */
    BOOL                fromKheap       /* 1:KHEAP_ALLOC  0:malloc/calloc */
    )
_poolInit()通过传入的配置参数来完成初始化。

pMclBlkConfig结构体中存储着mBlk和ClBlk的配置信息:

typedef struct
    {
    int		mBlkNum;		/* number of mBlks */
    int		clBlkNum;		/* number of cluster Blocks */
    char * 	memArea;		/* pre allocated memory area */
    int		memSize;		/* pre allocated memory size */
    } M_CL_CONFIG;
其中保存着mBlk、ClBlk的个数,并为mBlk和ClBlk预分配了一定内存。

pClDescTbl则保存着各个Cluster池的配置信息:

typedef struct clDesc
    {
    int		clSize;			/* cluster type */
    int		clNum;			/* number of clusters */
    char *	memArea;		/* pre allocated memory area */
    int		memSize;		/* pre allocated memory size */
    } CL_DESC; 
pClDescTbl中的每一个元素都保存着对应的Cluster池的信息,包括Cluster的大小、个数,以及为当前Cluster池中所有Cluster预先分配的内存空间。
在_poolInit()函数中,则根据相应的配置信息,来将存储池中各个子池中元素链接成链表,并将相关信息存储在结构体netPool中,然后即可通过netPool来管理所有元素。

3、示例

一个简单的使用示例如下:

	M_CL_CONFIG mClBlkConfig;
	CL_DESC clDescTbl[1];  //数组大小为1,说明只分配一个Cluster池
	int  clDescTblNumEnt = 1;
	NetPoolPtr = (NET_POOL_ID)malloc(sizeof(NET_POOL));

	mClBlkConfig.mBlkNum = 2000;//2000个mBlk
	mClBlkConfig.clBlkN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值