显示标签为“module”的博文。显示所有博文
显示标签为“module”的博文。显示所有博文

2007年9月12日星期三

linux内核模块加载

linux内核模块加载
1,一个简单的驱动程序
//hello.c
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include
#include
#include
int hello(void)
{
printk("This is a module,hello PeiJun!\n");
return 0;
}
void bye(void)
{
printk("Bye-bye!\n");
}
module_init(hello);
module_exit(bye);
2, 编写Makefile
obj-m := hello.o
KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -f hello.ko hello.mod hello.mod.o hello.o
3,执行make后,生成hello.ko hello.mod hello.mod.o hello.o
4, 执行insmod hello.o
.....
insmod: erro inserting 'hello.o' : -1 Invalid module format
2.4 不会生成这些文件,只有2.6才会生成hello.ko文件,用*.ko后缀来区分内核模块与一般的目标文件,在2.4下也是在x window的终端gnome终端口加载这样的模块,printk可以正常打印,但到了2.6就不行了.文本模式下不行,主要是printk优先级的问 题.内核的优先级定义可以在linux/kernel.h和kernel/printk.c中看.
5,执行insmod hello.ko
显示 This is a module,hello PeiJun!
6,lsmod查看
Module Size Used by
hello 1536 0
7,执行rmmod hello
显示: Bye-bye!

[linux,内核编程]insmod时的内核版本问题的解决方案

[linux,内核编程]insmod时的内核版本问题的解决方案

分类:技术笔记

03-27-2004, 10:46 AM

本篇文章是我在Linux 操作系统上实现内核模块编译平台的笔记,现在记录下来希望对碰到和我一样问题的朋友有帮助。
首先vi hello.c
原程序来自:
#include
#include
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif


int init_module(void)
{
printk("Hello,World!\n");
return 0;
}

void cleanup_module(void)
{
printk("Goodbye cruel world \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
echo rmmod
echo

然后输入make 命令.
然后insmod hello.o
结果出现问题:
hello.o: kernel-module version mismatch
hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8.

找了不少资料,总算解决了.
只要在makefile中gcc的参数加上-I /usr/src/linux-2.4.20-8/include (注意:linux-X.X.XX-X请根据自己的机子来配,看看/usr/src/下的linux-?就知道是什么了)

于是makefile改为:
CC=gcc
MODCFLAGS:=-Wall -DMODULE -D__KERNEL__ -DLINUX -I /usr/src/linux-2.4.20-8/include
hello.o:hello.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c hello.c
echo insmod
echo rmmod
echo

然后insmod hello.o出现了第二个问题:

Warning: loading hello.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module hello loaded, with warnings


又是找资料,
于是知道了,在原程序中加入MODULE_LICENSE("GPL");
即:
#include
#include
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif


int init_module(void)
{
MODULE_LICENSE("GPL");
printk("Hello,World!\n");
return 0;
}

void cleanup_module(void)
{
printk("Goodbye cruel world \n");
}

然后make,insmod 都没问题了.

最后:
下面我们来查看这个模块所执行的显示内容,这些内容是不会在终端显示的。要执行命令:

dmesg

来查看。在最下面显示
Hello,World!
Goodbye cruel world
Hello,World!

还有一种方法可以看到这个模块是否加载成功否。

$cat /proc/modules

从中可以看到hello 这个模块,这就是我加载的。
这个文件中的信息分为四列。
第一列:模块名。第二列:模块使用内存的字节数。第三列:模块的当前使用计数。第四列:备注。
好了,我们来卸载这个模块吧。

rmmod hello

再用 dmesg 来查看卸载时发出的信息吧。

insmod内核版本问题解决方法

insmod内核版本问题解决方法
内核模块编写时,insmod内核版本问题的解决方法:
原程序(hello.c):
#define MODULE
#include
int init_module(void)
{
printk(“<1>Hello, world!\n”);
return 0;
}
void cleanup_module(void)
{
printk(“<1>Goodbye cruel world\n”);
}
编译:gcc –c hello.c
insmode hello.o
结果:
hello.o: kernel-module version mismatch
hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8
解决方法:编译时加入-I /usr/src/linux2.4.20-8/include
gcc –c hello.c –I /usr/src/linux2.4.20-8/include
其中/usr/src/linux2.4.20-8是Linux的源代码(我的机器是Rethat 9)
此时再启动该模块:insmod hello.o
结果又出现问题:
Warning: loading hello.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Hello, world!
解决方法:添加MODULE_LICENSE(“GPL”)
int init_module(void)
{
MODULE_LICENSE(“GPL”);
printk(“<1>Hello, world!\n”);
return 0;
}
此时再编译,加载,没有问题。
root# gcc –c hello.c –I /usr/src/linux2.4.20-8/include
root# insmod hello.o
Hello, world!
Root# rmmod hello
Goodbye cruel world
最后:
下面我们来查看这个模块所执行的显示内容,这些内容是不会在终端显示的。要执行命令:
dmesg
来查看。在最下面显示
Hello,World!
Goodbye cruel world
Hello,World!
...
还有一种方法可以看到这个模块是否加载成功否。
$cat /proc/modules
从中可以看到hello 这个模块,这就是我加载的。
这个文件中的信息分为四列。第一列:模块名。第二列:模块使用内存的字节数。第三列:模块的当前使用计数。第四列:备注。