trureno
驱动牛犊
驱动牛犊
  • 注册日期2002-12-04
  • 最后登录2005-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2358回复:9

insmod出现版本不匹配,各种方法试了都不行

楼主#
更多 发布于:2004-04-10 17:15
#define __NO_VERSION__
#define __KERNEL__
#define MODULE

#include <linux/kernel.h>
#include <linux/module.h>
                                                          
int init_module(void)      
{ printk("<1>Hello, world\n"); return 0; }
void cleanup_module(void)  
{ printk("<1>Goodbye cruel world\n"); }
MODULE_LICENSE("GPL");

能想到的都加了,但insmod的时候总是不行,只能强行安装(insmod -f )
是不是我还漏了什么,有没有其他办法
rainyss
驱动牛犊
驱动牛犊
  • 注册日期2004-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-11 12:02
不是你漏了,LINUX内核一直有这毛病,编译出来报告版本不对,我查过原因,是因为make dep的问题,没修改/usr/src/linux/include/linux/version/的一个很重要的文件,名字忘了,叫modues什么的,符号名全在里面.我以前的解决办法是自已写了个程序,从/proc/ksysb文件里取出符号名,写到那个文件里去.当然,不能完说是make dep的错,新手在做编译前常常漏了如下工作:
make include/linux/versioh.h
make dep
另外,你的内核配置,也就是make menuconfig里的那些选项,最好和现在运行的KERNEL一至.因为我就碰到过,将SCSI去掉后,编译出来的就不能用了,加上就好了.
rainyss
驱动牛犊
驱动牛犊
  • 注册日期2004-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-11 12:04
唉唉唉,没看清楚,你第一句写的是什么意思啊?你没看明白就加,当然不能加载啦.那NO_VERSION的意思是编译出来的模块名不带版本信息,而你的内核却带该信息,先报这个错误解决了再看我前面那个贴子.
000
000
驱动牛犊
驱动牛犊
  • 注册日期2002-07-29
  • 最后登录2004-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-11 16:21
好象也不行,我在radhat9下不成功, insmod加了-f参数加载进去了,但是好象根本就没运行的...-
rainyss
驱动牛犊
驱动牛犊
  • 注册日期2004-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-11 22:50
我建议你先取一个LINUX自带的驱动程序,例如rd.c,将它编译出来,如果不能正常加载,就说明是编译的过程还有问题.
成功后,你删了编译出来的rd.o,重做一次make modules,将输入重定向到文件中,然后到里面去找到编译rd.c的那一行,就得到了一个正确的编译命令行.你会发现该行命令比你用的复杂得多.不错,这就是你漏掉的东西.接下来,把rd.c里的内容删空,仅保留include,macro和init()这些,这样你就得到了一个模板,以后要做什么驱动就用这个模板扩展.
zhouai
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2006-04-21
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-15 21:30
#include <linux/kernel.h>
#include <linux/module.h>
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

int init_module(void)
{
MODULE_LICENSE(\"GPL\");
printk(\"Hello,World!\\n\");
return 0;
}

void cleanup_module(void)
{
printk(\"Goodbye cruel world \\n\");
}
makefile文件如下:
CC=gcc
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I /usr/src/linux-2.4.20-8/include
hello.o:hello.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c hello.c

然后make
insmod
就行我试过!
rainyss
驱动牛犊
驱动牛犊
  • 注册日期2004-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-16 20:02
#define __NO_VERSION__
#define __KERNEL__
#define MODULE

这几句有问题
abutter
驱动牛犊
驱动牛犊
  • 注册日期2002-12-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-25 09:54
我也是初学,不过看了很多帖子之后解决了这样的问题,帖出来帮一下忙。

/* FILE   : demo.c
 *
 * USAGE  : How to write module driver
 *
 * AUTHOR : Bismar@HUST
 */

#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif

#include <linux/fs.h>
#include <linux/kernel.h>

#define  __NO_VERSION__
#include <linux/module.h>
#include <linux/version.h>

char kernel_version[] = UTS_RELEASE;


#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif


#ifdef CONFIG_SMP
#define __SMP__
#endif


/* Initialize the module */
int __init
init_device (void)
{
  printk (KERN_DEBUG \"Hello,Linux driver world! \\n\");

  return 0;
}


/* Cleanup - undid whatever init_module did */
void __exit
cleanup_device (void)
{
  printk (KERN_DEBUG \"Goodbye cruel world !\\n\");
}


/* Init and exit function decleare */
module_init (init_device);
module_exit (cleanup_device);


/* Declare licence to avoid warnings */
MODULE_LICENSE (\"GPL\");

下面是makefile的内容,注意要修改一下include的路径:

#
# makefile for demo
#
# Bismar@HUST

CC = gcc

CINCLU = /usr/src/linux-2.4/include

CFLAGS = -D__KERNEL__ -DMODULE -DLINUX -c -O2 -Wall -I$(CINCLU)

all: demo.o

demo.o:demo.c
$(CC) $(CFLAGS) $<

clean:
rm -f *.o

测试平台:redhat9.0,内核版本linux-2.4.20-8,不过只要修改了include的路径,版本是无关紧要的。
hezhenwei
驱动牛犊
驱动牛犊
  • 注册日期2003-04-16
  • 最后登录2004-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-26 08:52
在/usr/src/你的linux内核目录下的
Makefile 文件里面
第四行,改掉。然后再make。你再编译看看
Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
9楼#
发布于:2004-04-26 08:55
换一次kernel,就要make一次!
游客

返回顶部