码迷,mamicode.com
首页 > 系统相关 > 详细

Ubuntu16.04下的modules模块编译加载

时间:2017-10-10 14:35:49      阅读:498      评论:0      收藏:0      [点我收藏+]

标签:top   rm -rf   red   文件中   切换   gcc   ram   ini   roo   

一、首先编写对应的驱动程序的相关内容:(最简单的hello.c程序)

 1 #include<linux/init.h>
 2 #include<linux/module.h>
 3 MODULE_LICENSE("Dual BSD/GPL");
 4 MODULE_AUTHOR("MDAXIA");
 5 
 6 static int __init hello_init(void)
 7 {
 8         printk(KERN_ALERT "Hello world!\n");
 9         return 0;
10 }
11 static void __exit hello_exit(void)
12 {
13         printk(KERN_ALERT "Goodbye,cruel world!");
14 }
15 module_init(hello_init);
16 module_exit(hello_exit);

二、编写对应Makefile文件:(注意事项Makefile,首字母大写M)

 1 ifeq ($(KERNELRELEASE),)
 2 KDIR:=/lib/modules/$(shell uname -r)/build
 3 PWD:=$(shell pwd)
 4 modules:
 5         $(MAKE) -C $(KDIR) M=$(PWD) modules
 6 modules_install:
 7         $(MAKE) -C $(KDIR) M=$(PWD) modules_install
 8 clean:
 9         rm -rf *.o *.ko .depend *.mod.o *.mod.c Module.* modules.* 
10 .PHONY:modules modules_install clean
11 else
12 obj-m :=hello.o
13 endif

三、使用make指令对程序进行编译生成目标文件hello.ko

sudo make

使用的是sudo make的指令来保证运行和文件的执行权限等等,编译的结果如下所示:

技术分享这里成功生成了我们需要的.ko文件

使用sudo make clean命令来清除相关的中间文件以及目标文件:

sudo make clean

技术分享这样就清除了所有的文件了~

四、安装加载模块,需要的是root权限:

 

相关错误集合如下所示(确实不知道怎么解决,最后歪打正着就解决了,不过回过头来想,这些错误提示的分析也的确有很大的帮助吧):

Question1:这里重点关注一下第三行,Error的修改往往是从上到下的修改方式,所以这里提示的是-fstack-protector-strong not supported by compiler,意思很明确了,我们当前的gcc编译器版本不支持-fstack-protector-strong这个参数,这个参数的调用时在linux-headers-4.4.0-96-generic相关文件中的,既然不支持,那我们就找个支持的gcc版本来编译运行就可以了,通过查阅相关资料得到:‘-fstack-protector-strong’ 选项是gcc4.9以后的版本才加入的,也就是说需要安装gcc4.9以后的版本才可以编译通过,所以直接安装gcc5.4就行了,关于安装多个版本的gcc的内容请参考我的这篇文章:Ubuntu16.04多个版本GCC编译器的安装和切换完成安装之后直接make编译就不会出现上述问题了。

 1 make -C /lib/modules/4.4.0-96-generic/build M=/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram modules
 2 make[1]: Entering directory /usr/src/linux-headers-4.4.0-96-generic
 3 Makefile:702: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
 4 scripts/Makefile.build:44: /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile: No such file or directory
 5 make[2]: *** No rule to make target /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile.  Stop.
 6 Makefile:1423: recipe for target _module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram failed
 7 make[1]: *** [_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram] Error 2
 8 make[1]: Leaving directory /usr/src/linux-headers-4.4.0-96-generic
 9 makefile:7: recipe for target modules failed
10 make: *** [modules] Error 2

Question2:这里重点关注了第四行的描述,也就是第一个make[1]的错误提示:/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile: No such file or directory,仔细一看,发现这里的文件名字是Makefile,回想起我的文件名是makefile,可能是这个问题,于是就rename一下:mv makefile Makefile 结果成功编译了~Cheers!所以说以后最好还是用Makefile来写吧~

 1 ubuntu-mm@ubuntu-mm:~/ARMTools/Code_arm/modulesprogram$ sudo make
 2 make -C /lib/modules/4.4.0-96-generic/build M=/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram modules
 3 make[1]: Entering directory /usr/src/linux-headers-4.4.0-96-generic
 4 scripts/Makefile.build:44: /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile: No such file or directory
 5 make[2]: *** No rule to make target /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile. Stop.
 6 Makefile:1423: recipe for target _module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram failed
 7 make[1]: *** [_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram] Error 2
 8 make[1]: Leaving directory /usr/src/linux-headers-4.4.0-96-generic
 9 makefile:7: recipe for target modules failed
10 make: *** [modules] Error 2

Question3:insmod在插入模块的过程中出现下面的问题,查阅相关博客是模块签名的相关问题,详细参见:http://blog.csdn.net/hui872370036/article/details/69950869

技术分享

insmod: ERROR: could not insert module ./hello.ko: Required key not available

内核从3.7后开始支持模块签名,这个功能使能以后,内核只允许安装特定key签名的模块,内核配置项如下所示:

 CONFIG_MODULE_SIG=y 表示开启了签名机制,但是这时候模块签名或不签名都可以使用。

 CONFIG_MODULE_SIG_FORCE=y 如果上述配置项使能,则模块必须有正确的签名才能正常使用。

 CONFIG_MODULE_SIG_ALL=y 内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。 

完~

Ubuntu16.04下的modules模块编译加载

标签:top   rm -rf   red   文件中   切换   gcc   ram   ini   roo   

原文地址:http://www.cnblogs.com/uestc-mm/p/7644966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!