linux 核心程式設計(一)
什麼是模組
模組是linux核心向外部提供的一個核心介面,全稱為動態可載入核心模組(Loadable Kernel Module,LKM)。核心模組可以被單獨編譯,但不能單獨執行,必須被連結到核心,作為核心的一部分執行在核心空間。模組通常由一組函式和資料結構組成,用來實現一種檔案系統、一個驅動程式或其他核心上層的功能。
核心模組與應用程式在編寫上的一些區別
C語言應用程式核心模組程式 使用函式Libc庫核心函式 執行空間使用者空間核心空間 執行許可權普通使用者超級使用者 入口函式main()module_init() 出口函式exit()module_exit() 編譯Gcc –cMakefile 連線Gccinsmod 執行直接執行insmod 除錯Gdbkdbug, kdb,kgdb等
例如一些C語言常見函式printf,在編寫核心模組時需要用printfk,還要有兩個重要函式module_init()和module_exit(),分別用來表示函式的開始跟結束。
一些常用命令
- insmod: 講指定模組載入到核心中
- rmmod: 從核心中解除安裝指定模組
- lsmod: 列出已經載入的模組
符號
linux中一些變數跟函式被稱為符號,可以“共用”的符號被定義在kernel/ksyms.c中。 描述符號的結構體
struct module_symbole { unsigned lone value;//符號在核心空間中的地址 const char *name;//符號名 }
2.4核心下可通過 /proc/ksyms、 2.6 核心下可通過/proc/kallsyms檢視模組輸出的核心符號 顯示格式:記憶體地址符號名[所屬模組]
ffffffffc0ab41f8 r __kstrtab_ZSTD_compressEnd[zstd_compress] ffffffffc0ab3110 r __ksymtab_ZSTD_compressContinue[zstd_compress] ffffffffc0ab4209 r __kstrtab_ZSTD_compressContinue[zstd_compress]
模組裡的一些相關概念
- 模組依賴
當一個新的模組被裝載進核心以後,核心符號表就會記錄這個模組所宣告的一些符號,A模組想要執行時,需要B模組的一些符號,因此想要連結A就首先要連結B。
- 模組引用計數器
目的是安全的解除安裝模組,當這個模組還在被使用時,計數器遞增,不用時遞減,直到計數器為0時,就可以安全解除安裝了,比如:以模組依賴為例,A依賴於B,當A模組還在使用B的某些符號時,B的計數器就會遞增,要想解除安裝B只能等計數器遞減為0
- 模組編譯
工具:make:通過一個名為Makefile的檔案來自動維護編譯工作。
相關連結:ofollow,noindex" target="_blank">https://mp.weixin.qq.com/s?__biz=MzI3NzA5MzUxNA==&mid=416330565&idx=1&sn=b05a88b33c6f10909277954cc97e85fb&scene=19#wechat_redirect