1、首先编写对应的驱动程序的相关内容:(最简单的hello.c程序)html
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);
2、编写对应Makefile文件:(注意事项Makefile,首字母大写M)linux
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
3、使用make指令对程序进行编译生成目标文件hello.koshell
sudo make
使用的是sudo make的指令来保证运行和文件的执行权限等等,编译的结果以下所示:ubuntu
这里成功生成了咱们须要的.ko文件vim
使用sudo make clean命令来清除相关的中间文件以及目标文件:post
sudo make clean
这样就清除了全部的文件了~网站
4、安装加载模块,须要的是root权限:ui
sudo insmod ./hello.ko
这里的路径变了一下,是由于个人Ubuntu16.04的试题主机加载模块的时候,须要数字签名,可是数字签名以后仍是不能正确的加载,以后就在个人虚拟机Ubuntu16.04上实验了一下,这样竟然成功了,所以路径有所改变,可是驱动成功加载了。url
驱动加载成功的验证方法:spa
cat /var/log/syslog | grep Hello
这样就显示驱动成功加载了
也可使用lsmod来查看模块的加载:
lsmod | grep hello
使用rmmod指令来卸载驱动模块:
sudo rmmod hello
这里顺便推荐一个linux相关指令的中文查询网站:http://man.linuxde.net/
相关错误集合以下所示(确实不知道怎么解决,最后歪打正着就解决了,不过回过头来想,这些错误提示的分析也的确有很大的帮助吧):
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
内核在编译的时候,并不会主动去给模块签名,除非你把上述配置项打开。
根据下面的英文教程的相关提示,按照下面的步骤进行操做:
/usr/src/linux-headers-4.4.0-96-generic/scripts/sign-file sha512 /usr/src/linux-headers-4.4.0-96-generic/certs/signing_key.pem /usr/src/linux-headers-4.4.0-96-generic/certs/signing_key.x509 hello.ko
这里显示数字签名注册成功~注册的方式是使用了对应ubuntu16.04的linux内核版本的sign-file文件,注册使用的方式是 哈希表sha512格式 注册的帐户保存在signing_key.pem文件当中,对应的密钥保存在signing_key.x509文件当中。
若是你在对应的certs目录当中没有找到对应的两个文件,请用vim指令建立两个文件,并在.pem文件中输入以下的内容(这是pem文件的基本格式,因此要添上,不然会出现没法识别pem文件问题):
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
这样就完成了.pem文件的建立。
接下来就是加载对应的.ko模块的文件:
结果仍是如此有待解决~
目前在虚拟机上直接插入和安装是没有问题的(虚拟机内核版本:4.4.0-83-generic,实体机内核版本:4.4.0-96-generic)
关于签名证书的问题,如今也尚未很好的解决,后面再尝试找到对应的解决办法吧~
详细的module数字签名的英文文档参照:https://wiki.gentoo.org/wiki/Signed_kernel_module_support#Enabling_module_signature_verification
完~