阅读:3686回复:35
REDHAT7.3/KERNEL2.4.18-3下如何写内核模块程序?
我在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] |
|
最新喜欢:wenyu |
沙发#
发布于:2002-11-05 14:10
去掉
#define MODULE #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include <linux/modversions.h> #endif insmod版本和内核版本不一致。 另外,/*#include <linux/module.h>*/ 该行一旦加入,就连编译都不能通过 报什么错啊? |
|
板凳#
发布于: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 \'}\' |
|
地板#
发布于:2002-11-05 15:23
同样的程序在我这里好使,说明你的INCLUDE没包含正确。
|
|
地下室#
发布于:2002-11-05 15:24
gcc -o -I/......(加上路径看看)
|
|
5楼#
发布于:2002-11-06 09:44
那你的程序包含哪些头文件呢?
|
|
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文件。 |
|
7楼#
发布于:2002-11-06 10:36
那你认为我具体该怎么做呢?谢谢!
|
|
8楼#
发布于:2002-11-06 10:56
修改makefile:
CFLAGS += -D__KERNEL__ -DMODULE LDFLAGS =-Xlinker -rpath-link /指定你应包含的路径。 |
|
9楼#
发布于:2002-11-06 11:11
这里的makefile文件是那个目录下的?
|
|
10楼#
发布于:2002-11-06 11:17
这里的makefile文件是那个目录下的? 这个makefile和你的代码放在一个目录下。 |
|
11楼#
发布于:2002-11-06 11:18
但我是直接用gcc编译的,没有用make啊,为什么要改makefile呢?
|
|
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 |
|
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替换成你自己的 |
|
14楼#
发布于:2002-11-06 11:45
此外,我还建议你
定义初始化函数的时候使用module_init和module_exit宏 在使用printk的时候使用KERN_xxx宏 |
|
15楼#
发布于:2002-11-06 11:59
首先,非常谢谢Samuels和Unix1998两位大虾的帮助。
那么module_init和module_exit宏怎么用? 哪里可以找到自动生成makefile文件的工具? 我用的参考书是那本<<LINUX设备驱动程序>>(ALESSANDRO RUBINI写的),我不知道是第几版,翻译的很不好,你们有什么其他建议? |
|
16楼#
发布于:2002-11-06 12:24
首先,非常谢谢Samuels和Unix1998两位大虾的帮助。 这2个宏用法: 在最后加上这2句: module_init(init_module) module_exit(cleanup_module) 要是英语好你就去看e文。那本书还是很不错的。 |
|
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
|
|
|
18楼#
发布于:2002-11-06 14:36
我用了各位的方法试了还是不行,我都快晕了!各位能否给我提供一个完整的代码和编译步骤?先多谢谢了。并加10分。
unix1998:我加上那两个宏后,编译通不过,说是没定义. 另外,你们写这些模块程序,是否都是直接在vi下写的? [编辑 - 11/6/02 by bbs_000] |
|
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) |
|
上一页
下一页