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!

 

posted @ 2022-12-10 16:36  Parker_Zhou  阅读(522)  评论(0)    收藏  举报