bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3674回复:35

REDHAT7.3/KERNEL2.4.18-3下如何写内核模块程序?

楼主#
更多 发布于:2002-11-05 14:00
我在REDHAT7.3/KERNEL2.4.18-3下编译一个小程序,但是老说找不到编译的内核版本,怎么回事?编译能通过,但是在用insmod加载该模块时发生此错误。即使不加版本定义,仍然不对。

程序如下:
#define __NO_VERSION__
#include  <linux/kernel.h>
/*#include <linux/module.h>*/   该行一旦加入,就连编译都不能通过
#include <linux/version.h>
#define MODULE
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

int init_module()
{
printk(\"<l>hello world!\");
return 0;
}
void clean_module()
{
printk(\"<l>goodbye!\");
}



[编辑 -  11/5/02 by  bbs_000]

最新喜欢:

wenyuwenyu
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-05 14:10
去掉
#define MODULE
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
insmod版本和内核版本不一致。
另外,/*#include <linux/module.h>*/ 该行一旦加入,就连编译都不能通过
报什么错啊?

bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-05 15:15
按你上面的做法,去掉那段程序以后还是不对,报的错是:hello.o:could\'t find the kernel version the module was compiled for 。另外,加上<linux/module.h>的话,会报下面的错误:
file included from hello.c:3:
/usr/include/linux/module.h:60:parse error before \'atomic_t\'
同上.......................:60:warning:no semicolon at end of struct or union
同上........................:62:parse error before \'}\'
同上.........................:62:warning:data definition has no type or storage class
同上.........................:91:parse error before \'}\'
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-05 15:23
同样的程序在我这里好使,说明你的INCLUDE没包含正确。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-05 15:24
gcc -o -I/......(加上路径看看)
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-06 09:44
那你的程序包含哪些头文件呢?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-06 10:32
不是说你的程序代码问题,包括的文件是对的。
我的系统会去按如下路径找.h文件:
 /usr/include
 /usr/lib/gcc-lib/i686-pc-cygwin/2.95.2-5/include
比如#include <linux/module.h>
系统会在/usr/include/linux里找module.h文件。
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-06 10:36
那你认为我具体该怎么做呢?谢谢!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-06 10:56
修改makefile:
CFLAGS += -D__KERNEL__ -DMODULE
LDFLAGS =-Xlinker -rpath-link /指定你应包含的路径。
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-06 11:11
这里的makefile文件是那个目录下的?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-06 11:17
这里的makefile文件是那个目录下的?

这个makefile和你的代码放在一个目录下。
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-06 11:18
但我是直接用gcc编译的,没有用make啊,为什么要改makefile呢?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-06 11:30
直接用也可以,但是需要用-I参数加路径。
用makefile很方便的。linux下的开发不可缺少。
makefile文件你可以自己做,我给你个例子:
exec_prefix =
insmod_static = no
mandir = ${prefix}/man
prefix = /usr
sbindir = ${exec_prefix}/sbin

AR = ar
CC= gcc
CFLAGS  = -O2 -Wall
CFLAGS += -D__KERNEL__ -DMODULE
LDFLAGS = -Xlinker -rpath-link /库路经
all: hello.o
clean:
rm -f *.o
Samuels
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-06 11:41
1. 你必须确保用于编译的内核和你正在使用的系统内核版本一致
2. 一定要包含module.h,至少也要moduleversion.h而且要定义是党的版本号
3. 确保你使用的编译参数正确

--hello.c--

#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
printk(KERN_ERR \"hello world!\");
return 0;
}

void cleanup_module(void)
{
printk(KERN_ERR \"goodbye!\");
}


--编译命令行--

gcc -D__KERNEL__ -I/project/program/linux/2.4.18/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include /project/program/linux/2.4.18/include/linux/modversions.h -c -o hello.o hello.c

把/project/program/linux/2.4.18替换成你自己的
Samuels
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-06 11:45
此外,我还建议你
定义初始化函数的时候使用module_init和module_exit宏
在使用printk的时候使用KERN_xxx宏
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-06 11:59
首先,非常谢谢Samuels和Unix1998两位大虾的帮助。
那么module_init和module_exit宏怎么用?
哪里可以找到自动生成makefile文件的工具?
我用的参考书是那本<<LINUX设备驱动程序>>(ALESSANDRO RUBINI写的),我不知道是第几版,翻译的很不好,你们有什么其他建议?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-06 12:24
首先,非常谢谢Samuels和Unix1998两位大虾的帮助。
那么module_init和module_exit宏怎么用?
哪里可以找到自动生成makefile文件的工具?
我用的参考书是那本<<LINUX设备驱动程序>>(ALESSANDRO RUBINI写的),我不知道是第几版,翻译的很不好,你们有什么其他建议?

这2个宏用法:
在最后加上这2句:
module_init(init_module)
module_exit(cleanup_module)
要是英语好你就去看e文。那本书还是很不错的。
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-06 13:06
if you foung version confuse when insmod, to modify the /usr/src/linux-2.4/include/linux/version.h: to modify the 2.4.18-3-CUSTOM to 2.4.18-3
/yftty http://www.unix-driver.org
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-06 14:36
我用了各位的方法试了还是不行,我都快晕了!各位能否给我提供一个完整的代码和编译步骤?先多谢谢了。并加10分。
unix1998:我加上那两个宏后,编译通不过,说是没定义.
另外,你们写这些模块程序,是否都是直接在vi下写的?

[编辑 -  11/6/02 by  bbs_000]
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-06 15:03
Samuels的帖子就很完整了,加上我说的那两句话就行了。
说没定义是因为 没包括module.h。
无论用不用vi都没关系啊。
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
printk(KERN_ERR \"hello world!\");
return 0;
}

void cleanup_module(void)
{
printk(KERN_ERR \"goodbye!\");
}
module_init(init_module)
module_exit(cleanup_module)



上一页
游客

返回顶部