1. 程式人生 > 其它 >ubuntu核心模組編譯

ubuntu核心模組編譯

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 static
void __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!