阅读:3938回复: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] |
|
最新喜欢:![]() |
沙发#
发布于:2002-11-14 12:22
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-11-14 10:31
各位大虾:我是把源代码目录(忘了,反正有一个linux-2.18.3)下的linux和asm目录替换/usr/include下的linux和asm目录,编译绝对通过,但就是insmod的时候出现no license错误,请不吝指教
|
|
地板#
发布于:2002-11-13 16:35
这个警告是在insmod时产生的。并且init_module函数里的内容顺利执行;但在rmmod御载该模块时,clean_module函数并没有被执行。怎么回事?
|
|
地下室#
发布于:2002-11-13 13:29
choise:
我用你的方法试了后,报如下警告: load hello.o will taint(破坏) the kernel modules:no license 怎么回事? |
|
5楼#
发布于:2002-11-13 11:15
do below:
mv /usr/include/linux /usr/include/lin ln -s /usr/src/linux/include/linux /usr/include/linux ln -s /usr/src/linux/include/asm /usr/include/asm |
|
6楼#
发布于:2002-11-12 12:29
我也遇到你提出的问题,不过我是在最新的redhat 8.0下面遇到的。也是告诉我说:“没有找到合适的版本”
我是这么解决的。其实你仔细看/usr/include/linux/modversions.h就会发现,路径有问题。 你可以把你的程序中的: #include <linux/module.h> #include <linux/kenerl.h> #include …… 改变为 #include </lib/modules/2.4.18-14/build/include/linux/module.h>等等……。 或者在makefile中指出: I/</lib/modules/2.4.18-14/build/include 也可以。我已经成功了。 |
|
7楼#
发布于:2002-11-11 16:51
-D__MODULE__ 是说定义__MODULE__这个宏
就像在文件里写#define __MODULE__这句话一样 -Wall 是指打印所有的Warning信息,缺省情况只打印错误信息 #ifdef, #ifndef是预编译指令,你看看C或是C++的语法书吧 #ifndef DEBUG 如果没有定义DEBUG #define DEBUG 定义DEBUG #define PRINTK(format, args...) printk(KERN_DEBUG format , ## args) #else 反之 #define PRINTK(format, args...) #endif 结束 |
|
8楼#
发布于:2002-11-08 11:07
给你一个简单的办法:
将 /usr/include/linux/version.h 用 /usr/src/linux-2.4.18-3/include/linux/version.h 代替! |
|
9楼#
发布于:2002-11-07 15:53
http://www.fanqiang.com/
去这里看看吧。 |
|
10楼#
发布于:2002-11-07 15:52
unix1998: 那些参数你应该找make文档看。参数很多。 2、#ifndef;#ifdef等有何作用?到底是什么意思? #ifndef _DEBUG_H_ //如果没定义_DEBUG_H_ #define _DEBUG_H_ //定义_DEBUG_H_ #include <stdio.h> //同时包进stdio.h文件 #endif //结束if的语句。 [编辑 - 11/7/02 by unix1998] |
|
11楼#
发布于:2002-11-07 15:15
unix1998:
我再问你2个弱智问题: 1、编译选项中的__DDEBUG__ __DMODULE__ -Wall等具体是什么意思?有何作用?在哪里能找到相应的说明? 2、#ifndef;#ifdef等有何作用?到底是什么意思? #ifndef _DEBUG_H_ #define _DEBUG_H_ #include <stdio.h> #endif |
|
12楼#
发布于:2002-11-07 11:37
教你一个最简单的方法。搜索出你机器里所有的kernel.h文件,然后一个一个的改错,当编译出错时,你就确定在那里了。
|
|
13楼#
发布于:2002-11-07 11:28
Samuels:
首先感谢你的帮助!我再试试。另:我的程序源文件放的位置对include有没有影响?我的源文件放在/usr/src下;#include <linux/kernel.h>这里包含的具体路径到底是哪里? |
|
14楼#
发布于:2002-11-07 11:13
还不行,我也晕了
module_init和module_exit在linux/init.h里面定义 版本号和这两个宏没有关系,你可以参考一下yftty说的方法,把include/linux/version.h里的版本号由2.4.18-3-CUSTOM改为2.4.18-3 此外我还是想请你仔细检查你的include路径对不对,一定要指向编译出你正在运行的内核的源代码(不好意思,有点拗口) --Makefile-- CC = gcc CFLAGS = -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 OBJS = hello.o all: $(OBJS) clean: rm -rf *.o *~ core |
|
15楼#
发布于:2002-11-06 15:25
还不行?我晕了。
我不用linux的,我用cygwin,所以就用windows下的编译器,比如vc,ultraedit等。 makefile是自己写的,但是复杂的就要借助工具了,就是自动生成。 exec_prefix = //可执行文件路径,不写就默认 insmod_static = no //无所谓,不用也行。 mandir = ${prefix}/man//帮助文档路径。 prefix = /usr //路径放在/usr下 sbindir = ${exec_prefix}/sbin AR = ar //连接器用ar CC= gcc //编译器用gcc.,如果交叉编译就用别的 CFLAGS = -O2 -Wall //相当于gcc 后面的参数。 CFLAGS += -D__KERNEL__ -DMODULE //同上 LDFLAGS = -Xlinker -rpath-link /库路经 all: hello.o //你输入make all时编译的程序。 clean: //你输入make clean时执行的动作,即删除所有.o文件。 rm -f *.o |
|
16楼#
发布于:2002-11-06 15:16
我试了还是不行。你们开发一般用的什么编辑器?我觉得vi用起来挺别扭的。另,unix1998,你们一般开发程序makefile是自己写的吗?还是自动生成的?可否把你开头的makefile文件加上注释,我不太明白。谢谢你了。
另:我该怎样才能给你分呢? |
|
17楼#
发布于: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) |
|
18楼#
发布于:2002-11-06 14:36
我用了各位的方法试了还是不行,我都快晕了!各位能否给我提供一个完整的代码和编译步骤?先多谢谢了。并加10分。
unix1998:我加上那两个宏后,编译通不过,说是没定义. 另外,你们写这些模块程序,是否都是直接在vi下写的? [编辑 - 11/6/02 by bbs_000] |
|
19楼#
发布于: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
|
|
|
上一页
下一页