核心資料結構之對映

2021-06-05 10:48:56 字數 1659 閱讀 2417

對映也稱之為關聯陣列,它是一組唯一鍵的集合,每個鍵與特定的值相關。一般支援至少三個操作:

linux提供了乙個簡單而有效的對映資料結構,它不是通用目的的對映,而是為特殊用例設計的:將uid(唯一標識號)對映到乙個指標。除了提供三個主要的對映操作,還基於add操作的基礎上提供了乙個allocate操作。allocate操作不僅將新增乙個uid/值對到對映中,還產生了乙個uid。

idr資料結構用於對映使用者空間的uid,例如inotify監視描述符到它們相關的核心資料結構中,如inotify_watch。

初始化idr

先靜態定義或動態定義乙個idr結構,然後呼叫idr_init():

void idr_init(struct idr *idp); 如:

struct idr id_huh; /* statically define idr structure */

idr_init(&id_huh);/* initialize provided idr structure */

分配乙個新的uid

分兩步進行,第一步告訴idr需要分配乙個新的uid,使得它能在必要時重置後備樹的大小,對應的函式為:

int idr_pre_get(struct idr *idp, gfp_t gfp_mask);

第二步,請求新的uid,相應的函式為:

int idr_get_new(struct idr *idp, void *ptr, int *id);

例子如下:

intid;

dowhile (ret == -eagain);

int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int*id);

該函式的工作方式與idr_get_new()一樣,不過它保證了新的uid大於或等於starting_id。它確保某個uid不被重用,並且保證了分析的uid在系統執行期間都是唯一的。

intid;

dowhile (ret == -eagain);

if(!ret)

next_id = id + 1;

查詢乙個uid

void*idr_find(struct idr *idp, int id);

structmy_struct *ptr = idr_find(&idr_huh, id);

if(!ptr)

return-einval; /* error */

刪除乙個uid

void idr_remove(struct idr *idp, int id);

銷毀乙個udr

void idr_destroy(struct idr *idp);

如果想強制刪除所有的uid,使用如下函式:

void idr_remove_all(struct idr *idp);

不過在呼叫idr_destroy()之前,要先在該idr上呼叫idr_remove_all(),確保所有的idr記憶體被釋放。

核心資料結構

關於開發驅動重要的核心資料結構,方便自己理解 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...