Linux核心模組開發

2021-10-24 21:34:17 字數 2212 閱讀 5614

下面是乙個最基本的核心模組源**結構,任何模組專案都需要包含這些內容

#include

/*模組初始化函式*/

static

intmodule_init_func

(void

)/*模組解除安裝函式*/

static

void

module_exit_func

(void

)module_init

(module_init_func)

;module_exit

(module_exit_func)

;module_license

("gpl"

);

開發核心模組通常會用到以下標頭檔案

#include

// 核心模組相關操作,如模組註冊,解除安裝等等

#include

// 核心輸入輸出等功能函式

#include

// 虛擬檔案系統相關操作,如開啟檔案,關閉檔案等等

#include

// 記憶體對映相關操作

#include

// 核心動態分配,kmalloc/kfree等

#include

// 核心動態分配, vmalloc/vfree等

#include

// 記憶體對映相關操作

#include

// 查詢核心符號表的相關函式 kallsyms_lookup_name

#include

// 操作使用者空間記憶體的相關函式

#include

// 處理linux錯誤碼的相關函式

#include

// linux常用的基本資料型別定義,如uint8_t,size_t等等

最基本的用於編譯乙個核心模組的makefile如下

# 這裡設定模組名稱,模組名稱為源**檔名去掉字尾名

module_name := module_name

# 核心構建系統會根據傳遞給其的m變數來找到這個makefile檔案並將其include,通過檢查kernelrelease變數,可以將傳遞給核心構建系統的內容和本makefile單獨的操作分開以避免相互影響

ifneq ($(kernelrelease),)

# 此內容傳遞給核心構建系統,因此只向核心構建系統傳遞其必須的變數(即obj-m),避免汙染核心構建系統中的其他變數

obj-m := $(module_name).o

else

# 下面的內容不需要被核心構建系統使用

# 通過ccflags-y變數可以增加編譯時的編譯引數

ccflags-y :=

# 注意這裡傳遞給核心構建系統的m變數,核心構建系統將在m變數儲存的目錄中搜尋makefile檔案,並將其include

all:

$(make) -c /lib/modules/$(shell uname -r)/build m=$(shell pwd) ccflags-y=$(ccflags-y) modules

clean:

$(make) -c /lib/modules/$(shell uname -r)/build m=$(shell pwd) clean

endif

如果要編譯的核心模組包括了多個源**,需要對makefile進行一些調整

# 這裡設定模組名稱(不需要為源**名稱)

module_name := module_name

ifneq ($(kernelrelease),)

obj-m := $(module_name).o

# 這裡寫源**列表,需要將字尾名.c改為.o,以空格分隔

$(module_name)-objs := sourcecode1.o sourcecode2.o

else

# 新增額外的編譯選項

ccflags-y :=

all:

$(make) -c /lib/modules/$(shell uname -r)/build m=$(shell pwd) ccflags-y=$(ccflags-y) modules

clean:

$(make) -c /lib/modules/$(shell uname -r)/build m=$(shell pwd) clean

endif

Linux核心模組開發

一 核心模組基礎 1.1 什麼是核心模組 linux核心的整體結構非常龐大,其包含的元件也非常 多,如何使用這些元件呢,方法1 把所有的元件都編 方法1 把所有的元件都編 譯進核心檔案,即 zimage或bzimage,但這樣會導 致乙個問題 占用記憶體過多.有沒有一種機制能讓核心檔案本身並不包含某...

Linux核心開發 核心模組引數

目錄 使用引數載入模組 module param巨集 讀取和更改引數值 驗證引數值 宣告模組引數陣列 有關模組引數的一些說明 在本文中,我們將向模組新增引數。使用引數,您可以在載入模組時訪問模組全域性變數,並在執行時已載入模組時訪問模組全域性變數。使用insmod命令載入模組時,可以提供引數作為ke...

linux核心模組開發基礎

1.什麼是核心模組 核心模組具有以下兩個特點 1.模組本身並不被編譯進核心檔案 zimage或bzimage 可以根據需求,在核心執行期間動態的安裝或解除安裝。2.為什麼需要核心模組 原因 linux核心的整體結構非常龐大,其包含的元件也非常多,如何使用這些元件呢,方法1 把所有的元件都編譯鍵核心,...