今天开始跟着B站学习Linux内核编程,打开一个新世界!
视频地址:https://www.bilibili.com/video/BV1QU4y1n7YD?spm_id_from=333.999.0.0
环境搭建:
1.查看本机的Linux信息
image.png
2.安装对应的包
image.png
3.查看安装内容
image.png
4.build是实际的资源指向(makefile中要用到)
1.目标:在Linux内核中添加一个模块,该模块的用途是打印两条信息
2.具体实现:
//在~/Desktop/Demo/20220410 目录下创建Hello.c文件实现具体功能:
//#include<linux/init.h>
#include<linux/module.h>
static int __init hello_init(void){
printk(KERN_INFO "HELL MY FIRST MODULE TEST");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_INFO "GOODBYE MY FIRST MODULE TEST");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("KGZ");
MODULE_VERSION("V1.0");
//在~/Desktop/Demo/20220410 目录下创建Makefile文件用于编译:
CONFIG_MODULE_SIG=n
KERNELDIR ?= /lib/modules/$(shell uname -r)/build/
//KERNELDIR ?= /lib/modules/4.15.0-142-generic/build/
PWD := $(shell pwd)
obj-m += Hello.o //注意这里是Hello,要跟源文件名保持一致,否则编不过
all:
make -C /lib/modules/4.15.0-142-generic/build/ M=$(shell pwd) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers
3.编译
image.png
4.编译完成之后加载模块
sudo insmod Hello.ko
5.查看模块是否加载成功
image.png
6.查看打印信息
image.png
7.卸载模块
sudo rmmod Hello
8.清空dmesg信息
sudo dmesg -c
实践中遇到的坑:
1.Makefile中obj-m后面的文件名要和文件夹下的文件名保持一致,否则会编不过
2.第一次加载模块报错:
module verification failed: signature and/or required key missing - tainting kernel
//修复方法参考:https://blog.csdn.net/caoyahong114/article/details/51744748