面试被问到网卡RingBuffer数据结构,瞎猜猜错了,学习一下
本博客针对Linux5.7
Linux源码解压后可在源码目录下Documentation/trace/ring-buffer-design.txt中找到设计
内核中kfifo和ring_buffer都是环形缓冲区
kfifo位于linux-5.7/include/linux/kfifo.h中
ring_buffer位于linux-5.7/include/linux/ring_buffer.h中
struct __kfifo {
unsigned int in;
unsigned int out;
unsigned int mask;
unsigned int esize;
void *data;
};
ring_buffer实际使用trace_buffer结构体,定义如下
struct trace_buffer {
unsigned flags;
int cpus;
atomic_t record_disabled;
cpumask_var_t cpumask;
struct lock_class_key *reader_lock_key;
struct mutex mutex;
struct ring_buffer_per_cpu **buffers;
struct hlist_node node;
u64 (*clock)(void);
struct rb_irq_work irq_work;
bool time_stamp_abs;
};
文章探讨了在Linux5.7版本的源码中RingBuffer和kfifo两种环形缓冲区的数据结构。RingBuffer在实际应用中表现为trace_buffer结构,包含多个关键组件如mutex锁和irq_work。kfifo则由in、out、mask等字段组成,用于数据存储。文章旨在帮助读者了解这两种无锁环形缓冲区的设计和实现。

1618

被折叠的 条评论
为什么被折叠?



