100分求助关于一个简单的linux内核hello程序

时间:2022-10-06 23:40:22
hello.c:
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk("<1>hello module init\n");
return 0;
}
static void hello_exit(void)
{
printk("<1>hello module exit\n");
}
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,有一点可以确定的是,我没有升级过内核),请问我现在该怎么做才能把我的版本号重置成正确的?

7 个解决方案

#1


补充一下 :

root@xu-desktop:~# cat /proc/version
Linux version 2.6.32-38-generic (buildd@allspice) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012

#2


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

#3


引用 2 楼 linwhwylb 的回复:
KERNELDIR ?=/usr/src/linux-2.6.32-38

#KERNELDIR ?= /lib/modules/$(shell uname -r)/build

因为内核版本后面还有一个后缀generic

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

就用这个,为什么要注释掉呢?也就是用你当前系统上正在运……


我按你说的做了之后是这样的
root@xu-desktop:~/practise/hello# make
make -C /lib/modules/2.6.32-38-generic/build M=/root/practise/hello modules
make: *** /lib/modules/2.6.32-38-generic/build: 没有那个文件或目录。 停止。
make: *** [modules] 错误 2

我找到/lib/modules/2.6.32-38-generic/build里面后发现build是一个连接,但是连接已经段开了,可能是因为我之前删了什么东西导致的.

现在我重装了
sudo apt-get remove linux-headers-2.6.32-38-generic
sudo apt-get install linux-headers-2.6.32-38-generic
之后make出现了这样一个错误
root@xu-desktop:~/practise/hello# make
make -C /lib/modules/2.6.32-38-generic/build M=/root/practise/hello modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-38-generic'
make[1]: Makefile: 没有那个文件或目录
make[1]: *** 没有规则可以创建目标“Makefile”。 停止。
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-38-generic'
make: *** [modules] 错误 2

我找到/usr/src/linux-headers-2.6.32-38-generic目录下看,发现里面的连接全都是断开的,请问接下来我该怎么做?

#4


/usr/src/linux-headers-2.6.32-38-generic下的文件连接都是指向/usr/src/linux-headers-2.6.32-38里面的对应文件,但是我这里没有/usr/src/linux-headers-2.6.32-38

#5


问题解决了~

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install linux-headers-2.6.32-38-generic居然可以用

等安装好后make一下,可以了,insmod hello.ko也可以了...

结贴咯

#6


引用 5 楼 jpduck 的回复:
问题解决了~

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install linux-headers-2.6.32-38-generic居然可以用

等安装好后make一下,可以了,insmo……
挺好的。

#7


五楼写错了,这里重写一下:

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install  linux-headers-2.6.32-38居然可以用

等安装好后make一下,可以了,insmod hello.ko也可以了...

#1


补充一下 :

root@xu-desktop:~# cat /proc/version
Linux version 2.6.32-38-generic (buildd@allspice) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #83-Ubuntu SMP Wed Jan 4 11:12:07 UTC 2012

#2


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

#3


引用 2 楼 linwhwylb 的回复:
KERNELDIR ?=/usr/src/linux-2.6.32-38

#KERNELDIR ?= /lib/modules/$(shell uname -r)/build

因为内核版本后面还有一个后缀generic

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

就用这个,为什么要注释掉呢?也就是用你当前系统上正在运……


我按你说的做了之后是这样的
root@xu-desktop:~/practise/hello# make
make -C /lib/modules/2.6.32-38-generic/build M=/root/practise/hello modules
make: *** /lib/modules/2.6.32-38-generic/build: 没有那个文件或目录。 停止。
make: *** [modules] 错误 2

我找到/lib/modules/2.6.32-38-generic/build里面后发现build是一个连接,但是连接已经段开了,可能是因为我之前删了什么东西导致的.

现在我重装了
sudo apt-get remove linux-headers-2.6.32-38-generic
sudo apt-get install linux-headers-2.6.32-38-generic
之后make出现了这样一个错误
root@xu-desktop:~/practise/hello# make
make -C /lib/modules/2.6.32-38-generic/build M=/root/practise/hello modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-38-generic'
make[1]: Makefile: 没有那个文件或目录
make[1]: *** 没有规则可以创建目标“Makefile”。 停止。
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-38-generic'
make: *** [modules] 错误 2

我找到/usr/src/linux-headers-2.6.32-38-generic目录下看,发现里面的连接全都是断开的,请问接下来我该怎么做?

#4


/usr/src/linux-headers-2.6.32-38-generic下的文件连接都是指向/usr/src/linux-headers-2.6.32-38里面的对应文件,但是我这里没有/usr/src/linux-headers-2.6.32-38

#5


问题解决了~

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install linux-headers-2.6.32-38-generic居然可以用

等安装好后make一下,可以了,insmod hello.ko也可以了...

结贴咯

#6


引用 5 楼 jpduck 的回复:
问题解决了~

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install linux-headers-2.6.32-38-generic居然可以用

等安装好后make一下,可以了,insmo……
挺好的。

#7


五楼写错了,这里重写一下:

我在虚拟机下又装了一个linux,到/usr/src下看都有什么,发现两个文件夹linux-headers-x.y.z和linux-headers-x.y.z-generic
然后我到之前那个系统里边一看少了一个
然后我apt-get install  linux-headers-2.6.32-38居然可以用

等安装好后make一下,可以了,insmod hello.ko也可以了...