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

来源:互联网 发布:c语言37个关键字 编辑:程序博客网 时间:2024/05/02 02:13
前段时间,公司买了很多块不同厂家的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日周六中午


本文来自迟思堂工作室,固定链接:http://www.latelee.org/using-gnu-linux/way-to-generate-linux-version.html

0 0
原创粉丝点击