傳統鍊錶與linu核心鍊錶的區別圖:圖一圖二
從上圖中看出在傳統鍊錶中各種不同鍊錶間沒有通用性,因為各個資料域不同,而在linux核心中巧妙將鍊錶結構內嵌到資料域結構中使得不同結構之間能連線起來;核心中煉表實現檔案路徑:include/linux/list.h鍊錶結構定義
struct list_head;
獲取結構入口位址(list_entry)
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
說明:type為指定一種結構型別,member為該結構中乙個成員,而ptr與member為相同的型別;
#define container_of(ptr, type, member) ()#define offsetof(type, member) ((size_t) &((type *)0)->member)
解析說明:1、typeof為獲取變數的型別;
2、const typeof(((type *)0)->member)*__mptr = (ptr);
把0強制轉換為type 型別的指標(這裡的0可以用其它數字也行),然後獲取type 型別中member成員的型別(這裡設該型別為a),即const a *__mptr=(ptr);
3、#define offsetof(type, member) ((size_t) &((type *)0)->member)
獲取成員在結構中的偏移量,注意這裡的((type *)0)這裡必須是0不可以是其它數字,因為這樣定義的乙個指標它的基址為0,那麼((size_t) &((type *)0)->member)該表示式實際就是獲取型別type中member成員的偏移量;
鍊錶的遍歷#define list_for_each_entry(pos, head, member) \for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
初始化鍊錶成員
#define list_head_init(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;
}說明:list_head_init與list_head 都是將鍊錶的兩個成員都指向自己,不過list_head建立乙個名為引數name的list_head結構物件;
增加鍊錶節點
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
鍊錶節點的刪除
static inline void __list_del(struct list_head * prev, struct list_head * next)
android 核心系列
編譯 1,需要jre1.6,64bit的機器。2,錯誤 this attribute must be localized 提示了錯誤 this attribute must be localized 這種問題一般情況是因為在res xml資料夾下的中 或者在res layout下的檔案中出現了沒有多...
linux核心系列(2) linux核心鍊錶
因為高超的設計理念,linux核心中的鍊錶被很多人津津樂道。實際上,鍊錶本身只是核心提供的一組結構體 巨集定義和函式的集合,與linux核心本身沒有直接關係。核心鍊錶的設計思路已經在另一篇部落格中寫了,有興趣的同學可以去看一下,這裡是鏈結。今天,我們來看一下真實核心鍊錶的基本操作過程。我們的目標是做...
Linux核心資料結構
一 概述 linux核心提供了一些常用的資料結構並建議開發者盡量重用,而不需要再去實現一些類似的資料結構。這篇部落格主要描述一下linux核心提供的鍊錶 佇列 對映及二叉樹這四種常用資料結構。當然這裡提到的每一種資料結構要說清楚都需要不少的篇幅,而這篇博文只是簡要分析一下linux核心設計的理念,以...