linux核心模組中用DFS實現程序遍歷

2021-09-29 06:58:17 字數 2963 閱讀 1303

《作業系統概念(9th)》( 《operation system concepts(9th)》 .)中第三章程序管理的程式設計題:

根據以下**片提示,編寫乙個核心模組,能用dfs遍歷所有程序,並列印到核心日誌緩衝區

//reference: 

struct task_struct *task;

for_each_process

(task)

struct task_struct *task;

struct list_head *list;

list_for_each

(list,

&init_task-

>children)

注意:題中的兩個函式還是比較難理解,可以跳過原理,直接看每個函式的結論部分(有?標誌的地方)

在此題中,我們需要了解的是task_struct中的childrensibling

在task_struct的定義資訊中是這樣寫的:

struct list_head children; /* list of my children */

struct list_head sibling; / * linkage in my parent』s children list */

?(๑•̀ㅂ•́)و✧翻譯過來就是children是乙個裝了當前節點所有孩子節點的表,sibling是當前節點的父節點的「children」(這個children和前面那個children同義,也就是父節點裝所有孩子的表)

·

··list_for_each()是遍歷鍊錶的巨集,本質上是for迴圈來完成的

我們先來看看list_for_each核心中的定義:

/**

* list_for_each - iterate over a list

* @pos: the &struct list_head to use as a loop cursor.

* @head: the head for your list.

*/#define list_for_each

(pos, head) \

for(pos =

(head)

->next; pos !=

(head)

; pos = pos-

>next)

/*

其中head是我們輸入的煉表頭,pos就是這個煉表頭的下一項。··

·這個函式在核心的定義中是這麼說的:

#define list_entry(ptr, type, member) \

container_of(ptr, type, member)

#define container_of(ptr, type, member) ()

引數解釋:

ptr:表示和member同為相同型別的鍊錶,此處ptr表示指向鍊錶中的乙個節點

type:表示需要尋找的結構體型別。

member:表示type型別的結構體裡面的成員。

看起來是不是太長了眼花?

其實放到該題中就是這一段 ( 這樣簡化只是便於理解 )

#define list_entry

(list, struct task_struct, sibling)

()

通過上解說及圖示理解,container_of 定義中,首先將通過 list_for_each 獲得的 list_head

型別的指標賦予乙個臨時定義的變數__mptr,存放了該子程序在父程序的子程序 list 中的位

置,其實也 是該子程序的 task_struct 結構體中的 sibling 指標,而後通過 offsetof 獲得偏

移量之後,通過減法關係,即獲得了該子程序的 task_struct 的指標

?結論:用通俗易懂的方式來說就是:輸入某個結構體list_head位址,輸出這個結構體list_struct的位址··

·總的來說,我們需要的內容都在結構體中,而為了得到每乙個節點的結構體,我們要做的就三步:

1.輸入乙個已知結構體

2.得到它下一節點的頭節點

2.通過這個頭節點得到它的結構體

#include 

#include

#include

#include

/** * performs a dfs on a given task's children.

* * @void

*/void

dfs(struct task_struct *task)

}/**

* this function is called when the module is loaded.

* * @return 0 upon success

*/int

task_lister_init

(void

)/**

* this function is called when the module is removed.

* * @void

*/void

task_lister_exit

(void

)// macros for registering module entry and exit points.

module_init

(task_lister_init)

;module_exit

(task_lister_exit)

;

Linux核心模組

核心模組 在整個啟動的過程中,是否能成功的驅動我們主句的硬體裝置,是核心完成的工作,而核心一般都是壓縮文件,在使用之前核心之前必須要將核心減壓到的記憶體中。為了應對日新月異的硬體,目前核心都具有可讀取模組化驅動程式的功能,也就是所謂的 modules模組化 所謂模組化。核心與核心模組放在 核心 bo...

Linux核心模組

1 核心模組註冊登出 塊載入函式有返回值,模組解除安裝函式無返回值。兩者都是無參函式,載入函式用 init修飾,解除安裝函式用 exit修飾。define init attribute section init.text define exit atrribute section exit,text...

Linux 核心模組

linux 核心模組程式結構 1 模組載入函式 2 模組解除安裝函式 3 模組許可證宣告 4 模組引數 5 模組匯出符號 6 模組作者等資訊宣告 模組載入函式 一般以 init 標識 在 linux 中,所有標識為 init 的函式如果直接編譯進核心,成為核心映象的一部分,在連線的時候都會放在 in...