LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 863|回复: 9

hello.world 内核程序 我遇到问题了:(

[复制链接]
发表于 2005-2-1 10:09:46 | 显示全部楼层 |阅读模式
系统环境:rh9.0 kernel 2.4.20-8   @ WinXp+virtual Pc


hello.c
#include <linux/kernel.h>   /* We're doing kernel work */
#include <linux/module.h>   /* Specifically, a module */

#if CONFIG_MODVERSIONS= =1
#define MODVERSIONS
#include <linux/modversions.h>
#endif        

int init_module()
{
  printk("Hello, world - this is the kernel speaking\n");
  return 0;
}


void cleanup_module()
{
  printk("Short is the life of a kernel module\n");
}

Makefile:

CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

hello.o:        hello.c /usr/include/linux/version.h
                $(CC) $(MODCFLAGS) -c hello.c
                echo insmod hello.o to turn it on
                echo rmmod hello to turn if off
                echo
                echo X and kernel programming do not mix.
                echo Do the insmod and rmmod from outside

完全按照例子敲的,make的时候也没有什么错误提示,
不过在insmod时提示:couldn't find the kernel version the module compiled for .
这是怎么回事呢?
发表于 2005-2-1 12:33:46 | 显示全部楼层
可能是头文件包含的有问题,用这个Makefile可以成功。

  1. WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
  2. [color=Red]INCLUDE := -isystem /lib/modules/`uname -r`/build/include[/color]
  3. CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
  4. CC      := gcc
  5. OBJS    := ${patsubst %.c, %.o, ${wildcard *.c}}

  6. all: ${OBJS}

  7. .PHONY: clean

  8. clean:
  9.     rm -rf *.o
复制代码

注意 uname -r 两端是倒引号,rm -rf *.o 前面有一个 TAB 键
回复 支持 反对

使用道具 举报

发表于 2005-4-28 22:06:48 | 显示全部楼层

太郁闷了

我遇到的问题和楼住的一样,我按照2楼的改了,却提示模块
kernel-module version mismach
hello.o was compiles for kernel version 2.4.20
while this kernel is version 2.4.20-8
我想请教应该怎莫做呢?
我的Linux内核是2.4.20-8的
回复 支持 反对

使用道具 举报

发表于 2005-4-28 22:33:15 | 显示全部楼层

有一点进展了

我在实在不行的情况下用了
insmod -f ./hello.o
将模块强行加了进去,但是出现了一大堆的警告,也没看到输出信息!
我用more /proc/ksyms 也可以看到已经加了进去。我有用dmesg在最后一行看到了输出!
接下来我用rmmod hello.o准备将模块卸掉,却提示说
module hello.o is not loaded
我又用dmesg看了一下,没看到输出信息。
到底这个问题怎样才能完美的解决呢?
回复 支持 反对

使用道具 举报

发表于 2005-4-29 10:13:41 | 显示全部楼层
应该是rmmod hello
没有.o
回复 支持 反对

使用道具 举报

发表于 2005-4-30 15:19:31 | 显示全部楼层
rmmod hello
然后用dmesg看到了输出。
可是还没解决上面的mismatch 问题,毕竟这个模块式强行加进去的亚
回复 支持 反对

使用道具 举报

发表于 2005-4-30 16:21:30 | 显示全部楼层
忘记是哪个宏了,你们要定义下,自己找找,偶也忘记了!
回复 支持 反对

使用道具 举报

发表于 2005-4-30 18:32:26 | 显示全部楼层
试试加入
-I/usr/src/linux-2.4.20-8/include
回复 支持 反对

使用道具 举报

发表于 2005-4-30 21:49:14 | 显示全部楼层
是可以了,但在make时还是有一大堆的警告。
当用root用户且执行后,显示如下:
loading hello.o will tain the kernel :no license
module hello.o loaded ,with warning
是不是还要加上许可证呢?
回复 支持 反对

使用道具 举报

发表于 2005-4-30 21:57:51 | 显示全部楼层
我加上MODULE_LICENSE("GPL");
后终于在insmod是没有警告啥的了,可是还是要用dmesg才能看到呢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表