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

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

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

         我们先来看一幅图

        

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

 

  1. #include <linux/kernel.h>  
  2. #include <linux/module.h>  
  3. #include <linux/init.h>  
  4. #include <linux/slab.h>  
  5. #include <linux/list.h>  
  6.    
  7. MODULE_LICENSE("GPL");  
  8. MODULE_AUTHOR("David Xie");  
  9. MODULE_DESCRIPTION("ListModule");  
  10. MODULE_ALIAS("List module");  
  11.    
  12. struct student  
  13. {  
  14.    char name[100];  
  15.    int num;  
  16.    struct list_head list;  
  17. };  
  18.    
  19. struct student *pstudent;  
  20. struct student *tmp_student;  
  21. struct list_head student_list;  
  22. struct list_head *pos;  
  23.    
  24. int mylist_init()  
  25. {  
  26.          inti = 0;  
  27.           
  28.          INIT_LIST_HEAD(&student_list);  
  29.           
  30.          pstudentkmalloc(sizeof(struct student)*5,GFP_KERNEL);  
  31.          memset(pstudent,0,sizeof(structstudent)*5);  
  32.           
  33.          for(i=0;i<5;i++)  
  34.          {  
  35.                 sprintf(pstudent[i].name,"Student%d",i+1);  
  36.                    pstudent[i].numi+1;  
  37.                    list_add(&(pstudent[i].list), &student_list);  
  38.          }  
  39.           
  40.           
  41.          list_for_each(pos,&student_list)  
  42.          {  
  43.                    tmp_studentlist_entry(pos,struct student,list);  
  44.                    printk("<0>student%d name: %s\n",tmp_student->num,tmp_student->name);  
  45.          }  
  46.           
  47.          return0;  
  48. }  
  49.    
  50.    
  51. void mylist_exit()  
  52. {         
  53.          inti ;  
  54.          for(i=0;i<5;i++)  
  55.          {  
  56.                    list_del(&(pstudent[i].list));      
  57.          }  
  58.           
  59.          kfree(pstudent);  
  60. }  
  61.    
  62. module_init(mylist_init);  
  63. module_exit(mylist_exit);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值