ATH9K DRIVER LEARNING PART V: KFIFO

由于在 ath9k driver 中, 发送的 packet 全部都储存在 kfifo 结构体里。详细的学习 kfifo 相关的知识能帮助用户去监视各个 packet 的收发状况。在这篇文章中笔者汇总并摘选了一些好的 kfifo 学习帖子来帮助大家学习。

什么是 kfifo, 它的基础 function 有哪些

这一篇文章: link 比较基础详细地介绍了 kfifo 是如何组建起来的。其内容摘选如下:

环形缓冲区(ring buffer)在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,B每次冲缓冲区中取。这是典型的生产者和消费者模型,缓冲区中数据满足FIFO特性,因此可以采用队列进行实现。Linux内核的kfifo正好是一个环形队列,可以用来当作环形缓冲区。环形缓冲区的详细介绍及实现方法可以参考http://en.wikipedia.org/wiki/Circular_buffer,介绍的非常详细,列举了实现环形队列的几种方法。环形队列的不便之处在于如何判断队列是空还是满。

基础的 function 有:

 1 //根据给定buffer创建一个kfifo
 2 struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
 3                 gfp_t gfp_mask, spinlock_t *lock);
 4 //给定size分配buffer和kfifo
 5 struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
 6                  spinlock_t *lock);
 7 //释放kfifo空间
 8 void kfifo_free(struct kfifo *fifo)
 9 //向kfifo中添加数据
10 unsigned int kfifo_put(struct kfifo *fifo,
11                 const unsigned char *buffer, unsigned int len)
12 //从kfifo中取数据
13 unsigned int kfifo_put(struct kfifo *fifo,
14                 const unsigned char *buffer, unsigned int len)
15 //获取kfifo中有数据的buffer大小
16 unsigned int kfifo_len(struct kfifo *fifo)

原帖子里面对这些 function 的介绍十分详细,这里就不再赘述了。接下来再介绍一个 structure: __kfifo。

奇特的 __kfifo 结构体

实话实说,笔者目前对 __kfifo 结构体的理解还不深刻。目前认为 __kfifo 结构体是比 kfifo 结构体晚一些出现的。基于 __kfifo 结构体中提供的信息,版本更新一些的 kernel 可以做出更多的 functions。

对 __kfifo 和其 functions 的基本介绍可以参考该链接: link。 基于 __kfifo,kernel 也同样可以做出 initial, put, get 这些 functions。感觉和 kfifo_initial 等 functions 重复了。。。确实需要再多学一些让理解更深刻。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值