linux内核之门之kfifo源码分析(2)

本文详细分析了Linux内核中的kfifo数据结构,包括其内存分配、初始化、重置、释放等核心函数,如kfifo_alloc、kfifo_init、kfifo_reset及kfifo_free。此外,还探讨了kfifo_in、kfifo_out等数据入队和出队的操作,以及如何检查kfifo的空闲空间和状态。通过对kfifo的深入理解,有助于提升Linux内核级别的数据处理能力。
摘要由CSDN通过智能技术生成
kfifo的源代码主要是<linux/kfifo.h>和<kernel/kfifo.c>文件

kfifo结构定义:
struct kfifo {
        unsigned char *buffer;/*保存数据的缓冲空间*/
        unsigend int size;/*分配的空间大小*/
        unsigned int in;/*入队数据的offset(in % size)*/
        unsigned int out;/*出队数据的offset(out %size)*/
};

kfifo_alloc函数:
/**
 * kfifo_alloc - 分配一个内部的buffer
 * @fifo;赋予新buffer的fifo
 * @size: 分配buffer的大小,必须是2的幂
 * @gfp_mask: get_free_pages掩码,传递给kmalloc()
 *
 * 这个函数动态地分配一个新的内部buffer.
 *
 * size会四舍五入为2的幂.
 * buffer由kfifo_free()来释放.
 * 返回值:成功则为0,否则返error code.
 */
int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask)
{
        unsigned char *buffer;

        /*将size向上舍入为最近2的幂*/
        if (!is_power_of_2(size)) {
                BUG_ON(size > 0x80000000);
                size = roundup_pws_of_two(size);
        }

        buffer = kmalloc(size, gfp_mask);
        if (!buffer) {/*分配失败*/
                _kfifo_init(fifo, NULL, 0);
                return -ENOMEM;
        }

        _kfifo_init(fifo, buffer, size);/*初始化fifo成员*/

        return 0;
}

_kfifo_init函数:
/*
 * _kfifo_init - 初始化fifo结构体成员
 */
static void _kfifo_init(struct kfifo *fifo, void *buffer,
                unsigned int size)
{
        fifo->buffer = buffer;
        fifo->size = size;

        kfifo_reset(fifo);/*重置fifo的in和out为0*/
}

kfifo_reset函数:
/**
 * kfifo_reset - 移除FIFO所有的内容
 * @fifo:将被清空的fifo
 */
static inline void kfifo_reset(struct kfifo *fifo)
{
        fifo->in = fifo->out = 0;
}

kfifo_free函数:
/*
 * kfifo_free - 释放FIFO内部的buffer
 * @fifo: 被释放的fifo
 */
void kfifo_free(struct kfifo *fifo)
{
        kfree(fifo->buffer);
        __kfifo_init(fifo, NULL, 0);
}

kfifo_init函数:
/*
 * kfifo_init - 用一个已分配的buffer来初始化FIFO
 *
 * @fifo: 赋予buffer的fifo
 * 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值