QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1002|回复: 10

看linux设备驱动程序一书问题

[复制链接]
发表于 2005-3-7 09:14:23 | 显示全部楼层 |阅读模式
看linux设备驱动程序一书,第一个例子,
hello world

//hello.c

#define MODULE
#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");}

我的系统用的是redhat 9,
gcc -c hello.c
没有任何问题,但是下面却出现这样的问题,是怎么一会事呀,
[root@localhost /]# insmod ./hello.o
./hello.o: kernel-module version mismatch
./hello.o was compiled for kernel version 2.4.28
while this kernel is version 2.4.20-8.

按照书上说的我在程序里加了 #define __NO_VERSION__,都没有用,我是装了redhat9后自己重新编译使用2。4。28的内核,请教是不是头文件问题,怎么把头文件路径指向这个新内核的?还有<<linux设备驱动程序>>里的例子或函数接口是不是都过时了,我看好多都用不了,像kerneld.h这个文件根本就没有;current这个变量也没有(看sched.h里)。谢谢!
 楼主| 发表于 2005-3-7 10:18:25 | 显示全部楼层
[root@localhost /]# gcc -I/usr/src/linux-2.4/include -D __KERNEL__ -c modt.c
[root@localhost /]# insmod modt.o
Warning: loading modt.o will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted
modules
Module modt loaded, with warnings
[root@localhost /]# gcc -I/usr/src/linux-2.4/include -c modt.c
[root@localhost /]# insmod modt.o
insmod: a module named modt already exists
[root@localhost /]# rmmod modt.o
rmmod: module modt.o is not loaded
回复

使用道具 举报

 楼主| 发表于 2005-3-7 15:16:22 | 显示全部楼层
我查看/proc/modules文件,显示 modt 812 0(unused)
可是这又删不掉,我修改程序编译的新模块也insmod不了,没法试,请教怎么办,谢谢!!
回复

使用道具 举报

发表于 2005-3-8 17:56:57 | 显示全部楼层
这个问题google一下。
回复

使用道具 举报

发表于 2005-3-15 00:27:37 | 显示全部楼层
看一下这个,可能会对你有用,
http://blog.blogchina.com/day.16308.20041215.html
是我刚搜索到的

我在debian下编译时候都出现问题了,也没有解决
明天再搞~~~
回复

使用道具 举报

发表于 2005-3-21 10:35:45 | 显示全部楼层
Warning: loading modt.o will taint the kernel: no license
出现这种情况,加多一句MODULE_LICENSE("GPL");

rmmod的时候,后缀.o是不用带的,直接是rmmod modt即可

对于kernel mismatch的问题,解决方法:
1。insmod -f   xxx.o就可以了,强行加载;
2。修改/usr/include/linux/version.h文件。把里面define的内核版本换成你现在的内核版本。

这样就不会出现讨厌的warning啦~~~

Enjoy!
回复

使用道具 举报

发表于 2005-3-22 21:20:53 | 显示全部楼层
我现在的系统是fedora 3 2.6.11的内核,我要写的驱动程序将用于2.4.20.18的内核上,我能否在装一个redhat 9 的核呢?我试过,好像不行.
回复

使用道具 举报

发表于 2005-3-23 10:11:42 | 显示全部楼层
我现在也在看这本书,我用的也是REDHAT9.0.
是编译时候的问题。
回复

使用道具 举报

发表于 2005-3-23 23:02:51 | 显示全部楼层
[quote:5e4765fa01="jc526"]我现在的系统是fedora 3 2.6.11的内核,我要写的驱动程序将用于2.4.20.18的内核上,我能否在装一个redhat 9 的核呢?我试过,好像不行.[/quote]

重新编译一个rh9的2.4.20的内核启动不行吗
回复

使用道具 举报

发表于 2005-3-24 09:50:22 | 显示全部楼层
问题还是没解决,就算是强行挂载,也不好用,虽然可能挂上了,但还是不好用!
[root@localhost jackie]# insmod -f test.o
Warning: loading test.o will taint the kernel: forced load
  See http://www.tux.org/lkml/#export-tainted for information about tainted modu
les
Module test loaded, with warnings

哪位高人教教到底怎么做才对?
回复

使用道具 举报

发表于 2005-3-25 09:54:12 | 显示全部楼层
试一下我这个,我是可以编译成功的:
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif

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

#define __NO_VERSION__

//#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
                                                                                 
static int  __init MyModule_init(void)
{
        int ret=0;
        printk("<1>My module sample Startup.......\n");
            printk("<1>Hello, Device Driver's World!\n");
        return ret;
}
                                                                                                   
static void __exit MyModule_exit(void)
{
        printk("<1>My module sample End.......\n");
        printk("<1>Good bye, New world!\n");
}
                                                                                                   
module_init(MyModule_init);
module_exit(MyModule_exit);
                                                                                                   
MODULE_AUTHOR("oslinux");
MODULE_DESCRIPTION("My    Linux  Dirver  Module  Sample ");
MODULE_LICENSE("GPL");
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 20:18 , Processed in 0.063207 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表