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

歡迎光臨散文網(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)核模塊編程的評論 (共 條)

分享到微博請遵守國家法律
山西省| 浦东新区| 根河市| 筠连县| 高密市| 钦州市| 诸城市| 青神县| 牟定县| 响水县| 富民县| 玉山县| 靖州| 连平县| 和林格尔县| 乌鲁木齐县| 禄丰县| 米脂县| 嘉峪关市| 古丈县| 丽水市| 宝应县| 玛纳斯县| 璧山县| 湖北省| 枣强县| 朝阳市| 鲁甸县| 望谟县| 湛江市| 印江| 昌黎县| 静宁县| 惠水县| 双鸭山市| 宾川县| 阳山县| 九龙城区| 丽江市| 高安市| 嵊泗县|