linux内核驱动的兼容性:内核版本宏KERNEL_VERSION

文章介绍了如何处理内核升级导致的驱动不兼容问题,通过分析内核版本定义的头文件和使用KERNEL_VERSION宏来判断内核版本。作者编写了一个测试驱动,验证了KERNEL_VERSION宏的用法,并展示了如何根据内核版本调用不同的API函数以实现兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

随着内核的升级,内核驱动会不兼容,为了让驱动能够兼容新内核和旧内核,需要判断内核的版本。

一 内核版本定义的头文件

下面是5.15版本内核的./include/generated/uapi/linux/version.h文件的内容,该文件是内核编译后自动生成的。

#define LINUX_VERSION_CODE 331591
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 5
#define LINUX_VERSION_PATCHLEVEL 15
#define LINUX_VERSION_SUBLEVEL 71

下面是4.1版本内核的./include/generated/uapi/linux/version.h文件的内容

#define LINUX_VERSION_CODE 262415
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

两个文件相同的部分是KERNEL_VERSION宏和LINUX_VERSION_CODE宏。

二 测试验证

写测试驱动,输出KERNEL_VERSION(5,15,71)的值,根据ldd3介绍的KERNEL_VERSION(5,15,71)的值是331591。

测试代码:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/version.h>


#define DEBUG_CT(format, ...) printk("%s:%d "format"\n",\
	__func__,__LINE__,##__VA_ARGS__)

static int __init ct_init(void)
{
#if KERNEL_VERSION(5,15,71) == LINUX_VERSION_CODE
	DEBUG_CT("new version 5");
#else
	DEBUG_CT("old version4");
#endif
	DEBUG_CT("KERNEL_VERSION(5,15,71) = %d",KERNEL_VERSION(5,15,71));
	DEBUG_CT("KERNEL_VERSION(4,1,15) = %d",KERNEL_VERSION(4,1,15));

	
	return 0;
}
static void __exit ct_exit(void)
{
	DEBUG_CT("bye bye");
}

module_init(ct_init);
module_exit(ct_exit);
MODULE_LICENSE("GPL");

Makefile文件:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
#KERN_DIR = /home/lkmao/imx/linux/linux-imx
KERN_DIR = /big/imx/linux-imx-lf-5.15.y

FILE_NAME=csi_timer
obj-m += $(FILE_NAME).o

all:
	make -C $(KERN_DIR) M=$(shell pwd) modules

cp:
	sudo scp $(FILE_NAME).ko root@192.168.0.3:/home/root/
.PHONY:clean
clean:
	make -C $(KERN_DIR) M=$(shell pwd) clean

运行结果:

root@localhost:~# insmod csi_timer.ko
[ 1295.792186] ct_init:12 new version 5
[ 1295.795910] ct_init:16 KERNEL_VERSION(5,15,71) = 331591
[ 1295.801072] ct_init:17 KERNEL_VERSION(4,1,15) = 262415
root@localhost:~#

验证OK。

三 版本区分

可以利用下面的代码根据linux内核版本号的不同调用不同的API函数:在内核源码中所有KERNEL_VERSION可以找到很多区分版本的示例代码。

#if LINUX_VERSION_CODE < KERNEL_VERSION(5,15,0)
....//5.15版本 之前的API调用
#else 
....//5.15版本 之后的API调用
#endif 
 

小结

        版本,版本。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值