当前位置: 技术问答>linux和unix
<<linux设备驱动程序>>中的一个关于编译内核问题
来源: 互联网 发布时间:2015-09-13
本文导语: 中的一个关于编译内核问题 看linux设备驱动程序一书,第一个例子, //hello.c #define MODULE #include int init_module(void) { printk("Hello worldn");return 0;} void cleanup_module(void) { printk("Goodbye cruel worldn");} 我的系统...
中的一个关于编译内核问题
看linux设备驱动程序一书,第一个例子,
//hello.c
#define MODULE
#include
int init_module(void)
{ printk("Hello worldn");return 0;}
void cleanup_module(void)
{ printk("Goodbye cruel worldn");}
我的系统用的是redhat 9,
gcc -o hello.c
[root@localhost /]# insmod ./hello.o
./hello.o: kernel-module version mismatch
./hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8.
按照书上的解释,我就重新编译了一下内核。中间有几个问题请
教各位,谢谢
书上说要去掉版本控制的选项。我在配置的时候只发现:
Loadable module support 里面的
Set version information on all module symbols:可能是。于是
就把它改为“否"
不知道改这个对不对。
然后用了几个make都很顺利。然后把生成的bzImage和
Syetem.map也按照我看的文章说的移动了位置。最后一步关于
grub.conf的更改有一点疑惑,就是我的内核编译是在原版本上
做的。这个文件还用改吗。
最后启动后,那个hello的错误还有,现在不能确定是配置错误还
是编译内核的错误。恳请大家指点。
我是一个新手,刚研究驱动,不知道是不是所有的关于内核模块
的编程前都得先做这个过程吗?谢谢
看linux设备驱动程序一书,第一个例子,
//hello.c
#define MODULE
#include
int init_module(void)
{ printk("Hello worldn");return 0;}
void cleanup_module(void)
{ printk("Goodbye cruel worldn");}
我的系统用的是redhat 9,
gcc -o hello.c
[root@localhost /]# insmod ./hello.o
./hello.o: kernel-module version mismatch
./hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8.
按照书上的解释,我就重新编译了一下内核。中间有几个问题请
教各位,谢谢
书上说要去掉版本控制的选项。我在配置的时候只发现:
Loadable module support 里面的
Set version information on all module symbols:可能是。于是
就把它改为“否"
不知道改这个对不对。
然后用了几个make都很顺利。然后把生成的bzImage和
Syetem.map也按照我看的文章说的移动了位置。最后一步关于
grub.conf的更改有一点疑惑,就是我的内核编译是在原版本上
做的。这个文件还用改吗。
最后启动后,那个hello的错误还有,现在不能确定是配置错误还
是编译内核的错误。恳请大家指点。
我是一个新手,刚研究驱动,不知道是不是所有的关于内核模块
的编程前都得先做这个过程吗?谢谢
|
在内核源代码中include/linux/version.h头文件中的UTS_RELEASE宏,定义了一个版本信息,
由它来指定我们编译的内核的版本信息,也就是uname -r 得到当前运行的内核版本信息。
而我们编译的模块时,也要指定版本信息,也是通过这个宏来指定的,你想为不同的内核版本
编译模块,就要包含相应内核源码中的该头文件,以保证你的模块可以在该内核中运行。
像你这种情况,不重新编译内核也可以,只要你把/usr/src/linux-2.4.20-8/inclue/linux/version.h
中UTS_RELEASE宏改成"2.4.20-8"就可以了,要是我没记错的话原来的是"2.4.20-8-custom"
要想在当前运行的模块中运行,那么
由它来指定我们编译的内核的版本信息,也就是uname -r 得到当前运行的内核版本信息。
而我们编译的模块时,也要指定版本信息,也是通过这个宏来指定的,你想为不同的内核版本
编译模块,就要包含相应内核源码中的该头文件,以保证你的模块可以在该内核中运行。
像你这种情况,不重新编译内核也可以,只要你把/usr/src/linux-2.4.20-8/inclue/linux/version.h
中UTS_RELEASE宏改成"2.4.20-8"就可以了,要是我没记错的话原来的是"2.4.20-8-custom"
要想在当前运行的模块中运行,那么
|
呵呵,其实你完全可以不用编译内核的。你可以使用命令:gcc -o hello.c -I/usr/src/linux-2.4.20-8/include来完成编译。具体的编译内核的过程我没有试验过。
|
参考这个帖子
http://community.csdn.net/Expert/topic/3794/3794611.xml?temp=.737713
现在Linux内核都2.6.xxx了redhat9已经过时,最好换高版本的Linux。
http://community.csdn.net/Expert/topic/3794/3794611.xml?temp=.737713
现在Linux内核都2.6.xxx了redhat9已经过时,最好换高版本的Linux。