Linux核心中的鍊錶

2021-09-30 11:33:13 字數 1976 閱讀 3780

要使用核心鍊錶,需要包含標頭檔案,鍊錶結構定義如下:

struct list_head ;
linux核心中的鍊錶是乙個雙向迴圈鍊錶,結構中只包含兩個指標next和prev,不包含其它任何資料成員,同常見定義鍊錶稍有不同。在linux核心中使用鍊錶,是將鍊錶內嵌在其它結構體中來使用,從這裡也可以看出,linux核心雖然使用c語言這種非物件導向語言,但也體現出了物件導向的思想(繼承)。

例如:

struct todo_struct ;

1. 煉表頭

煉表頭通常需要單獨維護,例如:

struct list_head todo_list;
定義了乙個煉表頭todo_list,在使用之前,需要使用巨集init_list_head對鍊表頭做初始化:

init_list_head(&todo_list);

當然,linux核心也提供了乙個巨集用於靜態定義乙個煉表頭並對其做初始化:

list_head(todo_list);
實際展開後如下:

struct list_head todo_list = ;
所謂初始化就是讓鍊錶中的next、prev指標同時指向自己。

2. list_add和list_add_tail

list_add和list_add_tail函式都是將乙個節點新增到鍊錶上,只是list_add是表頭處,list_add_tail是表尾,函式原型如下:

void list_add(struct list_head *new, struct list_head *head);

void list_add_tail(struct list_head *new, struct list_head *head);

當然這個頭並不是絕對意義上的煉表頭,也可以是鍊錶中的其它節點,表示在該節點之後或之前插入乙個新節點。

3. list_del

刪除鍊錶中的節點(指刪除entry節點),原型如下:

void list_del(struct list_head *entry);

4. list_empty

判斷鍊錶是否為空,原型如下:

int list_empty(const struct list_head *head);

5. list_splice

通過在head之後插入乙個新煉表來合併兩個鍊錶,原型如下:

void list_splice(const struct list_head *list, struct list_head *head);

6. list_for_each、list_for_each_safe、list_for_each_prev和list_for_each_prev_safe

遍歷鍊錶,list_for_each是從頭開始遍歷,而list_for_each_prev是從尾部開始遍歷,加safe欄位表示如果迴圈中可能會刪除鍊錶中的節點,就應該使用這些函式。

7. list_entry

鍊錶始終是內嵌在其它結構體當中來使用的,但是從前面的api來看,我們最多只能得到鍊錶中的節點,那麼如何得到整個大結構體的指標呢,那就需要使用到這裡的巨集list_entry,例如:

void todo_add_entry(struct todo_struct *new)

} list_add_tail(&new->list, &todo_struct);

}

list_entry定義有三個引數,第乙個引數是struct list_head型別的指標,第二個引數是包含這個struct list_head成員的結構體型別,例如前面的struct todo_struct,第三個引數是結構體中該struct list_head的名字。

8. list_for_each_entry、list_for_each_entry_safe

使用這兩個巨集的話,就不用在list_for_each中呼叫list_entry巨集。

Linux核心 10 核心中的鍊錶

使用鍊錶的目的很明確,因為有很多事情要做,於是就把它放進煉表裡,一件事一件事的處理。比如在usb子系統裡,u盤不停的提交urb請求,usb鍵盤也提交,usb滑鼠也提交,那usb主機控制器咋應付得過來呢?很簡單,建乙個鍊錶,然後你每次提交就是往裡邊插入,然後usb主機控制器再統一去排程,乙個乙個來執行...

Linux核心中煉表處理

最基本的定義 struct list head define container of ptr,type,member 通過指標ptr,獲取對應的結構體指標。其中member是typeof中的指標。ptr就是指向member。define list for each entry pos,head,m...

Linux核心裝置驅動之核心中煉表的使用筆記整理

核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...