当前位置: 技术问答>linux和unix
请问问题出在哪里? 内核模块方面的。
来源: 互联网 发布时间:2015-08-02
本文导语: 我写了2个简单的模块,编译通过了,但是插入时报错说不正确的内核格式。 请高人帮我看看。 /** start.c**/ #include #include ...
我写了2个简单的模块,编译通过了,但是插入时报错说不正确的内核格式。
请高人帮我看看。
/** start.c**/
#include
#include
int
init_module ()
{
printk ("Hello, World!n");
return 0;
}
/** stop.c **/
#include
#define __NO_VERSION__
#include
#include
void cleanup_module()
{
printk("Bye!n");
}
/** MakeFile **/
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX
hello.o: start.o stop.o
ld -m elf_i386 -r -o hello.o start.o stop.o
start.o: start.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c start.c
stop.o: stop.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c stop.c
make 通过了。
但是 insmod hello.o 报错说
insmod: error inserting 'hello.o': -1 Invalid module format
请高人帮我看看。
/** start.c**/
#include
#include
int
init_module ()
{
printk ("Hello, World!n");
return 0;
}
/** stop.c **/
#include
#define __NO_VERSION__
#include
#include
void cleanup_module()
{
printk("Bye!n");
}
/** MakeFile **/
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX
hello.o: start.o stop.o
ld -m elf_i386 -r -o hello.o start.o stop.o
start.o: start.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c start.c
stop.o: stop.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c stop.c
make 通过了。
但是 insmod hello.o 报错说
insmod: error inserting 'hello.o': -1 Invalid module format
|
insmod会检查模块编译时的编本号和当前运行内核的版本号,如果不一致,就有上述警告。因为新的内核在某些函数接口,例如参数上发生了变化,由于模块编译环境不一致,这就无法在编译时报错,运行就可能造成严重后果。-f则忽略了这些情况,但比较危险。最好是将MODVERSION编入你的内核,这样编译好的符号会带一个校验和,后者综合了参数个数和类型信息,如果接口未发生任何变化,则校验和一致,即使版本号不一致也没关系
|
insmod start.o
insmod stop.o
可以吗?
insmod stop.o
可以吗?
|
我也是用insmod -f hello.o