Linux內核紛繁複雜,知識點多如牛毛,令人望而卻步。萬事開頭難,所以開好頭很重要。下面舉一個Linux編程的小例子,以消除新手對Linux內核的恐懼。
一、準備操作Linux作業系統:
最簡單的方式是安裝Linux虛擬機或者使用Docker。我的測試環境是一臺CentOS7虛擬機,版本如下:
uname -r
3.10.0-1062.9.1.el7.x86_64二、安裝內核開發包
yum install kernel-devel三、編寫hellworld模塊
#include <linux/module.h>
static int __init hello_init(void) {
printk("init...\n");
return 0;
}
static void __exit hello_exit(void) {
printk("end...\n");
}
module_init(hello_init);
module_exit(hello_exit);定義了兩個函數:hello_init和hello_exit,並被兩個宏分別調用。當使用insmod命令加載內核模塊時,hello_init會被調用,當使用rmmod命令卸載模塊時,hello_exit會被調用。
以上調用規則是Linux內核模塊編程的標準格式。
四、編寫Makefile文件
obj-m += test.o
test-y = main.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) cleanobj-m表示該文件作為模塊編譯,模塊的名稱是test。test-y表示名稱是test的模塊依賴的文件。
五、編譯內核模塊
make
make -C /lib/modules/3.10.0-1062.9.1.el7.x86_64/build M=/home/kali/kernel/m1 modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1062.9.1.el7.x86_64'
CC [M] /home/kali/kernel/m1/main.o
LD [M] /home/kali/kernel/m1/test.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/kali/kernel/m1/test.mod.o
LD [M] /home/kali/kernel/m1/test.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1062.9.1.el7.x86_64'當前模塊下的文件內容:
main.c main.o Makefile modules.order Module.symvers test.ko test.mod.c test.mod.o test.o六、加載內核
insmod test.ko
dmesg
[2619842.844016] init...七、卸載內核
rmmod test
dmesg
[2619842.844016] init...
[2619847.829591] end...通過dmesg命令,可以看到內核分別列印了hello_init和hello_exit輸出的信息。
小結
上述代碼為了展示內核模塊的編寫過程,對代碼進行了最大限度的精簡。通過上述操作,我們可以在內核空間對內核提供的函數進行測試。