terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2711回复:5

编译的内核模块和当前内核的版本号不一致该怎么办?

楼主#
更多 发布于:2004-02-16 16:32
各位大侠:
    我初写linux driver,我开始参照LDD写一个很简单得hello world程序(只是学会建立和安装一个module)。源码如下:
#define MODULE
#include<linux/module.h>
int init_module(void)
{
   printk("<1> Hello,world\n");
   return 0;
}
void clean_module(void)
{
   printk("<1>Goodbye world!\n");
}

编译采用:gcc -c hello.c
安装时采用:insmod ./hello.o
但是在运行安装命令后却出现错误提示“编译的内核模块和当前内核的版本号不一致”,请问改如何解决?
是我得头文件或预定义有问题还是编译命令有问题?
如何采用通用得makefile文件编译?
问题很简单,但还是恳请高手解决!
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-02-16 18:45
头文件有问题,严格来说应该使用与当前内核版本一致的头文件。

或者:
把include/linux/version.h(具体路径名忘记了)中跟版本有关的宏定义修改一下,改成与你当前内核版本匹配就可以了。

或者:
insmod -f ./hello.o

都可以解决这个问题。
terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-16 19:00
非常感谢您的答复!
我用-f选项后的确可一,但是却出现以下警告,而且没有显示信息(打印hello world!)很不爽,而且这样会影想模块运行吗?
谢谢!
[root@localhost terrace]# insmod -f ./hello.o
Warning: kernel-module version mismatch
        ./hello.o was compiled for kernel version 2.4.9-9
        while this kernel is version 2.4.18-14
Warning: loading ./hello.o will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Warning: loading ./hello.o will taint the kernel: forced load
Module hello loaded, with warnings

terrace
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2005-12-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-16 19:14
xdjm,我改了version.h,见下,但是还是出现那个问题.怎样才能不出现警告?
[root@localhost linux]# cat version.h
#include <linux/rhconfig.h>
#if defined(__module__smp)
#define UTS_RELEASE "2.4.18-14smp"
#elif defined(__module__BOOT)
#define UTS_RELEASE "2.4.18-14BOOT"
#elif defined(__module__bigmem)
#define UTS_RELEASE "2.4.18-14bigmem"
#elif defined(__module__debug)
#define UTS_RELEASE "2.4.18-14debug"
#else
#define UTS_RELEASE "2.4.18-14"
#endif
#define LINUX_VERSION_CODE 132114
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
[root@localhost linux]# insmod /home/terrace/hello.o
/home/terrace/hello.o: kernel-module version mismatch
        /home/terrace/hello.o was compiled for kernel version 2.4.9-9
        while this kernel is version 2.4.18-14.

以上为原来的version.h,现在改动.
[root@localhost linux]# vi version.h
[root@localhost linux]# vi version.h

以下为改动后的version.h

[root@localhost linux]# cat version.h
#include <linux/rhconfig.h>
#if defined(__module__smp)
#define UTS_RELEASE "2.4.9-9smp"
#elif defined(__module__BOOT)
#define UTS_RELEASE "2.4.9-9BOOT"
#elif defined(__module__bigmem)
#define UTS_RELEASE "2.4.9-9bigmem"
#elif defined(__module__debug)
#define UTS_RELEASE "2.4.9-9debug"
#else
#define UTS_RELEASE "2.4.9-9"
#endif
#define LINUX_VERSION_CODE 132114
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

再次运行!
[root@localhost linux]# insmod /home/terrace/hello.o
/home/terrace/hello.o: kernel-module version mismatch
        /home/terrace/hello.o was compiled for kernel version 2.4.9-9
        while this kernel is version 2.4.18-14.
[root@localhost linux]#

bobo_lei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2008-11-16
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望14点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-18 21:51
按照如下步骤,以后你编译的就不会说版本错误了:
cd /usr/include
rm -f linux
rm -f asm
rm -f scsi
ln -s /usr/src/linux-2.4/include/linux linux
ln -s /usr/src/linux-2.4/include/scsi scsi
ln -s /usr/src/linux-2.4/include/asm-i386 asm


^_^,试试吧,兄弟!!!
kernel_1998
驱动牛犊
驱动牛犊
  • 注册日期2004-02-19
  • 最后登录2004-10-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-19 13:55
Linux的loadable module的编译方法和普通的程序不一样。修改内核代码更不可取。
solution:
(1)试gcc -c -Wall _D__KERNEL___ _DMOUDLE -I/usr/src/linux/include -O2 -c -o hello.o hello.c
(2)LDD中对module的编译没有进行很好的分析,建议看Linux Loadable Kernel Module HOWTO
http://gnu.kookel.org/ftp/LDP/HOWTO/Module-HOWTO/
(3)到网上下ldd2的例子程序包
游客

返回顶部