最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Linux內(nèi)核模塊編程

2023-05-22 10:25 作者:玟玟的大寶貝  | 我要投稿

訪問【W(wǎng)RITE-BUG數(shù)字空間】_[內(nèi)附完整源碼和文檔]

1 總體設(shè)計思路

Linux內(nèi)核是單體式結(jié)構(gòu),相對于微內(nèi)核結(jié)構(gòu)而言,其運行效率高,但是系統(tǒng)的可維護性和可擴展性較差。為此,Linux提供了內(nèi)核模塊(module)機制,它不僅可以彌補單體式內(nèi)核相對于微內(nèi)核的一些不足,而不影響系統(tǒng)性能。內(nèi)核模塊的全稱是動態(tài)可加載內(nèi)核模塊(Loadabe Kernel Module,KLM),簡稱為模塊。模塊是一個目標文件,能完成某種獨立的功能,但其自身不是一個獨立的進程,不能單獨運行,可以動態(tài)載入內(nèi)核,使其成為內(nèi)核代碼的一部分,與其他內(nèi)核代碼的地位完全相同,當(dāng)不需要某模塊功能時,可以動態(tài)卸載。實際上,Linux中大多數(shù)設(shè)備驅(qū)動程序或文件系統(tǒng)都以模塊方式實現(xiàn),因為它們數(shù)目繁多,體積龐大,不適合直接編譯在內(nèi)核中,而是通過模塊機制,需要時臨時加載。使用模塊機制的另一個好處是,修改模塊代碼后只需要重新編譯和加載模塊,不必重新編譯整個內(nèi)核和引導(dǎo)系統(tǒng),減少了更新系統(tǒng)功能的復(fù)雜度。

一個模塊通常有一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,用來實現(xiàn)某種功能,如實現(xiàn)一種文件系統(tǒng)、一個驅(qū)動模塊或其他內(nèi)核上層的功能。模塊自身不是一個獨立的進程,當(dāng)前集成運行過程中調(diào)用到模塊代碼時,可以認為該段代碼就代表當(dāng)前進程在核心態(tài)運行。

模塊編程可以使用內(nèi)核的一些全局變量和函數(shù),內(nèi)核符號表就是用來存放所有模塊都可以訪問的符號及相應(yīng)地址的表,存放在/proc/kallsyms文件中,可以使用“cat /proc/kallsyms”命令查看當(dāng)前環(huán)境下導(dǎo)出的內(nèi)核符號。

通常情況下,一個模塊只需實現(xiàn)自己的功能,而無需導(dǎo)出任何符號;但如果其他模塊需要調(diào)用這個模塊的函數(shù)或數(shù)據(jù)結(jié)構(gòu)時,該模塊也可以導(dǎo)出符號。這樣,其他模塊可以使用由該模塊導(dǎo)出的符號,利用現(xiàn)成的代碼實現(xiàn)更加復(fù)雜的功能,這種技術(shù)也被稱為模塊層疊技術(shù),當(dāng)前已經(jīng)使用在很多主流的內(nèi)核源代碼中。

2 主要函數(shù)的接口設(shè)計

  • module1:設(shè)計一個模塊,要求列出系統(tǒng)中所有內(nèi)核線程的程序名、PID、進程狀態(tài)、進程優(yōu)先級、父進程的PID

  • module2:設(shè)計一個帶參數(shù)的模塊,其參數(shù)為某個進程的PID號,模塊的功能時列出該進程的家族信息,包括父進程、兄弟進程和子進程的程序名、PID號、進程狀態(tài)

模塊中包括兩個函數(shù):

  • 定義module_init()函數(shù)初始化模塊、定義module_exit()函數(shù)卸載模塊

  • 對于需要傳遞參數(shù)的模塊,我們使用module_param()來傳遞參數(shù)

task_struct是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會被裝載到RAM中并且包含著進程的信息。每個進程都把它的信息放在 task_struct 這個數(shù)據(jù)結(jié)構(gòu)體,task_struct 包含了這些內(nèi)容:

  • 標示符 : 描述本進程的唯一標識符,用來區(qū)別其他進程

  • 狀態(tài) :任務(wù)狀態(tài),退出代碼,退出信號等

  • 優(yōu)先級 :相對于其他進程的優(yōu)先級

  • 程序計數(shù)器:程序中即將被執(zhí)行的下一條指令的地址

  • 內(nèi)存指針:包括程序代碼和進程相關(guān)數(shù)據(jù)的指針,還有和其他進程共享的內(nèi)存塊的指針

  • 上下文數(shù)據(jù):進程執(zhí)行時處理器的寄存器中的數(shù)據(jù)

  • I/O狀態(tài)信息:包括顯示的I/O請求,分配給進程的I/O設(shè)備和被進程使用的文件列表

  • 記賬信息:可能包括處理器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號等

有關(guān)進程信息還有以下三點需要了解:

  • 保存進程信息的數(shù)據(jù)結(jié)構(gòu)叫做 task_struct,可以在 include/linux/sched.h 中找到它

  • 所有運行在系統(tǒng)中的進程都以 task_struct 鏈表的形式存在內(nèi)核中

  • 進程的信息可以通過 /proc 系統(tǒng)文件夾查看。要獲取PID為400的進程信息,你需要查看 /proc/400 這個文件夾。大多數(shù)進程信息同樣可以使用top和ps這些用戶級工具來獲取


Linux內(nèi)核模塊編程的評論 (共 條)

分享到微博請遵守國家法律
新乐市| 三台县| 谷城县| 吴桥县| 南开区| 斗六市| 白河县| 色达县| 阳江市| 漳浦县| 陇川县| 华容县| 青田县| 朔州市| 延津县| 磴口县| 正镶白旗| 买车| 武隆县| 德化县| 邻水| 铁力市| 桓仁| 安陆市| 马龙县| 长泰县| 嘉峪关市| 富宁县| 庆元县| 格尔木市| 阳新县| 阿拉尔市| 武宁县| 宜川县| 松江区| 吴旗县| 纳雍县| 五台县| 始兴县| 曲靖市| 资源县|