/********************
* 核心中煉表的應用
********************/
(1)介紹
在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include/linux/list.h實現的乙個相當精彩的鍊錶資料結構。
鍊錶資料結構的定義很簡單:
struct list_head ;
list_head結構包含兩個指向list_head結構的指標prev和next,核心的資料結構通常組織成雙迴圈鍊錶。
和以前介紹的雙鏈表結構模型不同,這裡的list_head沒有資料域。在linux核心鍊錶中,不是在鍊錶結構中包含資料,而是在資料結構中包含鍊錶節點。如:
struct my_struct;
linux中的鍊錶沒有固定的表頭,從任何元素開始訪問都可以。遍歷鍊錶僅僅需要從某個節點開始,沿指標訪問下乙個節點,直到又重新回到最初這個節點就可以了。每個獨立的節點都可以被稱作是煉表頭。
(2)鍊錶的初始化
a.靜態
如果在編譯時靜態建立鍊錶,並且直接引用它,如下:
struct my_stru mine=;
//或static list_head(fox);
/*等於struct list_head fox = list_head_init(fox); */
b.動態
struct my_struct *p;
p = kmalloc(gfp_kernel, sizeof(my_struct));
p->dog = 0;
p->cat = null;
init_list_head(&p->
(3)操作鍊錶
核心提供了一組函式來操作鍊錶。
注意!這些函式都使用乙個或多個list_head結構體指標作引數。定義在
a.增加節點
list_add(struct list_head *new,
struct list_head *head);
//向指定鍊錶的head節點後面插入new節點
b.把節點增加到鍊錶尾
list_add_tail(struct list_head *new,
struct list_程式設計客棧head *head);
//向指定鍊錶的head節點前面插入new節點
c.從鍊錶刪除乙個節點
list_del(struct list_head *entry);
//將entry從鍊錶中移走
d.把節點從一cygycegnrs個鍊錶移到另乙個鍊錶
list_move(struct list_head *list,
struct list_head *head);
從乙個鍊錶中摘除list項,然後將其插入head的後面
e.list_empty(struct list_head *head);
鍊錶為空返回非0值,否則返回0
f.合併鍊錶
list_splice(struct list_head *list,
struct list_head *head);
//注意!新的鍊錶不包括list節點
(4)遍歷鍊錶
鍊錶本身不重要,訪問到那個包含鍊錶的結構體才重要
a.從鍊錶指標獲得包含該鍊錶的結構體的指標
list_entry(struct list_head *ptr,
type_of_struct,
field_name);
如:my_struct *p = (list_head *ptr, my_struct, list);
b.遍歷鍊錶
list_for_each(struct list_head *cursor,
struct list_head *list);
//常常和list_entry配套使用
//注意!用list_for_each遍歷時,不包括頭節點
c.遍歷的同時獲得大結構體指標
list_for_each_entry(type *cursor,
struct list_head *list,
member);
d.遍歷鍊錶的同時釋放每個被遍歷到的節點
list_for_each_entry_safe(type *cursor,
type *tmp;
struct list_head *list,
member);
總結
Linux核心之字元裝置驅動
學習計畫 1.vfs 虛擬檔案系統 vfs的作用就是採用標準的unix系統呼叫讀寫位於不同物理介質上的不同檔案系統。vfs是乙個可 以讓open read write 等系統呼叫不用關心底層的儲存介質和檔案系統型別就可以工作的 粘合層。在古老的dos作業系統中,要訪問本地檔案系統之外的檔案系統需要使...
linux核心中匯流排驅動模型
最近學習了linux系統的匯流排驅動模型,在這就簡單的講一下自己對於其中的理解 在這個驅動模型中由幾個重要的概念 匯流排 這個 匯流排 不是我們通常所說的傳輸資料的匯流排,而是將裝置和驅動聯絡起來的乙個中介軟體,在這個匯流排上掛載了許多裝置,在註冊驅動模組的時候,它就會根據某種固定的匹配規則找到你想...
Linux核心中LED驅動框架
朱有鵬老師驅動開發學習筆記 1 讀寫led裝置屬性檔案 led裝置屬性的show和store方法 led裝置驅動程式 操作led硬體裝置 2 led classdev結構體定義 struct led classdev 3 編寫led驅動程式其實就是填充led classdev結構體內的成員,並在模組...