之前说过,VSF都是模块化的设计,这里就先介绍一下VSF中的基础模块。其中,有一些模块会在以后详细说明,比如流模块。基础模块位于vsf/component/fundation目录下,提供一些不依赖构架的基础模块和基础工具。当然,还有一些其他不依赖构架的模块和工具,比如位于crypto目录下的各种加解密算法模块等。基础模块中,大部分都比较简单,可以自行看代码研究。
- bittool:常用位操作相关的工具,包括位反序、字节反序、大小端的数据读写、mskarr
- buffer:各种内存结构模块,包括vsfq(权重队列)、fifo、multibuf(多缓冲管理)、bufmgr(动态内存分配)、vsfpool(动态池分配)
- list:列表模块,模仿Linux中的列表的实现方式
- stream:流模块,这个以后会专门章节着重介绍
bittool里,主要介绍一下mskarr,代码如下:
void mskarr_set(uint32_t *arr, int bit)
{
arr[bit >> 5] |= (1 << (bit & 0x1F));
}
void mskarr_clr(uint32_t *arr, int bit)
{
arr[bit >> 5] &= ~(1 << (bit & 0x1F));
}
int mskarr_ffz(uint32_t *arr, int arrlen)
{
int i, tmp;
for (i = 0; i < arrlen; i++)
{
tmp = ffz(arr[i]);
if (tmp >= 0)
{
return (i << 5) + tmp;
}
}
return -1;
}
mskarr需要一个uin32_t的数组,可以set和clear指定位,并且可以通过ffz来找到第一个0位。一个典型的应用,就是用于vsfpool池分配,用来标记内存池中的元素的分配情况。makarr的一位对应内存池里的一个元素。在USB主机协议栈用,也有一个mskarr,用来记录已经分配的设备地址,新设备连接后,通过ffz来寻找第一个可分配的地址。
buffer里,简单介绍以下几个模块:
- vsfq,带权重的队列。典型应用是定时器模块,定时器的超时时间作为权重,有新的定时器要入列的话,根据权重,自动把最先触发的放在队列最前面。另一个典型应用是tcpip里的tcp收发队列,tcp报文里的sequence作为权重,报文入列时,自动根据sequence排序,使得窗口操作非常方便。
- multibuf,多缓冲管理。一般需要用到多缓冲的地方,都会用到这个模块,甚至流模块里,还有一个multibuf实现的流。典型应用是USB的MSC设置里,使用多缓冲,可以实现USB接口和块设备接口同时读写数据(通过multibuf实现的流)。另外一个例子就是framebuffer驱动,产生的视频帧用类似fifo的方式写入到multibuf,屏幕块设备接口则是从multibuf里读取最早的视频帧数据,并且显示在屏幕上。
- bufmgr,动态内存分配。实测bufmgr的代码量小于C语言的malloc。并且,bufmgr支持指定对齐的分配方式,比如OHCI模块里,一些内存有对齐的要求。另外,bugmgr还支持内存guard,可以用于检测内存溢出。
- vsfpool,动态池分配。vsfpool使用mskarr来标记各个内存块的分配情况。并且,以宏模板的形式,方便的实现特定结构的内存池。