核心資料結構

2021-08-29 23:35:42 字數 1792 閱讀 7588

這部分包含了修改核心模組,所以要使用到核心鏈結表資料結構。

首先你得定義乙個包含元素的結構去插入鍊錶。

下邊這段**用c語言定義了生日結構:

struct birthday

;

注意struct list_head list。

結構list_head在包含目錄的裡有定義。它的作用就是嵌入包含列表節點的鏈結表。list_head這個結構非常簡單,它僅包含兩個成員:next和prev。它分別是下乙個和上乙個節點的入口。通過嵌入包含結構的鍊錶,這讓linux通過一系列的巨集函式管理資料結構變得可能。

接下來向鍊錶插入元素

我們首先可以宣告乙個list_head,把他用作列表的參考頭。使用巨集list_head()。

static list_head(birthday_list);
這個巨集定義了birthday_list並且初始化了birthday_list的變數。它是list_head結構型別。

我們建立並初始化birthday結構:

struct birthday *person;

person = kmalloc(sizeof(*person),gfp_kernel);

person->day = 2;

person->month = 8;

person->year = 1995;

init_list_head(&person->list);

kmalloc()函式相當於使用者級別的malloc()函式。它的作用是分配記憶體,但是核心記憶體是已經被分配好的。

gfp_kernel是乙個指明核心空間分配的標誌;init_list_head()初始化birthday結構的成員。

我們可以用list_add_tail()新增乙個例項到鍊錶的末尾。

list_add_tail(&person->list);
遍歷鍊錶:

通過list_for_each_entry()遍歷時,包含三個引數。

struct birthday *ptr;

list_for each_entry(ptr,&birthday_list,list)

接下來移除鍊錶元素

可以通過list_del()

list_del(struct list_head *element);
這種刪除會保留一些殘餘項在list中。

最簡單的移除所有元素的方法是遍歷list。

list_for_each_entry_safe()和list_for_each_entry()有相似之處。

struct birthday *ptr, *next;

list_for each_entry_safe(ptr,next,&birthday_list,list)

kfree()函式把之前kmalloc()分配的空間返回給核心。在模組起始點建立乙個鏈結表包含五個資料結構元素,遍歷這些元素,並在核心載入緩衝器裡輸出它的內容。使用dmesg檢視

在模組退出時,刪除所有元素並返回記憶體空間到核心。使用dmesg檢視

核心資料結構

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

核心資料結構

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

核心資料結構mm struct

核心資料結構mm struct中的成員變數start code和end code是程序 段的起始和終止位址,start data和 end data是程序資料段的起始和終止位址,start stack是程序堆疊段起始位址,start brk是程序動態記憶體分配起始位址 堆的起始位址 還有乙個 brk...