(一) 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 ...