提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
linux内核中大量使用了链表数据结构来存储各种数据,比如device和driver使用klist存储,下面是list和klist使用示例
提示:以下是本篇文章正文内容,下面案例可供参考
一、list和klist是什么?
list:
list_head:双向链表,不带头节点,适用于需要按顺序存储和访问数据的场景。
klist:
klist: Linux 内核中用于管理和操作内核对象列表的数据结构。可以理解为一种带有引用计数的链表,主要用于跟踪和管理一组相关的对象
内核接口:
list_head:api:include\linux\list.h 中
LIST_HEAD_INIT \宏初始化
LIST_HEAD \宏初始化
INIT_LIST_HEAD \初始化
list_add \添加到头节点后面,头部添加
list_add_tail \添加到头节点前面,尾部添加
list_del \删除list中元素
list_replace 替换旧元素为新的元素
list_for_each
list_for_each_safe
RCU版:
INIT_LIST_HEAD_RCU
list_add_rcu
list_add_tail_rcu
list_del_rcu
list_for_each_entry_rcu
list_for_each_entry_srcu
klist:api:include\linux\klist.h 中
DEFINE_KLIST
klist_init
klist_add_tail
klist_add_head
klist_add_behind
klist_add_before
klist_del
klist_remove
klist_node_attached
二、代码示例
1.list
代码如下(示例):
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ChatGPT");
MODULE_DESCRIPTION("A Simple List Head Example");
struct my_data {
int value;
struct list_head list; // 使用 list_head 实现链表
};
static LIST_HEAD(my_list); // 创建链表头
// 初始化链表并添加元素
static void init_list(void) {
struct my_data *data;
int i = 0;
for (i = 0; i < 5; i++) {
data = kmalloc(sizeof(struct my_data), GFP_KERNEL);
data->value = i;
//INIT_LIST_HEAD(&data->list); // 初始化链表节点