ubuntu核心模組編譯
阿新 • • 發佈:2022-12-10
1、hello.c:
1 #include<linux/module.h> 2 #include<linux/kernel.h> 3 #include<linux/init.h> 4 MODULE_LICENSE("GPL"); 5 //__init是屬性標誌,意思是將函式放入.init.txt的輸入段,該段在核心啟動完畢後被釋放 6 static int __init kmod_init(void) 7 { 8 printk(KERN_ALERT "Hello World!\n"); 9 return 0; 10 } 11 staticvoid __exit kmod_cleanup(void) 12 { 13 printk(KERN_ALERT "Bye World!\n"); 14 } 15 module_init(kmod_init); 16 module_exit(kmod_cleanup); 17 MODULE_AUTHOR("ubuntu-mod-tester"); 18 MODULE_DESCRIPTION("hello");
2、Makefile:
1 obj-m := hello.o 2 KERNELBUILD :=/lib/modules/$(shell uname -r)/build 3 default: 4 make -C $(KERNELBUILD) M=$(shell pwd) modules 5 clean: 6 rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions
Makefile複製到檔案中後,將第4行和第6行開頭的空格要修改為tab,否則編譯會出錯。
-C選項將工作目錄轉到$(KERNELBUILD)指定的目錄下,該目錄下有核心頂層的Makefile;
M=選項是把當前路徑,傳遞到核心頂層的Makefile,要求在建立核心模組前,回到指定的路徑。
3、編譯:
#sudo make
4、載入模組:
#sudo insmod ./hello.ko
5、解除安裝模組:
#sudo rmmod ./hello
6、檢視核心列印:
#dmesg
7、顯示如下:
1 [10220.986528] hello: module verification failed: signature and/or required key missing - tainting kernel 2 [10220.987639] Hello World! 3 [10244.817856] Bye World!