linux 内核驱动部分详解
linux内核部件分析(一)——连通世界的list
在linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。
struct list_head {
struct list_head *next, *prev;
};
这是链表的元素结构。因为是循环链表,表头和表中节点都是这一结构。有prev和next两个指针,分别指向链表中前一节点和后一节点。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list-》next = list;
list-》prev = list;
}
在初始化的时候,链表头的prev和next都是指向自身的。
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next-》prev = new;
new-》next = next;
new-》prev = prev;
prev-》next = new;
}
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head-》next);
}
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head-》prev, head);
}
双向循环链表的实现,很少有例外情况,基本都可以用公共的方式来处理。这里无论是加第一个节点,还是其它的节点,使用的方法都一样。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !