Linux内核通用队列的使用笔记(读linux内核设计与实现)

Posted Engineer-Bruce_Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核通用队列的使用笔记(读linux内核设计与实现)相关的知识,希望对你有一定的参考价值。

Linux内核通用队列实现 Kfifo
位置:kernel/kififo.c

使用需要包含头文件#include <kernel/kififo>

1、创建队列(动态创建)
int kfifo_alloc(struct kififo *fifo , unsigned int size , gfp_t gfp_mask);
该函数会创建并初始化一个大小为size的fifo,内核使用gfp_mask标识分配队列。
成功返回0
ep : 
struct kfifo fifo ; 
int ret ; 
//创建一个大小为PAGE_SIZE的队列,由内核进行内存分配
ret = kfifo_allo(&kifo , PAGE_SIZE , GFP_KERNEL);
if(ret)
return ret ;
自己分配缓冲,可以调用:
void kfifo_init(struct kfifo *kfifo ,void *buffer , unsigned int size);
创建并初始化一个kfifo对象,它将使由buffer指向的size字节大小的内存
对于以上两个函数,size必须是2的幂。
静态声明:
DECLARE_KFIFO(name , size);
INIT_KFIFO(name);
2、堆入队列数据
unsigned int kfifo_in(struct kfifo *fifo , const void *from , unsigned int len);
该函数将from指针所指的len字节的数据拷贝到fifo所指向的队列中,成功返回数据字节大小。
3、摘取队列数据
unsigned int kfifo_out_peek(struct kfifo *fifo , void *to  , unsigned int len , unsigned offset);;
与kfifo_out类似,如果offset为0,则读队列头,参数offset指向队列中的索引位置。
4、获取队列长度
//返回存储kfifo队列的空间的总体大小
static inline unsigned int kififo_size(struct kfifo *fifo);
//返回队列中已堆入数据的大小
static inline unsigned int kfifo_len(struct kfifo *fifo);
//想得到kfifo队列中还有多少可用空间
static inline unsigned int kfifo_avail(struct kififo *fifo);
//判断队列是否为空,返回非0值,返回0则相反
static inline int kfifo_is_empty(struct kfifo *fifo);
//判断队列是否为满,返回非0值,返回0则相反
static inline int kfifo_is_full(struct kfifo *fifo);
5、重置和撤销队列
//抛弃所有队列中的内容,调用kfifo_reset();
static inline void kfifo_reset(struct kfifo *fifo);
//撤销一个还是用kfifo_alloc()分配的队列,调用kfifo_free();


使用举例:

unsigned int i ;
	//将0,31压如名为fifo的kfifo中
	for(i = 0 ; i < 32 ; i++)
		kfifo_in(fifo , &i , sizeof(i));
	unsigned int val ; 
	int ret ; 
	ret = kfifo_out_peek(fifo , &val , sizeof(val) , 0);
	if(ret != sizeof(val))
		return -EINVAL ; 
	printk(KERN_INFO"%u\n",val);//应该输出0
	//摘取并打印kfifo中的所有元素,可以调用kfifo_out(); 
	//当队列中还有数据时,按顺序从0到31打印出来
	while(kfifo_avail(fifo)){
		unsigned  int ret ; 
		int ret ; 
		ret = kfifo_out(fifo,&val , sizeof(val));
		if(ret != sizeof(val))
			return -EINVAL ; 
		printk(KERN_INFO"%u\n",val);
	}


以上是关于Linux内核通用队列的使用笔记(读linux内核设计与实现)的主要内容,如果未能解决你的问题,请参考以下文章

linux内核分析笔记----上半部与下半部(下)

Linux 内核 tasklet 机制和工作队列zz

linux内核无锁缓冲队列kfifo原理

《Linux内核设计与实现》读书笔记- 内核数据结构

《Linux内核设计与实现》学习笔记——I/O调度算法

《Linux内核设计与实现》Chapter 3 读书笔记