第五学 linux内核中最基本的数据组织方式——list.h分析(3)

本文提供了一个内核态下使用双链表的示例代码,通过定义结构体和利用内核提供的函数实现链表的创建、遍历与删除。此示例有助于理解内核模块中链表的操作。

        这节给出一个内核态的使用双链表的例子,在我们写内核态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里边的基本一样,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值