linux 内核模块的编写和安装
文章目录
1. 查看自己系统的内核版本号:
uname -r
2.centos 需要下载安装源码包
uname -r 是你的系统的版本号,比如我的是6.2.7-1.el7.elrepo.x86_64,那么我需要下载这个包kernel-ml-devel-6.2.7-1.el7.elrepo.x86_64.rpm
下载网址: ELRepo | HomePage
找到你对应的rpm安装包,我这里是
https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.2.7-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.2.7-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-devel-6.2.7-1.el7.elrepo.x86_64.rpm
安装后位于:/usr/src/kernels/6.2.7-1.el7.elrepo.x86_64,这个路径后面Makefile中会用到。
3. 升级GCC
参考这篇博客
将gcc 4.7升级到gcc 9.3
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9
bash需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。如果要长期使用gcc 9.3的话:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
4. 编写内核模块helloworld.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int __init lkm_init(void)
{
printk("Hello World![--ed3276--]2023-03-17\n");
return 0;
}
static void __exit lkm_exit(void)
{
printk("Goodbye!\n");
}
module_init(lkm_init);
module_exit(lkm_exit);
MODULE_LICENSE("GPL");
5. 编写Makefile文件
obj-m:=helloworld.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH:=/usr/src/kernels/$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
6. 编译make
[zhangxiuli@special-hats-2 Mooc]$ make
make -C /usr/src/kernels/6.2.7-1.el7.elrepo.x86_64 M=/home/zhangxiuli/Mooc modules
make[1]: Entering directory `/usr/src/kernels/6.2.7-1.el7.elrepo.x86_64'
CC [M] /home/zhangxiuli/Mooc/helloworld.o
MODPOST /home/zhangxiuli/Mooc/Module.symvers
CC [M] /home/zhangxiuli/Mooc/helloworld.mod.o
LD [M] /home/zhangxiuli/Mooc/helloworld.ko
make[1]: Leaving directory `/usr/src/kernels/6.2.7-1.el7.elrepo.x86_64'
7. 安装内核模块
sudo insmod helloworld.ko
8. 查看安装后的内核模块,可以看到helloworld
lsmod
9. 卸载内核模快
sudo rmmod helloworld
10. 查看内核模块中打印
dmesg
9. 卸载内核模快
sudo rmmod helloworld
10. 查看内核模块中打印
dmesg