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