Linux 内核中的种种(初步了解)

         前天看师父“浅墨”给的那段内核代码,看着看着就有点蒙了,不过在内核中实现循环链表的创建,插入,删除以及替换什么的确实很奇葩,我就只看懂了那么多代码中的一部分,下来就是我自己对这段代码的理解,可能有许多不足,欢迎大家提出。


       大家都知道,一般双向循环链表的实现无非就是那几步首先会创建一个结构体,然后再实现链表的插入、删除、查找,但在内核中双向循环链表的实现却很不一样,大数据的存储就是与内核中的这些链表的实现息息相关。


struct list_head
{
       struct  list_head  *prev;
       struct  list_head  *next;
}
定义了一个双向的循环链表的结构。


#define   LIST_HEAD_INIT(name)   { &(name), &(name) }        

                                         //这个宏的作用是把参数为name 的地址赋值给结构体中的头两个变量。

#define   LIST_HEAD(name)     \               (这个不太理解)

                struct   list_head   name = LIST_HEAD_INIT(name);

                                       //定义了一个链表类的变量,变量名字命名为所给的参数,然后把链表结构赋值,相当于环起来了。

                                    

struct   inline  void  INIT_LIST_HEAD( struct   list_head   *list )

{

             list->next = list;

             list->prev = list;

}                                     //给定一个双链表类型的变量,使之初始化,并把它环起来。

*************************链表中元素的添加***************************

static  inline  void  __list_add(struct  list_head   *new_node, struct  list_head  *prev,  struct  list_head  *next)

{

            next->prev  =  new_node;

            new_node->next  =  next;

           new_node->prev  =  prev;

           prev->next  =  new_node;

}                                 //在已知的prev和next 之间插入一个new_node 元素。


static  inline  void  list_add(struct  list_head  *new_node,  struct  list_head  *head)

{

            __list_add(new_node, head, head->next);

}                                 //在head 这个元素后面加一个new_node元素。


同理就有

static   inline  void  list_add_tail(struct  list_head  *new_node,  struct  list_head  *head)

{

            __list_add(new_node,  head->prev,  head);

}                               //在head 和head->prev两个元素之间加一个元素,因为这个链是双向的,head的前一个其实就是链表的tail,所以就相当于在链表的tail添加一个元素。


***********************链表中元素的删除***************************

static  inline  void  __list_del(struct  list_head  *prev,  struct  list_head  *next)

{   

             next->prev  =  prev;

             prev->next  =  next;

}                             //这个函数是一个内部函数,用来删除prev和next 之间的元素。


static  inline  void  list_del( struct  list_head  *entry)

{

           __list_del(entry->prev,  entry->next);

          entry->prev  =  (void *)0;                  

          entry->next  =  (void *)0;

                                        //给元素的两个指针赋值,一般都会赋一个特殊的值用来表示此结点已经被删除,但是一般不会给它赋0。

}                 


static  inline  void  list_del_init(struct  list_head  *entry)

{

            __list_del(entry->pre,  entry->next);

           INIT_LIST_HEAD(entry);

}                                      //把元素从链表里删除后再给它初始化。

 刚开始我感觉这个函数特别没用,既然已經删除了元素entry干嘛还要给它初始化呢?一直到想不通,最后才发现,可能与后面链表中元素替换有关系吧。看了下别人的博客,还是不太懂这块。。。


************************链表中元素的移动*****************************

static  inline  void  list_move(struct  list_head  *node ,  struct  list_head  *head)

{

            __list_del(node->prev,  node->next);

            list_add(node,  head);

}                    //把node 这个元素删掉,然后把它加到head 这个元素的后面


static  inline void list_move_tail(struct  list_head  *node,  struct  list_head  *head)

{

             __list_del(node->prev,  node->next);

             list_add_tail(node, head);

}                  //把node 这个元素删掉,然后把它加到head这个链表之尾。


*********************链表中元素的替换****************************

static  inline  void list_replace(struct  list_head  *old_node,  struct list_head  *new_node)

{

             new_node->next  =  old_node->next;

             new_node->next->prev  =  new_node;

             new_node->prev  =  old_node->prev;

             new_node->prev->next  =  new_node; 

}                 //这里就是简单的两个元素的替换,没有什么特殊性。


static  inline  void  list_replace_init(struct  list_head  *old,  struct  list_head  *new)

{

              list_replace(old, new);

              INIT_LIST_HEAD(old);

}                   //把旧链表替换了以后,给旧链表初始化,让它成为一个新的,只有一个元素的链表。



今天就先写这么多,接下来还会有更多。。。。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值