Linux核心模組

2021-07-25 16:01:16 字數 2664 閱讀 1224

1、核心模組註冊登出:

塊載入函式有返回值,模組解除安裝函式無返回值。兩者都是無參函式,載入函式用_ init修飾,解除安裝函式用 _exit修飾。

#define __init  __attribute__((__section__(".init.text")))

#define __exit __atrribute__((__section__(".exit,text")))

static

int _ _init demo_init(void);

static

void _ _exit demo_exit(void);

## 2、模組引數 ##

模組引數是可以從命令列傳給模組的供使用者在載入模組時對模組中的引數值進行更改。可以作為核心模組引數匯出的型別有byte、int、uinit、short、ushort、long、ulong、charp、bool、invbool。在/sys/module/paremters下會有以引數命名的檔案節點。

static

int i=0;

module_param( i , int , 0644 );

static

int arr[6] = ;

int len = 0;

module_param_array( arr , int , &len , 0664 );

static

char* name="hello";

module_param( name , charp , 0664 );

//當引數為字串時,在匯出引數是需要指定字串的內部名字和外部名字。

static

char innane="hello";

module_param_string( outname , inname , sizeof( inname ) , 0664);

//總結:

a、匯出引數為簡單型別時,直接用module_param(引數名,型別,許可權)

b、匯出引數為整型陣列時,引數要多乙個描述陣列長度的變數的位址,而且匯出引數的函式的名字也多了個array:module_param_array(陣列名,int,&int,0664);

c、匯出引數為字串陣列時函式名稱改變為module_param_string,引數中多了乙個字串的外部名字:

module_param_string(outname,inname,sizeof(inname),0664);

export_symble(符號名);

exprot_symbol_gpl(符號名);

//符號名一般為函式名

4、核心模組的編譯:

要正確的編譯乙個我們自己的核心模組其實並不簡單,首先我們要準備乙份核心原始碼,這個核心原始碼是我們的模組將要載入的地方。其次要保證這個核心原始碼是被編譯過的。然後我們來寫makefile:

ifneq ($(kernelrelease) , )

mymodule-objs = ***.o

obj-m =mymodule.o

else

keieldir := /lib/modules/$(shell uname -r)/build

pwd :=$(shell pwd)

modules:

make -c $(kerneldir) m=$(pwd) modules

endif

clean:

rm -rf .tmp_versions module.symvers modules.order

.tmp_versions .*.cmd *.o *.ko *.mod

.c//書寫makefile注意事項:1、在需要修改模組的名字時使用我們當前的這個形式但是需要注意的是,「 -objs 」是與我們的「 .c 」原始碼所對應的;「 -obj 」是與我們模組的新名字所對應的。

核心模組makefile分析:

首先在自己的模組中執行make之後,則進入我們自己寫的makefile中,首先判斷(k

erne

lrel

ease

)是否為

空,由於

(kernelrelease)是在linux核心原始碼頂層目錄下定義的,所以此時這個變數是為空的。直接執行else下面的語句:kerneldir=linux核心原始碼頂層makefile的目錄,pwd=當前makefile所在目錄。接下來看到「 modules: 」這個偽目標,此時它下面的命令無條件執行:make -c (k

erne

ldir

)表示進

入lin

ux原始碼

目錄下執

行它的頂

層mak

efie

,m= (pwd)表示執行完linux頂級目錄下的makefile之後,再回到(p

wd)目

錄下執行

該目錄下

的mak

efil

e。由於

此時(pwd)代表我們自己模組的makefile的路徑,所以在執行完linux原始碼下的目錄之後第二次回到的我們自己的makefile,不同的是此時的$(kernelrelease)是有值的,它代表核心發布版本資訊。所以ifneq條件是成立的,繼續執行下面的語句。直到此時為止,才是真正的開始編譯我們自己寫的模組。

Linux核心模組

核心模組 在整個啟動的過程中,是否能成功的驅動我們主句的硬體裝置,是核心完成的工作,而核心一般都是壓縮文件,在使用之前核心之前必須要將核心減壓到的記憶體中。為了應對日新月異的硬體,目前核心都具有可讀取模組化驅動程式的功能,也就是所謂的 modules模組化 所謂模組化。核心與核心模組放在 核心 bo...

Linux 核心模組

linux 核心模組程式結構 1 模組載入函式 2 模組解除安裝函式 3 模組許可證宣告 4 模組引數 5 模組匯出符號 6 模組作者等資訊宣告 模組載入函式 一般以 init 標識 在 linux 中,所有標識為 init 的函式如果直接編譯進核心,成為核心映象的一部分,在連線的時候都會放在 in...

linux核心模組

綜述 如今linux核心整體框架十分龐大,我們如果直接把所有所需的功能編譯進核心,會導致核心十分龐大,且在現有核心中我們無法對其增減。所以linux提供一種機制 模組。我們可以根據需要,對模組進行刪減。一 乙個linux核心模組主要由如下幾個部分組成 1 模組載入函式 當通過insmod或者modp...