#include<linux/init.h>
#include<linux/slab.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/list.h>
struct student
{
int id;
char *name;
struct list_head list;
};
static void testlist_exit(void)
{
printk("*************************\n");
printk("testlist is exited!\n");
printk("*************************\n");
}
void print_student(struct student *stu)
{
printk("======================\n");
printk("id =%d\n", stu->id);
printk("name=%s\n", stu->name);
printk("======================\n");
}
static int testlist_init(void)
{
struct student *stu1, *stu2, *stu3, *stu4;
struct student *stu;
// init a list head
LIST_HEAD(stu_head);
// init four list nodes
stu1 = kmalloc(sizeof(*stu1), GFP_KERNEL);
stu1->id = 1;
stu1->name = "st1";
INIT_LIST_HEAD(&stu1->list);
stu2 = kmalloc(sizeof(*stu2), GFP_KERNEL);
stu2->id = 2;
stu2->name = "st2";
INIT_LIST_HEAD(&stu2->list);
stu3 = kmalloc(sizeof(*stu3), GFP_KERNEL);
stu3->id = 3;
stu3->name = "st3";
INIT_LIST_HEAD(&stu3->list);
stu4 = kmalloc(sizeof(*stu4), GFP_KERNEL);
stu4->id = 4;
stu4->name = "st4";
INIT_LIST_HEAD(&stu4->list);
list_add(&stu1->list, &stu_head);
list_add(&stu2->list, &stu_head);
list_add(&stu3->list, &stu_head);
list_add(&stu4->list, &stu_head);
// print each student from 4 to 1:[4,3,2,1]
list_for_each_entry(stu, &stu_head, list)
{
print_student(stu);
}
// print each student from 1 to 4:[1,2,3,4]
list_for_each_entry_reverse(stu, &stu_head, list)
{
print_student(stu);
}
// delete a entry stu2
list_del(&stu2->list);
// print each student from 4 to 1:[4,3,1]
list_for_each_entry(stu, &stu_head, list)
{
print_student(stu);
}
// replace stu3 with stu2
list_replace(&stu3->list, &stu2->list);
// print each student from 4 to 1:[4,2,1]
list_for_each_entry(stu, &stu_head, list)
{
print_student(stu);
}
return 0;
}
module_init(testlist_init);
module_exit(testlist_exit);
MODULE_LICENSE("GPL");
obj-m +=test_list.o
KDIR :=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)
modules:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
list_head原理参考: