前几天照着《Linux设备驱动开发详解》上的 代码翘入了计算机一段内核模块代码,但是完全没有编译成功,gcc告诉我,这个不认识,那个也不认识……
内核模块代码如下:
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void)
- {
- printk(KERN_ALERT " Hello World ENTER/n");
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT " Hello World EXIT/n");
- return;
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_AUTHOR("Woody.c");
- MODULE_DESCRIPTION("A simple Hello world Module");
- MODULE_ALIAS("a simplest module");
- ~
很郁闷。但是郁闷之余,还是需要找个途径来解决吧。
上网查了资料,网上牛人太多,写的东西虽然很给力,但是大多看不懂,所以决定还是问实验室同学。
同学告诉我,需要make,然后拷贝给我一个makefile的模板,很给力。
makefile(2.6内核)源码如下:
- # MakeFile 2.6:
- obj-m += hello.o
- # 产生对应的路径变量
- CURRENT_PATH := $(shell pwd)
- # 内核源码当前版本
- LINUX_KERNEL := $(shell uname -r)
- #内核源码绝对路径
- LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
- #编译对象
- all:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
- #清理工作
- clean:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
- ~
很给力。
make之后产生了我要的东西。
然后,insmod ./hello.ko
却告诉我:insmod: error inserting './hello.ko': -1 Operation not permitted
原来要加sudo,因为这是在往内核插入模块。
OK,成功了,再lsmod能看到hello的模块已经装载成功了
想看看printk的结果?dmesg,看到输出的结果了
嗯,该卸载了。。。
sudo rmmod hello
在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。
modprobe和insmod的区别是什么呢?
1.modprobe可以解决load module时的依赖关系,比如load moudleA就必须先load mouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文件来查找依赖关系的。而insmod不能解决依赖问题。
2.modprobe默认会去/lib/modules/<kernel-version>/下面查找module,而insmod只在给它的参数中去找module(默认在当前目录找)。这样,有时insmod也有它的有用之处,举个例子吧。
有/root/my-mod.ko这个module,cd /root/,然后用insmod my-mod.ko(insmod /root/my-mod.ko)就可以insert这个module了,但是用modprobe my-mod.ko(modprobe /root/my-mod.ko)却提示"FATAL:Module my-mod.ko not found",这就是因为modprobe是到/lib/modules/`uname -r`/下去找module的,如果没找到就是这样了。
自己使用的解决方法:
1/ sudo depmod /home/xuyuefei/Linux学习资料/程序/Modules/Helloworld/Helloworld.ko ;depmod后面要跟绝对路径 :不过这步好像可以不用么???
2/sudo modprobe Helloworld
OK顺利通过了,注意是Helloworld,Helloworld,ko就不行了
以上转自:http://blog.csdn.net/mcg890414/article/details/5874943