Linux 下内核模块的开发方式的记录 及问题解决(入门的Helloworld)

来源:互联网 发布:数据库表设计原则 编辑:程序博客网 时间:2024/05/17 19:19

前几天照着《Linux设备驱动开发详解》上的 代码翘入了计算机一段内核模块代码,但是完全没有编译成功,gcc告诉我,这个不认识,那个也不认识……

 

内核模块代码如下:

[cpp] view plaincopy
  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. MODULE_LICENSE("Dual BSD/GPL");  
  4. static int hello_init(void)  
  5. {  
  6.         printk(KERN_ALERT " Hello World ENTER/n");  
  7.         return 0;  
  8. }  
  9. static void hello_exit(void)  
  10. {  
  11.         printk(KERN_ALERT " Hello World EXIT/n");  
  12.         return;  
  13. }  
  14. module_init(hello_init);  
  15. module_exit(hello_exit);  
  16. MODULE_AUTHOR("Woody.c");  
  17. MODULE_DESCRIPTION("A simple Hello world Module");  
  18. MODULE_ALIAS("a simplest module");  
  19. ~                                                                        

 

很郁闷。但是郁闷之余,还是需要找个途径来解决吧。

上网查了资料,网上牛人太多,写的东西虽然很给力,但是大多看不懂,所以决定还是问实验室同学。

 

同学告诉我,需要make,然后拷贝给我一个makefile的模板,很给力。

makefile(2.6内核)源码如下:

[python] view plaincopy
  1. # MakeFile 2.6:  
  2. obj-m += hello.o  
  3. # 产生对应的路径变量  
  4. CURRENT_PATH := $(shell pwd)  
  5. # 内核源码当前版本  
  6. LINUX_KERNEL := $(shell uname -r)  
  7. #内核源码绝对路径  
  8. LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)  
  9. #编译对象  
  10. all:  
  11.         make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules  
  12. #清理工作  
  13. clean:  
  14.         make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean  
  15. ~                                                                           

 

很给力。

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

原创粉丝点击