这节给出一个内核态的使用双链表的例子,在我们写内核态helloworld的时候就说过,它是我们编写内核模块的模板,这里你可以再加深一下这个概念的理解。用的都是以上边介绍过的一些函数,嘿嘿,看起来也并不是很难的样子。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
#define N 10
struct my_list {
int num;
struct list_head list;
};
struct my_list nodehead;
static int list_init(void)
{
struct my_list *listnode = 0;
struct list_head *pos = 0;
struct my_list *p = 0;
int i;
//初始化头节点
printk("double list is starting...\n");
INIT_LIST_HEAD(&nodehead.list);
//建立N个节点,依次加入到链表当中
for (i = 0; i != N; ++i) {
listnode = (struct my_list *)kmalloc(sizeof(struct my_list), GFP_KERNEL);
listnode->num = i + 1;
list_add_tail(&listnode->list, &nodehead.list);
printk("Node %d has added to the double list...\n", i + 1);
}
i = 1;
list_for_each(pos, &nodehead.list) {
p = list_entry(pos, struct my_list, list);
printk("Node %d's data : %d\n", i, p->num);
}
return 0;
}
static void list_exit(void)
{
struct list_head *pos, *n;
struct my_list *p;
int i;
i = 1;
list_for_each_safe(pos, n, &nodehead.list) {
list_del(pos);
p = list_entry(pos, struct my_list, list);
kfree(p);
printk("Node %d has removed from the double list...\n", i++);
}
printk("double list is exiting...\n");
}
module_init(list_init);
module_exit(list_exit);
Makefile文件跟helloworld里边的基本一样,这里不再赘述。
本文提供了一个内核态下使用双链表的示例代码,通过定义结构体和利用内核提供的函数实现链表的创建、遍历与删除。此示例有助于理解内核模块中链表的操作。
&spm=1001.2101.3001.5002&articleId=8898432&d=1&t=3&u=842a927c0be24223a174a2e733bcc4f5)
1959

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



