Linux核心模組開發

2021-08-06 05:37:41 字數 4057 閱讀 3763

一、核心模組基礎

1.1 什麼是核心模組

linux核心的整體結構非常龐大,其包含的元件也非常

多,如何使用這些元件呢,

方法1:把所有的元件都編

方法1:把所有的元件都編

譯進核心檔案,即:zimage或bzimage,但這樣會導

致乙個問題:占用記憶體過多.

有沒有一種機制能讓核心檔案本身並不包含某元件,而

是在該元件需要被使用的時候,

動態地新增

到正在執行

的核心中呢?

1.2 核心模組特點

①模組本身並

不被編譯進核心檔案

(zimage或者bzimage)

②可以更具需求,

在核心執行期間動態的安裝或解除安裝

1.3 核心安裝與解除安裝

安裝 insmod 

例:insmod /hoem/dnw_usb.ko

解除安裝rmmod 

例:rmmod dnw_usb

檢視 lsmod

例:lsmod

二、核心模組設計

2.1 核心的三要素:

標頭檔案:linux/init.h linux/module.h

insmod,執行模組入口:module_init();

rmmod,執行模組退出:module_exit();

2.2 核心的思維導圖

2.3 核心的helloworld編寫

#include

<

linux

/init.h

>

#include

<

linux

/module.h

>

static

inthello_init

(void

)static void hello_exit

(void

)module_init

(hello_init);

module_exit

(hello_exit);

printk

日誌級別一共有8個級別,printk的日誌級別定義如下(在

include/linux/kernel.h

中):

#define kern_emerg 0/*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/

#define kern_alert 1/*報告訊息,表示必須立即採取措施*/

#define kern_crit 2/*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/

#define kern_err 3/*錯誤條件,驅動程式常用kern_err來報告硬體的錯誤*/

#define kern_warning 4/*警告條件,對可能出現問題的情況進行警告*/

#define kern_notice 5/*正常但又重要的條件,用於提醒*/

#define kern_info 6/*提示資訊,如驅動程式啟動時,列印硬體資訊*/

#define kern_debug 7/*除錯級別的訊息*/

2.4 核心makefile編寫

makefile

obj-m := helloworld.o                              //預設使用obj-m的形式

#hello-objs := file1.o file2.o file3.o             //這個可以分模組的方式

kdir := /home/doctmp/part4/linux-tq2440            //設定tq2440的核心目錄

all:

make -c $(kdir) m=$(pwd) modules cross_compile=arm-linux- arch=arm    //-c 表明使用的

核心目錄  m表示需要編譯的目錄(pwd大寫!) modules:make modules (編譯核心)後面用交叉工具鏈

clean:

rm -f *.o *.ko *.order *.symvers *.mod.c            //設定清除指令

三、核心模組可選資訊

3.1 模組申明

1、module_licens

e (」遵守的協議」)

申明該模組遵守的許可證協議,如:「gpl「、」gpl v2「等

2、module_au

thor

(「作者」)

申明模組的作者

3、module_descript

ion (「模組的功能描述")

申明模組的功能

4、module_ver

sion

("v1.0")

申明模組的版本

3.2 模組引數

在應用程式中

int main(int argc, char** argv),

argc表示命令行輸入的引數個數,argv中儲存輸入的引數。

同理:

同理:通過巨集

module_param

指定儲存模組引數的變數。模組引數

用於在載入模組時傳遞引數給模組。

module_param(name,type,perm);

name:變數的名稱

type:變數型別,bool:布林型 int:整型 charp:字串型

perm是訪問許可權。 s_irugo:讀許可權 s_iwusr:寫許可權

例:nt a = 3;

char *st;

module_param(a,int, s_irugo);

module_param(st,charp, s_irugo);

3.3 符號輸出

核心符號的匯出使用巨集

export_symbol

(符號名)

export_symbol_gpl

(符號名)

說明:其中export_symbol_gpl只能用於包含gpl許可證的模組。

再寫乙個add.c,修改helloworld呼叫add()函式。

#include

<

linux

/init.h

>

#include

<

linux

/module.h

>

module_license

("gpl");

intadd

(inta,

intb

)static

intadd_init

(void

)static void add_exit

(void

)export_symbol

(add);

module_init

(add_init);

module_exit

(add_exit);

如果不加export_symbol的話,會出現以下錯誤:

# insmod add.ko

# insmod helloworld.ko

helloworld: unknown symbol add

insmod: cannot insert 'helloworld.ko': unknown symbol in module or invalid parameter

儘管加上extern表示外部引用,最後依然不能完成載入,哪怕順序一致。加上export_symbol後就能讓helloworld使用了。

0

給主人留下些什麼吧!~~

Linux核心模組開發

下面是乙個最基本的核心模組源 結構,任何模組專案都需要包含這些內容 include 模組初始化函式 static intmodule init func void 模組解除安裝函式 static void module exit func void module init module init f...

Linux核心開發 核心模組引數

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

linux核心模組開發基礎

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