Content #
Linux内核链表使用struct list_head数据结构来描述。
//<include/linux/types.h>
struct list_head {
struct list_head *next, *prev;
};
struct list_head数据结构不包含链表节点的数据区,通常是嵌入其他数据结构,如struct page数据结构中嵌入了一个lru链表节点,通常是把page数据结构挂入 LRU链表。
<include/linux/mm_types.h>
struct page {
struct list_head lru;
...
}
添加节点到一个链表中 #
list_add()是把一个节点添加到表头,list_add_tail()是插入表尾。
//<include/linux/list.h>
void list_add(struct list_head *new, struct list_head *head)
void list_add_tail(struct list_head *new, struct list_head *head)
遍历节点 #
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
这个宏只是遍历一个一个节点的当前位置,那么如何获取节点本身的数据结构呢?这里还需要使用 list_entry宏。
From #
奔跑吧Linux内核——入门篇