当前位置: 技术问答>linux和unix
100分求助关于一个简单的linux内核hello程序
来源: 互联网 发布时间:2017-02-02
本文导语: hello.c: #include #include MODULE_LICENSE("GPL"); static int hello_init(void) { printk("hello module initn"); return 0; } static void hello_exit(void) { printk("hello module exitn"); } module_init(hello_init); module_exit(hello_exit); makefile: ifneq ($(KERNELRELEASE),)...
hello.c:
makefile:
系统内核版本 :
root@xu-desktop:~# uname -r
2.6.32-38-generic
编译出来后的hello.ko信息:
root@xu-desktop:~# modinfo practise/hello/hello.ko
filename: practise/hello/hello.ko
license: GPL
srcversion: C879BFBDAB788B0CD197F1A
depends:
vermagic: 2.6.32-38-generic SMP mod_unload modversions
出现的问题:
root@xu-desktop:~# insmod practise/hello/hello.ko
insmod: error inserting 'practise/hello/hello.ko': -1 Invalid module format
补充:我在网上查了一下,这种情况是由于系统内核版本与源码版本对不上引起的,也按照他们说的方法改了一些配置,目前按照命令获取的版本号是一致的,但是由于我是刚接触linux才不到一个月的新手,在按照网上的各种方法试了个遍之后发现我的系统内核版本号被我改掉了(因为我同事跟我装的同一个linux,他的版本号却是2.6.32-28,而我读出来的却是2.6.32-38,有一点可以确定的是,我没有升级过内核),请问我现在该怎么做才能把我的版本号重置成正确的?
#include
#include
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk("hello module initn");
return 0;
}
static void hello_exit(void)
{
printk("hello module exitn");
}
module_init(hello_init);
module_exit(hello_exit);
makefile:
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KERNELDIR ?=/usr/src/linux-2.6.32-38
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~.core .depend .*.cmd *.ko *.mod.c .tmp_versions
rm -rf Mod* mod*
endif
系统内核版本 :
root@xu-desktop:~# uname -r
2.6.32-38-generic
编译出来后的hello.ko信息:
root@xu-desktop:~# modinfo practise/hello/hello.ko
filename: practise/hello/hello.ko
license: GPL
srcversion: C879BFBDAB788B0CD197F1A
depends:
vermagic: 2.6.32-38-generic SMP mod_unload modversions
出现的问题:
root@xu-desktop:~# insmod practise/hello/hello.ko
insmod: error inserting 'practise/hello/hello.ko': -1 Invalid module format
补充:我在网上查了一下,这种情况是由于系统内核版本与源码版本对不上引起的,也按照他们说的方法改了一些配置,目前按照命令获取的版本号是一致的,但是由于我是刚接触linux才不到一个月的新手,在按照网上的各种方法试了个遍之后发现我的系统内核版本号被我改掉了(因为我同事跟我装的同一个linux,他的版本号却是2.6.32-28,而我读出来的却是2.6.32-38,有一点可以确定的是,我没有升级过内核),请问我现在该怎么做才能把我的版本号重置成正确的?
|
KERNELDIR ?=/usr/src/linux-2.6.32-38
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
因为内核版本后面还有一个后缀generic
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
就用这个,为什么要注释掉呢?也就是用你当前系统上正在运行的内核的header构造内核模块,这样子才不会有问题。应该已经安装了kernel-header吧?
sudo apt-get install linux-headers-2.6.32-38-generic
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
因为内核版本后面还有一个后缀generic
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
就用这个,为什么要注释掉呢?也就是用你当前系统上正在运行的内核的header构造内核模块,这样子才不会有问题。应该已经安装了kernel-header吧?
sudo apt-get install linux-headers-2.6.32-38-generic