《作業系統概念(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中的children和sibling:
在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?結論:用通俗易懂的方式來說就是:輸入某個結構體list_head位址,輸出這個結構體list_struct的位址··型別的指標賦予乙個臨時定義的變數__mptr,存放了該子程序在父程序的子程序 list 中的位
置,其實也 是該子程序的 task_struct 結構體中的 sibling 指標,而後通過 offsetof 獲得偏
移量之後,通過減法關係,即獲得了該子程序的 task_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...