LINUX學習筆記21 核心模組

2021-09-30 09:09:27 字數 4169 閱讀 3340

(一)   linux「核心模組」的開發:

1.         如何使用需要的元件

a)         把所有的元件都編譯進核心檔案:

i.              缺陷1:核心檔案過大

ii.              缺陷2:如果要新增或刪除某個元件,需要重新編譯整個核心

b)         使用「核心模組」的機制:

i.              模組本身並不被編譯進核心檔案

ii.              以根據需求,在核心執行期間動態的安裝或解除安裝。

2.         程式結構:例:vi hello.c

a)         #include

b)         #include 標頭檔案

c)         static int hello_init(void)

d)        

h)         static void hello_exit(void)

i)          

l)           module_init(hello_init);       模組載入函式(必需)

m)       module_exit(hello_exit);      模組解除安裝函式(必需)

3.         模組的編譯:使用makefile,基本格式都差不多,這裡不能使用gcc

a)         編寫單檔案的makefile:注意m大寫

ifneq ($(kernelrelease),)     第1次變數為空,執行else;

obj-m := hello.o            目標名,需要根據情況修改

else

kdir := /lib/modules/2.6.18-53.el5/build  核心源**路徑:根據情況修改

all:

make –c $(kdir)  m=$(pwd)modules  –c進入目錄,使用目錄中的makefile來編譯當前目錄下的模組**,再次進入該**,執行if真

clean:

rm –f *.ko *.o *.mod.o *.mod.c *.symvers

endif

i.              報錯:missing separator  缺少分隔符:注意分隔符,格式是否正確

ii.              報錯:沒有找到makefile檔案,檢視m是否大寫,檔名寫對沒

b)         編寫多檔案的makefile:需要改乙個地方

i.              obj-m := hello.o

ii.              hello-objs := main.o add.o

4.         安裝與解除安裝

a)         載入 insmod :insmod hello.ko

b)         解除安裝 rmmod :rmmod hello

c)         檢視 lsmod

d)         載入 modprobe (modprobe hello): modprobe 如同 insmod, 也是載入乙個模組到核心。它的不同之處在於它會根據檔案/lib/modules/<$version> /modules.dep來檢視要載入的模組, 看它是否還依賴於其他模組,如果是,modprobe 會首先找到這些模組, 把它們先載入到核心。

5.         注意:應用程式是從頭(main)到尾執行任務,執行結束後從記憶體中消失。核心模組則是先在核心中註冊自己以便服務於將來的某個請求,然後它的初始化函式結束,此時模組仍然存在於核心中,直到解除安裝函式被呼叫,模組才從核心中消失。

6.         模組可選資訊:

a)         許可證申明:巨集module_license用來告知核心, 該模組帶有乙個許可證,常用

」gpl」 :module_license(」gpl」);

b)         作者申明(可選):module_author(「simon li");

c)         模組描述(可選):module_description("hello world module");

d)         模組版本(可選):module_version("v1.0");

e)         模組別名(可選):module_alias("a ****** module");

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

i.              module_param(name,type,perm):module_param(a,int, s_irugo);

ii.              name是模組引數的名稱,

iii.              type是這個引數的型別:bool:布林型 int:整型 charp:字串型

iv.              perm是模組引數的訪問許可權。

1)         s_irugo:任何使用者都對/sys/module**現的該引數具有讀許可權

2)         s_iwusr:允許root使用者修改/sys/module**現的該引數

v.              例:static int age=10;

vi.                  module_param(age,int, s_irugo);

7.         核心符號匯出:

a)         作用:當多個模組有依賴時,需要把被依賴模組中用的的符號匯出,這樣其它的模組才能用它。

b)         /proc/kallsyms 記錄了核心中所有匯出的符號的名字與位址。

c)         方法:在檔案末尾加上:export_symbol(符號名)

d)         export_symbol_gpl(符號名):其中export_symbol_gpl只能用於包含gpl許可證的模組。

8.         常見問題:版本不匹配

a)         使用 modprobe  --force-modversion 強行插入

b)         確保編譯核心模組時,所依賴的核心**版本等同於當前正在執行的核心。

c)         *可通過uname –r 察看當前執行的核心版本

9.         printk與printf對比

a)         printk在核心中使用,printf在應用程式中使用

b)         printk允許根據嚴重程度,通過附加不同的「優先順序」來對訊息分類。按照優先順序遞減的順序分別是:

i.              作用:控制在什麼情況下列印,數字越小,級別越高

ii.              kern_emerg    「<0>」用於緊急訊息,常常是那些崩潰前的訊息。

iii.              kern_alert    「<1>」需要立刻行動的訊息。

iv.              kern_crit       「<2>」嚴重情況。

v.              kern_err       「<3>」錯誤情況。

vi.              kern_warning   「<4>」有問題的警告

vii.              kern_notice    「<5>」正常情況,但是仍然值得注意

viii.              kern_info      「<6>」資訊型訊息

ix.              kern_debug     「<7>」用作除錯訊息

x.              沒有指定優先順序的printk預設使用default_message_loglevel優先順序,它是乙個在kernel/printk.c中定義的整數。在2.6.29核心中#define default_message_loglevel 4

xi.              控制台優先順序配置:檔案/proc/sys/kernel/printk

檔案中有4個數字:6 4 1 7

分別表示下面的優先順序:

console_loglevel     純字元控制台優先順序

default_message_loglevel  預設訊息優先順序

minimum_console_level

default_console_loglevel

只有訊息優先順序高於控制台優先順序時,才能把訊息列印到控制台上

查詢那些沒有被列印出的語句:vi /var/log/messages

Linux學習筆記 核心模組

模組 是linux高效利用微核心,同時不會降低系統效能與優點的一種方法。幾乎linux核心的每個高層元件 檔案系統 裝置驅動 網路,都可以作為模組進行編譯。linux的發布版,充分使用模組方式全面地支援多種品牌型號的硬體。但在某個計算機上只會有效載入其中乙個驅動程式。這樣核心就不會因為裝載那些數以百...

Linux核心驅動模組學習

ko檔案在是elf excutable and link format 格式,是一種可重定位的目標檔案。在編譯驅動模組時,我們在makefile中用obj m o來指定生成核心驅動模組檔案,即.ko檔案。首先insmod會通過檔案系統將ko讀到使用者空間的一塊記憶體中,然後執行系統呼叫sys ini...

核心模組筆記

1 解壓核心原始碼到目錄檔案 tar xjvf linux 2.6.22.6.tar.bz2 c home guoqian test4 1 1 cd home guoqian test4 1 1 linux 2.6.22.6 make distclean 2 配置檔案 cp boot config ...