核心資料結構 hlist head

2021-05-28 05:50:22 字數 972 閱讀 9254

核心中,使用list_head作為鍊錶,該資料結構本身即使head又是node。如果將它作為hash list的頭節點,那麼每個頭節點會占用8個位元組。因此核心中對其優化,使用hlist_head作為hash表的頭節點。核心中定義其資料結構為:

struct hlist_head ;

struct hlist_node ;

注意到,這裡的pprev是乙個二級指標。為什麼這樣設計呢,有什麼優點?

在上圖中,pprev是指向前一節點next指標的指標。first是hlist_head的字段,指向第乙個節點。

static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)

static inline void __hlist_del(struct hlist_node *n)

如果hlist_node中使用的是單級指標,那麼在1處就需要判斷節點是否為頭節點。可以用n->prev是否被賦值,即是否為null來區分頭結點和普通節點。在add和delete時都很容易保證頭節點的prev為null。

比如這樣判斷:

struct my_hlist_node *next = n->next ;

struct my_hlist_node *prev = n->prev ;

if(n->prev)

n->prev->next = next ;

else

n->prev = null ;

if(next)

next->prev = prev ;

為什麼不這樣做?有兩個原因:

1. **不夠簡潔優雅。使用hlist_node,頭結點和普通節點是一致的。

2. pprev有乙個作用,在hlist_unhashed()中有體現。

static inline int hlist_unhashed(const struct hlist_node *h)

核心資料結構

關於開發驅動重要的核心資料結構,方便自己理解 driver object typedef struct driver object cshort type cshort size 乙個鍊錶,記錄了該驅動建立的所有裝置物件 pdevice object deiceobject ulong flags ...

核心資料結構

核心需要儲存i o元件使用的狀態資訊,可以通過若干核心資料結構比如說檔案開啟表等來完成 unix系統中在讀取乙個使用者檔案的時候,核心需要去檢查下快取,然後再去決定是否執行磁碟i o,在讀乙個程序映象時候,核心只需要從記憶體當中讀取資料,也就是說這些操作都可以呼叫read 函式來完成,但是語義不同 ...

核心資料結構

這部分包含了修改核心模組,所以要使用到核心鏈結表資料結構。首先你得定義乙個包含元素的結構去插入鍊錶。下邊這段 用c語言定義了生日結構 struct birthday 注意struct list head list。結構list head在包含目錄的裡有定義。它的作用就是嵌入包含列表節點的鏈結表。li...