内核源码中版本号详解(KERNEL_VERSION & KERNEL_VERSION)

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核源码中版本号详解(KERNEL_VERSION & KERNEL_VERSION)相关的知识,希望对你有一定的参考价值。

1、内核源码中版本的定义

VERSION = 2	#主版本号
PATCHLEVEL = 6	#主版本号
SUBLEVEL = 35	#更次的版本号
EXTRAVERSION = .7	#更更次的版本号
NAME = Yokohama

(1)内核的版本信息定义在内核源码顶层Makefile的开头;
(2)内核的版本号是分级的,分为主版本号、次版本号、更次的版本号······,越靠后的版本号代表内核的改变越小;

2、version.h文件

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

(1)version.h在include/linux/目录下,是自动生成的,具体生成的代码在Makefile中;
(2)LINUX_VERSION_CODE宏表示内核当前版本,KERNEL_VERSION宏是用来构成LINUX_VERSION_CODE宏的;

3、KERNEL_VERSION宏

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

(1)KERNEL_VERSION宏是用来构成内核版本号的,其中a是主版本号,b是次版本号,c是更次的版本号;
(2)a对应于Makefile中的VERSION变量,b对应PATCHLEVEL变量,c对应SUBLEVEL变量;

4、KERNEL_VERSION宏和LINUX_VERSION_CODE宏的联系

VERSION = 2	#主版本号
PATCHLEVEL = 6	#主版本号
SUBLEVEL = 35	#更次的版本号

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

(1)132643换算成16进制刚好是0x20623;
(2)0x20623 = (((2) << 16) + ((6) << 8) + (35));
(3)由上可得LINUX_VERSION_CODE = KERNEL_VERSION(VERSION, PATCHLEVEL, SUBLEVEL);

5、使用举例

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,35)
	······
#else
	······
;
#endif

在驱动代码中,因为内核的升级可能驱动中调用的函数接口发生了改变,为了兼容新旧的内核版本,在代码中添加条件编译来控制驱动调用的函数接口;

以上是关于内核源码中版本号详解(KERNEL_VERSION & KERNEL_VERSION)的主要内容,如果未能解决你的问题,请参考以下文章

在内核空间中获取完整的内核版本

Linux 内核编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

IoT嵌入式开发:Linux内核开发基础

centos 升级内核版本(源码)

Linux内核版本号关闭自动添加后缀