驅動中使用內核鏈表

前面我們詳細介紹瞭如何實現內核鏈表,實際上內核中已經爲我們實現了內核鏈表,給我提供了一些操作內核鏈表的API,接下來我們將在驅動模塊中使用內核鏈表。
這裏寫圖片描述
首先我們瞭解幾個常用的API:
這裏寫圖片描述
這裏寫圖片描述

以下是代碼實例(由於前面已經對內核鏈表做了詳解,在此不再贅述):

#include <linux/init.h>
#include <linux/module.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/slab.h>
#define N 32
struct student{  //學生信息結構體
    char name[N];
    int id;
    float score;
    struct list_head list;  //內核鏈表字段
};
struct student *stup;
struct student *tmp_stup;
struct list_head stu_list;
struct list_head *pos;

static __init int hello_init(void)//模塊加載入口
{   

    int i,ret;
    printk("%s:%d   pid=%d\n",__func__,__LINE__,current->pid);//打印函數信息用於調試

    //初始化內核鏈表  學生表
    INIT_LIST_HEAD(&stu_list);

    //爲學生信息結構體分配空間
    stup=kmalloc(sizeof(struct student)*5,GFP_KERNEL);
    if(IS_ERR(stup)){ //判斷是否爲NULL
        printk("fail to kmalloc");
        ret=PTR_ERR(stup); //得到錯誤信息返回
        goto ERR1;
    };
    memset(stup,0,sizeof(struct student)*5);//清空結構體
    for(i=0;i<5;i++){ //賦值 並插入鏈表
        sprintf(stup[i].name,"stuent%d",i);
        stup[i].id=i;
        //stup[i].score=i*10;
        //list_add(&(stup[i].list),&stu_list);
        list_add_tail(&(stup[i].list),&stu_list);
    };  

    list_for_each(pos,&stu_list){ //遍歷學生信息
        tmp_stup=list_entry(pos,struct student,list);//鏈接因子得到對象

        printk("id=%d   name=%s \n",tmp_stup->id,tmp_stup->name);
    };
    return 0;
ERR1:
    return ret;

}

static __exit void hello_exit(void)//模塊卸載入口
{       int i;
        printk("%s:%d   pid=%d\n",__func__,__LINE__,current->pid);

        for(i=0;i<5;i++){
            list_del(&(stup[i].list)); //刪除節點
        };
        kfree(stup);//釋放分配的學生結構體空間

}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章