linux核心模組

2021-09-24 22:10:36 字數 2680 閱讀 9099

linux核心版本:3.3

linux 允許在系統執行時載入或者去除一塊核心**,稱為乙個核心模組。模組化的設計可以使linux核心映象盡可能的小,同時又方便對新功能進行除錯。也能實現裝置的熱插拔。

模組和應用程式的不同之處在於,模組只是提供服務給應用程式呼叫,有點類似庫。模組也不能呼叫c庫,但linux會提供相應的函式。模組去除的時候必須清理掉初始化時做的事情,如申請記憶體,註冊裝置等等。

#include

#include

static

int __init test_init

(void

)static

void __exit test_exit

(void

)module_init

(test_init)

;module_exit

(test_exit)

;module_license

("gpl");

module_author

("hgl"

);

#include ,這兩個標頭檔案是模組必須包含的。

module_init用來指定初始化函式,在模組載入的時候會執行,module_exit指定去除模組時要執行的函式。

__init : 當核心把驅動初始化完後, 釋放此函式的**指令空間,此函式只跑一次。

__exit : 指定此函式只在驅動解除安裝時使用, 用完後釋放。

#define __init __section(.init.text)

#define __exit __section(.exit.text)

printk和printf用法一致,這裡不能使用prinf,但核心提供了printk列印函式,printk是由分級別的:

#define	kern_emerg	"<0>"	/* system is unusable			*/

#define kern_alert "<1>" /* action must be taken immediately */

#define kern_crit "<2>" /* critical conditions */

#define kern_err "<3>" /* error conditions */

#define kern_warning "<4>" /* warning conditions */

#define kern_notice "<5>" /* normal but significant condition */

#define kern_info "<6>" /* informational */

#define kern_debug "<7>" /* debug-level messages */

預設級別為4 kern_warning。

檢視當前核心的輸出級別 cat /proc/sys/kernel/printk

7 4 1 7

7:console_loglevel

4:default_message_loglevel

1:minimum_console_loglevel

7:default_console_loglevel

當printk函式使用的級別小於當前console_loglevel級別時, 則可以輸出, 否則不輸出

修改級別輸出 echo 7 > /proc/sys/kernel/printk

module_license 指定所支援的協議,必須要有這個!常用的有"gpl",「dual bsd/gpl」, "gpl v2"等。

module_author 作者

module_description 描述

module_version 版本

乙個簡單的核心模組就寫好了,接下來要進行編譯了。

核心模組有兩種載入機制,一種是靜態載入,一種是動態載入。

靜態載入就是把模組編進核心, 在核心啟動時載入,動態載入則是把模組編為ko, 在核心啟動後,需要用時載入。

靜態載入使用obj-y,動態載入使用obj-m。只要在其目錄下的makefile檔案下加入即可。如:

obj-m += test.o

如果當前目錄沒有makefile檔案,建立即可,然後在上級makefile中新增當前的makefile的目錄。

編譯完成將生成test.ko,通過insmod 即可將模組加載入核心中:

$ insmod test.ko

插入後可以在/sys/module/目錄下找到test。

使用dmesg或者cat /proc/kmsg可以看到插入時的列印。

去除模組用rmmod,不需要加.ko

檢視核心當前有哪些模組用lsmod

$ lsmod

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...