在Linux环境下编译.ko
内核驱动文件(运行于本linux系统,非嵌入式),需要保证/lib/modules/xxx
的版本与内核版本保持一致,否则编译后的驱动无法运行!
1.更新内核版本及headers
如/lib/modules/xxx/build
文件夹缺失,需要进行此步骤。
命令如下:
uname -a # 获取当前内核版本
apt-cache search linux-image # 搜索相关版本
sudo apt-get install linux-image-6.0.0-kali6-amd64 # 更新内核
sudo apt-get install linux-headers-6.0.0-kali6-amd64 # 安装内核头文件
注:本机的Linux内核原版本为
6.0.0-kali3-amd64
,更新内核版本后重启,使用uname
命令可以看到内核版本发生了改变。
![在这里插入图片描述](https://img-blog.csdnimg.cn/912dff3e9d58444a85dc7c0089dcaf64.png)
安装linux-image-6.0.0-kali6-amd64
更新内核后,/lib/modules/
下会出现两个文件夹,分别是6.0.0-kali3-amd64
和6.0.0-kali6-amd64
。
只有在执行sudo apt-get install linux-headers-6.0.0-kali6-amd64
安装内核头文件后,6.0.0-kali6-amd64文件夹下才会出现build
文件夹。
2.编写并编译测试ko驱动文件
- 测试代码:first.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
// 当驱动被加载的时候,执行此函数
static int __init hello_init(void)
{
printk(KERN_ALERT, "welcome, walker!\n");
return 0;
}
// 当驱动被卸载的时候,执行此函数
static void __exit hello_exit(void)
{
printk(KERN_ALERT, "bye!\n");
}
// 版权声明
MODULE_LICENSE("GPL");
// 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。
module_init(hello_init);
module_exit(hello_exit);
Makefile文件
obj-m := first.o
KERNELDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *.mod.c *.order *.symvers
3.驱动的加载与卸载
生成first.ko文件后,执行如下命令:
sudo insmod first # 安装first.ko驱动模块
lsmod # 显示内核驱动模块列表
sudo rmmod first # 卸载该模块
dmesg # 打印printk输出的信息