生成内核版本号头文件的方法
来源:互联网 发布: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有问题而不是系统和驱动的问题吗?
编译驱动是需要有内核的头文件的(毕竟驱动还是属于内核空间的东西),而很多程序——包括用户空间的应用程序和内核空间的驱动,是通过是否有内核版本号来确定的是哪一层的程序,于是,就会去包括内核版本号的头文件。内核源码(也可以说是内核头文件)在/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
- 生成内核版本号头文件的方法
- Android获取系统内核版本的方法
- Linux查看内核(Kernel)版本的方法
- 查看文件的glibc版本要求和内核版本要求
- linux查看内核版本和发行版本的方法
- 内核版本察看方法
- 3.x版本内核中platform_device的生成
- 3.x版本内核中platform_device的生成
- Linux内核Makefile编译生成内核目标文件的过程
- Linux内核Makefile编译生成内核目标文件的过程
- Linux内核Makefile编译生成内核目标文件的过程
- 生成Unicode版本的Ini文件
- VC 程序Release版本的生成方法
- 生成jar文件的方法
- 生成jar文件的方法
- 生成jar文件的方法
- 生成jar文件的方法
- 生成资源文件的方法
- 【Python Challenge-5】peak
- constvar: 界面配置说明
- Struts2 Hibernate Spring easyUI项目例子
- STL源码剖析——序列容器之deque
- 如何创建Html下拉框和js及jsp如何获取下拉框里的内容
- 生成内核版本号头文件的方法
- I/O复用:select和poll函数(一)
- 一个学渣的2014找工作之路
- 设置apache的网页根目录 - 本地repo源的局域网设置方法
- 鸟哥的Linux私房菜 基础学习篇学习计划
- 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正
- TCP协议疑难杂症全景解析(强悍的总结)
- 莫名其妙多了6W访问量
- 《数据结构》第二章 线性表 知识总结导图