驱动之路-内核链表的使用

 一、重要知识点

1.内核链表和普通链表的区别

内核链表是一个双向链表,但是与普通的双向链表又有所区别。内核链表中的链表元素不与特定类型相关,具有通用性。

我们先来看一幅图

 驱动之路_内核链表的使用_设计制作_处理器/DSP

kernel list展示的是内核链表的结构,normallist展示的是普通链表的结构。head是链表头,p1,p2,p3是链表节点。从图中可以看出普通链表的p1的next指针是指向的结构体p2的地址,p2的pre指针指向p1结构体的地址。而内核链表的p1的next指向的是p2结构体中包含pre和next部分的地址,的p2的pre指向的是p1结构体中包含pre和next部分的地址。依此类推,这就是区别。内核结构元素不与特定类型结构相关,任何结构体都可通过内核的添加成为链表中的节点。

2.内核链表的具体操作

链表数据结构的定义

structlist_head

{

struct list_head *next, *prev;
}

初始化链表头

INIT_LIST_HEAD(list_head*head)

插入节点

list_add(structlist_head *new, struct list_head *head)

list_add_t     ai   l(structlist_head *new, sturct list_head *head)

第一个函数在head后面插入一个节点

第二个函数在链表尾部插入一个节点

删除节点:

list_del(structlist_head *entry)

提取数据结构:

list_entry(ptr,type, member)

ptr为已知节点指针ptr,type为节点结构体类型,member为节点指针的type结构体中的名字。返回type结构体的指针。

遍历:

list for each(structlist_head *ops, struct list_head *head)

从head开始遍历每个节点,节点指针保存在ops里面。

二、实例

#include

#include

#include

#include

#include

MODULE_LICENSE("GPL");

MODULE_AUTHOR("David Xie");

MODULE_DESCRIP     TI   ON("ListModule");

MODULE_ALIAS("List module");

struct student

{

char name[100];

int num;

struct list_head list;

};

struct student *pstudent;

struct student *tmp_student;

struct list_head student_list;

struct list_head *pos;

int mylist_init()

{

in  TI = 0;

INIT_LIST_HEAD(&student_list);

pstudent= kmalloc(sizeof(struct student)*5,GFP_KERNEL);

memset(pstudent,0,sizeof(structstudent)*5);

for(i=0;i<5;i++)

{

sprintf(pstudent[i].name,"Student%d",i+1);

pstudent[i].num= i+1;

list_add(&(pstudent[i].list), &student_list);

}

list_for_each(pos,&student_list)

{

tmp_student= list_entry(pos,struct student,list);

printk("<0>student%d name: %s\n",tmp_student->num,tmp_student->name);

}

return0;

}

void mylist_exit()

{

in  TI ;

for(i=0;i<5;i++)

{

list_del(&(pstudent[i].list));

}

kfree(pstudent);

}

module_init(mylist_init);

module_exit(mylist_exit);



3
4
0
96

相关资讯

  1. 1、《维和防暴队》官宣晒照,5位流量明星加盟,王一博仅是二番2502
  2. 2、合作孙俪二搭颖儿,就连刘涛都心生敬佩,这位女演员藏不住了3610
  3. 3、17岁因《家有儿女》走红,曾十年无戏可拍,后逆袭成收视女王4726
  4. 4、《冰封侠》杀青甄子丹乐当黄圣依“理想男友”1184
  5. 5、《延禧攻略》傅恒尔晴大婚后,看到魏璎珞大雪中三步一叩首1961
  6. 6、71岁汪明荃出席侄子婚礼,着装成焦点,与罗家英合影像拍结婚照1751
  7. 7、藏了6年梅婷老公身份曝光,背景实力不容小觑,网友:天生是一家4307
  8. 8、扎心!《姐姐》看片,陈思诚调侃想把张子枫初吻留给《唐探》刘昊然,评论翻车582
  9. 9、还记得《天仙配》中的张巧嘴吗?13年后,没想到还是一张少女脸!968
  10. 10、广告太硬,《唐探3》被吐槽上热搜719
全部评论(0)
我也有话说
0
收藏
点赞
顶部