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

2022-10-06 19:27:15 字數 2232 閱讀 3129

/********************

* 核心中煉表的應用

********************/

(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結構體內的成員,並在模組...