Linux内核模块编程_struct list_head


#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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值