Linux核心中煉表處理

2021-06-18 21:11:14 字數 989 閱讀 1668

最基本的定義:

struct list_head

;#define container_of(ptr, type, member) ()

通過指標ptr, 獲取對應的結構體指標。其中member是typeof中的指標。ptr就是指向member。

#define list_for_each_entry(pos, head, member)   list_for_each_entry_safe(pos, pos, head, member)

#define list_for_each(pos, head)     for (pos = (head)->next; prefetch(pos->next), pos != (head); pos = pos->next)

上面的不但獲取到寫乙個list_head,並且通過list_entry獲取到list對應的結構體。

下面的pos則直接是head->next的型別,在linux核心中一般是list_head型別。

#define list_for_each_safe(pos, n, head)    for (pos = (head)->next, n = pos->next; pos != (head);  pos = n, n = pos->next)

#define list_for_each_entry_safe(pos, n, head, member)\

for (pos = list_entry((head)->next, typeof(*pos), member),\

n = list_entry(pos->member.next, typeof(*pos), member);  &pos->member != (head);   pos = n, n = list_entry(n->member.next, typeof(*n), member))

該巨集則通過n儲存了pos對應的下乙個物件,當在有刪除操作時刪除了當前節點還可以通過next繼續遍歷下去。其實在只要找到乙個節點的時候完全沒有必要這個n節點。

Linux核心中的鍊錶

要使用核心鍊錶,需要包含標頭檔案,鍊錶結構定義如下 struct list head linux核心中的鍊錶是乙個雙向迴圈鍊錶,結構中只包含兩個指標next和prev,不包含其它任何資料成員,同常見定義鍊錶稍有不同。在linux核心中使用鍊錶,是將鍊錶內嵌在其它結構體中來使用,從這裡也可以看出,li...

Linux核心 10 核心中的鍊錶

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

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

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