在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-/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.oKERNELDIR := /lib/modules/`uname -r`/buildPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *.mod.c *.order *.symvers
3.驱动的加载与卸载
生成first.ko文件后,执行如下命令:
sudo insmod first# 安装first.ko驱动模块lsmod# 显示内核驱动模块列表sudo rmmod first# 卸载该模块dmesg# 打印printk输出的信息