linux内核模块编写,Linux内核模块编程
1 總體設計思路
Linux內核是單體式結構,相對于微內核結構而言,其運行效率高,但是系統的可維護性和可擴展性較差。為此,Linux提供了內核模塊(module)機制,它不僅可以彌補單體式內核相對于微內核的一些不足,而不影響系統性能。內核模塊的全稱是動態可加載內核模塊(Loadabe Kernel Module,KLM),簡稱為模塊。模塊是一個目標文件,能完成某種獨立的功能,但其自身不是一個獨立的進程,不能單獨運行,可以動態載入內核,使其成為內核代碼的一部分,與其他內核代碼的地位完全相同,當不需要某模塊功能時,可以動態卸載。實際上,Linux中大多數設備驅動程序或文件系統都以模塊方式實現,因為它們數目繁多,體積龐大,不適合直接編譯在內核中,而是通過模塊機制,需要時臨時加載。使用模塊機制的另一個好處是,修改模塊代碼后只需要重新編譯和加載模塊,不必重新編譯整個內核和引導系統,減少了更新系統功能的復雜度。
一個模塊通常有一組函數和數據結構組成,用來實現某種功能,如實現一種文件系統、一個驅動模塊或其他內核上層的功能。模塊自身不是一個獨立的進程,當前集成運行過程中調用到模塊代碼時,可以認為該段代碼就代表當前進程在核心態運行。
模塊編程可以使用內核的一些全局變量和函數,內核符號表就是用來存放所有模塊都可以訪問的符號及相應地址的表,存放在/proc/kallsyms文件中,可以使用“cat /proc/kallsyms”命令查看當前環境下導出的內核符號。
通常情況下,一個模塊只需實現自己的功能,而無需導出任何符號;但如果其他模塊需要調用這個模塊的函數或數據結構時,該模塊也可以導出符號。這樣,其他模塊可以使用由該模塊導出的符號,利用現成的代碼實現更加復雜的功能,這種技術也被稱為模塊層疊技術,當前已經使用在很多主流的內核源代碼中。
2 主要函數的接口設計
module1:設計一個模塊,要求列出系統中所有內核線程的程序名、PID、進程狀態、進程優先級、父進程的PID
module2:設計一個帶參數的模塊,其參數為某個進程的PID號,模塊的功能時列出該進程的家族信息,包括父進程、兄弟進程和子進程的程序名、PID號、進程狀態
模塊中包括兩個函數:
定義module_init()函數初始化模塊、定義module_exit()函數卸載模塊
對于需要傳遞參數的模塊,我們使用module_param()來傳遞參數
task_struct是Linux內核的一種數據結構,它會被裝載到RAM中并且包含著進程的信息。每個進程都把它的信息放在 task_struct 這個數據結構體,task_struct 包含了這些內容:
標示符 : 描述本進程的唯一標識符,用來區別其他進程
狀態 :任務狀態,退出代碼,退出信號等
優先級 :相對于其他進程的優先級
程序計數器:程序中即將被執行的下一條指令的地址
內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針
上下文數據:進程執行時處理器的寄存器中的數據
I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表
記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等
有關進程信息還有以下三點需要了解:
保存進程信息的數據結構叫做 task_struct,可以在 include/linux/sched.h 中找到它
所有運行在系統中的進程都以 task_struct 鏈表的形式存在內核中
進程的信息可以通過 /proc 系統文件夾查看。要獲取PID為400的進程信息,你需要查看 /proc/400 這個文件夾。大多數進程信息同樣可以使用top和ps這些用戶級工具來獲取
參考文檔和完整的文檔和源碼下載地址:
總結
以上是生活随笔為你收集整理的linux内核模块编写,Linux内核模块编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java网页版斗地主_JAVA控制台版斗
- 下一篇: 都江堰很美-佩服古人_Crmhf的一天