#include <linux/list.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#define mm_malloc(size) kmalloc(size, GFP_KERNEL)
#define mm_free(ptr) kfree(ptr)
struct Word
{
int number;
struct list_head list;
};
#define WORD(name, number) \
struct Word name = {number, LIST_HEAD_INIT(name.list)}
#define WORD_INIT(name, n)\
do{\
name->number = n;\
INIT_LIST_HEAD(&name->list);\
}while(0)
static int list_init(void)
{
int i = 0;
struct Word *v;
struct list_head *t;
WORD(head, 0);
for(i = 0; i < 20; i ++)
{
struct Word *tmp = (struct Word*)mm_malloc(sizeof(struct Word));
WORD_INIT(tmp, i + 20);
list_add_tail(&tmp->list, &head.list);
}
/*遍历所有的节点*/
list_for_each(t , &head.list)
{
v = container_of(t, struct Word, list);
printk("number %d\n", v->number);
}
/*获取第一个节点*/
v = list_first_entry(&head.list, struct Word, list);
printk("The first number is %d\n", v->number);
/*遍历所有的节点,并释放内存*/
while(head.list.next != &head.list)
{
t = head.list.next;
list_del(t);
mm_free(container_of(t, struct Word, list));
}
return 0;
}
static void list_exit(void)
{
printk("List exiting...\n");
}
module_init(list_init);
module_exit(list_exit);
上面是实例的代码。是通过struct list_head 创建一个双向链表(有表头),然后通过struct Word的number域来存储数值。
Makefile文件:
obj-m += list.o
KERNEL := /usr/src/linux-headers-$(shell uname -r)
PWD := $(shell pwd)
all:
make -C $(KERNEL) M=$(PWD) modules
clean:
make -C $(KERNEL) M=$(PWD) clean
install:
sudo insmod list.ko
uninstall:
sudo rmmod list