XBOOT核心元件之KOBJ技術詳解

2021-06-23 01:22:15 字數 3629 閱讀 1780

kobj顧名思意,即核心object,其層次表現上為一顆倒置的樹,用來管理包括各種驅動模組,核心元件,執行時狀態等。在檔案系統中,通過sysfs介面繫結kobj節點,來實現對該節點的讀寫操作。sysfs介面有兩種最基本的用途:1,元件的外部操作介面,比如應用可以通過此介面操作裝置。2,除錯驅動模組,或檢視執行時狀態。

實現kobj可以對任何形態的元件實現高度抽象,是各種元件的基石,系統中提供了一組api,以方便管理kobj。理解kobj,對後面理解xboot中的各種元件而言有相當大的幫助,建議細心閱讀。

kobj有兩種基本型別,乙個是目錄,其可以掛接子節點,另乙個是檔案,代表一顆樹的末端,不可擁有子節點,但提供了讀或者寫該節點的操作,宣告如下:

enum kobj_type_t ;

kobj結構體擁有名字,節點型別,父節點指標,當前節點鍊錶,子節點煉表頭,節點鎖,讀寫介面函式及乙個私有資料指標,詳細定義如下:

struct kobj_t

;

其為一內部函式,主要是分配一段記憶體,然後利用傳遞的引數進行初始化,並返回分配的kobj節點。

static struct kobj_t * __kobj_alloc(const char * name, enum kobj_type_t type, kobj_read_t read, kobj_write_t write, void * priv)

其為函式為內部函式__kobj_alloc的二次封裝,快速分配指定型別的節點。分配乙個目錄節點實現如下:

struct kobj_t * kobj_alloc_directory(const char * name)

struct kobj_t * kobj_alloc_regular(const char * name, kobj_read_t read, kobj_write_t write, void * priv)

將動態分配的記憶體進行**,實現如下:

bool_t kobj_free(struct kobj_t * kobj)

從乙個父節點中搜尋乙個名為name的子節點。

struct kobj_t * kobj_search(struct kobj_t * parent, const char * name)

return null;

}

與上乙個函式類似,不同之處在於未搜尋到名為name的子節點時,自動建立乙個子節點,該節點為目錄型別。

struct kobj_t * kobj_search_directory_with_create(struct kobj_t * parent, const char * name)

} else if(kobj->type != kobj_type_dir)

return kobj;

}

將乙個節點,可以是目錄節點或檔案節點,新增至父目錄節點,成功返回真,否則返回假。

bool_t kobj_add(struct kobj_t * parent, struct kobj_t * kobj)

從乙個父目錄節點中刪除乙個子節點,為「新增kobj節點」的逆過程。同樣,成功返回真,否則返回假。

bool_t kobj_remove(struct kobj_t * parent, struct kobj_t * kobj)

} return false;

}

此介面實現的目的是為了快速新增子節點,其根據所傳遞的引數,自動建立節點並新增到父節點上,新增子目錄節點:

bool_t kobj_add_directory(struct kobj_t * parent, const char * name)

bool_t kobj_add_regular(struct kobj_t * parent, const char * name, kobj_read_t read, kobj_write_t write, void * priv)

此介面會將自身及其所以子節點以遞迴方式刪除:

bool_t kobj_remove_self(struct kobj_t * kobj)

} parent = kobj->parent;

if(parent && (parent != kobj))

kobj_free(kobj);

return true;

}

系統啟動時,會自動建立乙個根節點,名為"kobj",該節點為乙個全域性靜態變數,是頂層目錄節點,在mount檔案系統時會掛接到sysfs介面。

void do_init_kobj(void)

對於如何使用kobj,請參見各種驅動模組的實現,每個驅動模組都含有乙個kobj物件,在註冊裝置時,會依據裝置的名稱及型別自動建立一組kobj物件。如何通過檔案系統訪問kobj,則參見虛擬檔案系統中的sysfs檔案系統的實現。綜上所述,kobj api歸納如下:

struct kobj_t * kobj_get_root(void);

struct kobj_t * kobj_search(struct kobj_t * parent, const char * name);

struct kobj_t * kobj_search_directory_with_create(struct kobj_t * parent, const char * name);

struct kobj_t * kobj_alloc_directory(const char * name);

struct kobj_t * kobj_alloc_regular(const char * name, kobj_read_t read, kobj_write_t write, void * priv);

bool_t kobj_free(struct kobj_t * kobj);

bool_t kobj_add(struct kobj_t * parent, struct kobj_t * kobj);

bool_t kobj_remove(struct kobj_t * parent, struct kobj_t * kobj);

bool_t kobj_add_directory(struct kobj_t * parent, const char * name);

bool_t kobj_add_regular(struct kobj_t * parent, const char * name, kobj_read_t read, kobj_write_t write, void * priv);

bool_t kobj_remove_self(struct kobj_t * kobj);

NGUI核心元件之UIAtlas

uiatlas是乙個容器,他包含了許多sprite的座標資訊。如果你對這個概念不是很熟悉,你可以這樣理解 與使用很多小的貼圖來渲染ui相比,使用一張包含了所有小貼圖的大貼圖的效率要高許多。這些小的貼圖就被叫做sprite,這個大的貼圖就被叫做atlas。在使用ngui渲染任何東西之前,首先需要建立乙...

Hadoop核心元件之YARN

作業系統級別的排程框架,可以讓各種計算框架執行在上面 yarn 不同計算框架可以共享同乙個hdfs集群上的資料,享受整體的資源排程 on yarn的好處 與其他計算框架共享集群資源,按資源需要分配,進而提高集群資源的利用率 spark mapreduce storm flink 1 resource...

mybatis核心元件之MapperMethod

execute執行 執行sqlsessiontemplate中的方法 注釋 跟蹤sql語句的原始碼過程 mybatis springpublic object invoke object proxy,method method,object args throws throwable catch t...