生成内核版本号头文件的方法 | 迟思堂工作室
A-A+

生成内核版本号头文件的方法

2014-09-20 12:20 GNU/Linux系统 暂无评论 阅读 5,601 次

前段时间,公司买了很多块不同厂家的intel的板子。有同事编译不了网卡驱动,我过去看了一下,原来是因为内核版本号的头文件(version.h)没有内容,导致没有定义LINUX_VERSION_CODE,就编译不通过。于是上网找了点资料,学习了一下。

编译驱动是需要有内核的头文件的(毕竟驱动还是属于内核空间的东西),而很多程序——包括用户空间的应用程序和内核空间的驱动,是通过是否有内核版本号来确定的是哪一层的程序,于是,就会去包括内核版本号的头文件。内核源码(也可以说是内核头文件)在/usr/src/<KERNEL VERSION>目录(其中KERNEL VERSION根据不同的发行版和内核版本而名称有所不同),另外,/lib/modules//build目录是链接到前面的目录的,所以使用这两个目录都没有问题。内核版本号的头文件即为:/usr/src//include/linux/version.h文件。

比如,有一个板子上的系统内核源码路径是/usr/src/kernels/3.8.0-1/lib/modules/3.8.0-1/build链接到这个目录,而在我的虚拟机的那个系统,内核源码目录是/usr/src/linux-headers-2.6.32-21/lib/modules/2.6.32-21-generic/build链接这那个目录。

前面提到的编译错误,就是因为version.h文件为空(注意,这个文件的确存在,但是却没有内容,是空的),那么我是怎么解决的吗?首先想到的是往这个文件添加内容,经过查找资料,添加的内容如下:

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

内核版本是通过KERNEL_VERSION宏来确定的,如当前版本为3.8.0,则实际数值就是0x030800,但是,如果写这个十六进制,编译还是不通过,要换成十进制,即是198656,这就是上面的第一个的数值的由来。修改后,编译就没问题了。

后来又搜索了一下,发现是可以直接通过make来生成头文件的,在内核源码目录(/usr/src/)执行:

make include/linux/version.h

就能生成version.h文件了。下面在我的虚拟机ubuntu系统执行的结果:

# /lib/modules/2.6.32-21-generic/build$ cat include/linux/version.h #define LINUX_VERSION_CODE 132640 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

生成的头文件中的版本号数值换成版本号是2.6.20,与实际的不相同,至于为什么,暂时还没有研究。

PS:
1、我能说因为这个网卡驱动的事,和某板子厂家打了好多次电话来告诉他们怎么解决错误的吗?
2、我能说那个厂家的网卡驱动用不起来是因为板子的bios有问题而不是系统和驱动的问题吗?
3、我能说为了这事花费了2天时间,又是换系统,又是换板子来确定问题所在吗?

李迟,2014年9月20日周六中午



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言