bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3938回复: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
qzhqzh
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2018-07-12
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望23点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-14 12:22
用户被禁言,该主题自动屏蔽!
flydesert
驱动牛犊
驱动牛犊
  • 注册日期2002-11-12
  • 最后登录2003-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-14 10:31
各位大虾:我是把源代码目录(忘了,反正有一个linux-2.18.3)下的linux和asm目录替换/usr/include下的linux和asm目录,编译绝对通过,但就是insmod的时候出现no license错误,请不吝指教
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-13 16:35
这个警告是在insmod时产生的。并且init_module函数里的内容顺利执行;但在rmmod御载该模块时,clean_module函数并没有被执行。怎么回事?
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-13 13:29
choise:
   我用你的方法试了后,报如下警告:
load hello.o will taint(破坏) the kernel modules:no license
怎么回事?
ricky_ma
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2002-12-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
  
choise
驱动牛犊
驱动牛犊
  • 注册日期2001-12-27
  • 最后登录2004-11-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
也可以。我已经成功了。
Samuels
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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                           结束
cncs
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2007-01-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-08 11:07
给你一个简单的办法:
    将 /usr/include/linux/version.h 用
       /usr/src/linux-2.4.18-3/include/linux/version.h
     代替!
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-07 15:53
http://www.fanqiang.com/
去这里看看吧。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-07 15:52
unix1998:
我再问你2个弱智问题:
1、编译选项中的__DDEBUG__ __DMODULE__   -Wall等具体是什么意思?有何作用?在哪里能找到相应的说明?
2、#ifndef;#ifdef等有何作用?到底是什么意思?
#ifndef _DEBUG_H_  
#define _DEBUG_H_  
#include <stdio.h>
#endif
   
那些参数你应该找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]
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-07 11:37
教你一个最简单的方法。搜索出你机器里所有的kernel.h文件,然后一个一个的改错,当编译出错时,你就确定在那里了。
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-07 11:28
Samuels:
首先感谢你的帮助!我再试试。另:我的程序源文件放的位置对include有没有影响?我的源文件放在/usr/src下;#include <linux/kernel.h>这里包含的具体路径到底是哪里?
Samuels
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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



bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-06 15:16
我试了还是不行。你们开发一般用的什么编辑器?我觉得vi用起来挺别扭的。另,unix1998,你们一般开发程序makefile是自己写的吗?还是自动生成的?可否把你开头的makefile文件加上注释,我不太明白。谢谢你了。
另:我该怎样才能给你分呢?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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)



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]
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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
/yftty http://www.unix-driver.org
上一页
游客

返回顶部