免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2612 | 回复: 14
打印 上一主题 下一主题

学习设备驱动程序的第一个程序helloworld出现的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-09 14:46 |只看该作者 |倒序浏览
操作系统 redhat

我刚开始看《linux 设备驱动程序》这本书,测试了第一个hello.c程序,编译通过后运行
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.

我运行uname发现内核版本的确是2.4.20-8,可内核版本怎么是这个呢?不是只有三个数字的吗?怎样改正才能使insmod ./hello.o正常运行?请高手指点。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-02-09 14:56 |只看该作者
原帖由 NO.1shq 于 2006-2-9 14:46 发表
操作系统 redhat

我刚开始看《linux 设备驱动程序》这本书,测试了第一个hello.c程序,编译通过后运行
insmod ./hello.o
提示如下错误:
./hello.o: kernel-module version mismatch
        ./hello.o wa ...


贴下代码.

ps: 早不用2.4内核了.没有测试环境帮你测试.

论坛徽章:
0
3 [报告]
发表于 2006-02-09 15:06 |只看该作者
程序代码:

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

我主要想知道为什么内核的编号会是2.4.20-8?正常情况下不都是“2.4.20”吗?

论坛徽章:
0
4 [报告]
发表于 2006-02-09 15:15 |只看该作者
在module的.c文件中加入#ifdef MODVERSIONS #include <linux/modversions.h> #endif
重新编译。 用insmod -f yourname.o。 再不行我也没招了。

2.4我也不熟, 但似乎编译模块时mangle了符号, 用技术的手段强制你开源。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-02-09 15:27 |只看该作者
不熟悉2.4内核的LKM.

你把头文件加全了呢?linux/module.h linux/version.h

论坛徽章:
0
6 [报告]
发表于 2006-02-09 16:02 |只看该作者
如果学linux下的lkm,最好用kernel.org上的内核原代码重新编译一下内核。用自己编译的内核就没有这样的问题了。rh对内核作了很大的改动,不适合用来学内核编程。

如果不想重新编译内核的话,也有好几种方法可以解决这个问题。我记得我是通过修改linux/version.h来解决的。有些网上的文章说可以通过#define __NO_VERSION__来解决,可是我在rh上一直没搞定过。

论坛徽章:
0
7 [报告]
发表于 2006-02-09 16:08 |只看该作者
看来只有我一直坚守阵地研究 2.4 内核,我落伍了。。。
是这样的,2.4 的 LKM 明确指出
如果你在使用2.4或更新的内核,当你加载你的模块时,你也许注意到了这些输出信息:

# insmod hello-3.o
Warning: loading hello-3.o will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Hello, world 3
Module hello-3 loaded, with warnings
       


在2.4或更新的内核中,一种识别代码是否在GPL许可下发布的机制被引入,因此人们可以在使用非公开的源代码产品时得到警告。这通过在下一章展示的宏MODULE_LICENSE()当你设置在GPL证书下发布你的代码时,你可以取消这些警告。这种证书机制在头文件linux/module.h实现,同时还有一些相关文档信息。

类似的,宏 MODULE_DESCRIPTION() 用来描述模块的用途。宏MODULE_AUTHOR() 用来声明模块的作者。宏MODULE_SUPPORTED_DEVICE()声明模块支持的设备。

这些宏都在头文件linux/module.h 定义,并且内核本身并不使用这些宏。它们只是用来提供识别信息,可用工具程序像objdump查看。作为一个练习,使用grep从目录 linux/drivers 看一看这些模块的作者是如何为他们的模块提供识别信息和档案的。

我看的是电子版的 LKM,在 part4 有正确的代码

  1. /*  hello-4.c - Demonstrates module documentation.
  2. */
  3. #include <linux/module.h>
  4. #include <linux/kernel.h>
  5. #include <linux/init.h>
  6. #define DRIVER_AUTHOR "Peiter Jay Salzman <p@dirac.org>"
  7. #define DRIVER_DESC   "A sample driver"

  8. int init_hello_3(void);
  9. void cleanup_hello_3(void);


  10. static int init_hello_4(void)
  11. {
  12.    printk(KERN_ALERT "Hello, world 4\n");
  13.    return 0;
  14. }


  15. static void cleanup_hello_4(void)
  16. {
  17.    printk(KERN_ALERT "Goodbye, world 4\n");
  18. }


  19. module_init(init_hello_4);
  20. module_exit(cleanup_hello_4);


  21. /*  You can use strings, like this:
  22. */
  23. MODULE_LICENSE("GPL");           // Get rid of taint message by declaring code as GPL.

  24. /*  Or with defines, like this:
  25. */
  26. MODULE_AUTHOR(DRIVER_AUTHOR);    // Who wrote this module?
  27. MODULE_DESCRIPTION(DRIVER_DESC); // What does this module do?

  28. /*  This module uses /dev/testdevice.  The MODULE_SUPPORTED_DEVICE macro might be used in
  29. *  the future to help automatic configuration of modules, but is currently unused other
  30. *  than for documentation purposes.
  31. */
  32. MODULE_SUPPORTED_DEVICE("testdevice");
复制代码

[ 本帖最后由 platinum 于 2006-2-9 16:21 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-02-09 16:13 |只看该作者
原帖由 platinum 于 2006-2-9 16:08 发表
看来只有我一直坚守阵地研究 2.4 内核,我落伍了。。。
是这样的,2.4 的 LKM 明确指出

其实如果耐心继续往下看,应该有解释说明的
我看的是电子版的 LKM,在 part4 有正确的代码
[code]
/*  hello-4.c -  ...


大虾看走眼了,楼主提的是内核版本不匹配的问题,不是license的问题。

论坛徽章:
0
9 [报告]
发表于 2006-02-09 16:20 |只看该作者
原帖由 richardhesidu 于 2006-2-9 16:13 发表


大虾看走眼了,楼主提的是内核版本不匹配的问题,不是license的问题。

实在不好意思

论坛徽章:
0
10 [报告]
发表于 2006-02-10 12:01 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP