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

 #include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("MDAXIA"); static int __init hello_init(void)
{
printk(KERN_ALERT "Hello world!\n");
return ;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye,cruel world!");
}
module_init(hello_init);
module_exit(hello_exit);

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

 ifeq ($(KERNELRELEASE),)
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
modules:
$(MAKE) -C $(KDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *.ko .depend *.mod.o *.mod.c Module.* modules.*
.PHONY:modules modules_install clean
else
obj-m :=hello.o
endif

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

sudo make

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

这里成功生成了我们需要的.ko文件

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

sudo make clean

这样就清除了所有的文件了~

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

sudo insmod ./hello.ko

这里的路径变了一下,是因为我的Ubuntu16.04的实体主机加载模块的时候,需要数字签名,但是数字签名之后还是不能正确的加载,之后就在我的虚拟机Ubuntu16.04上实验了一下,这样居然成功了,因此路径有所改变,但是驱动成功加载了。

驱动加载成功的验证方法:

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编译就不会出现上述问题了。

 make -C /lib/modules/4.4.--generic/build M=/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram modules
make[]: Entering directory '/usr/src/linux-headers-4.4.0-96-generic'
Makefile:: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
scripts/Makefile.build:: /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile: No such file or directory
make[]: *** No rule to make target '/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile'. Stop.
Makefile:: recipe for target '_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram' failed
make[]: *** [_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram] Error
make[]: Leaving directory '/usr/src/linux-headers-4.4.0-96-generic'
makefile:: recipe for target 'modules' failed
make: *** [modules] Error

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

 ubuntu-mm@ubuntu-mm:~/ARMTools/Code_arm/modulesprogram$ sudo make
make -C /lib/modules/4.4.--generic/build M=/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram modules
make[]: Entering directory '/usr/src/linux-headers-4.4.0-96-generic'
scripts/Makefile.build:: /home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile: No such file or directory
make[]: *** No rule to make target '/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram/Makefile'. Stop.
Makefile:: recipe for target '_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram' failed
make[]: *** [_module_/home/ubuntu-mm/ARMTools/Code_arm/modulesprogram] Error
make[]: Leaving directory '/usr/src/linux-headers-4.4.0-96-generic'
makefile:: recipe for target 'modules' failed
make: *** [modules] Error

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.--generic/scripts/sign-file sha512 /usr/src/linux-headers-4.4.--generic/certs/signing_key.pem /usr/src/linux-headers-4.4.--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

完~

Ubuntu16.04下的modules模块编译加载的更多相关文章

  1. ubuntu16.04下firefly rk3288的编译安卓4.4

    一.背景 OS: ubuntu 16.04 二.配置交叉编译环境 2.1 安装openjdk sudo apt-get install openjdk-7-jdk 2.2 使在同一台机器上可以编译an ...

  2. ubuntu16.04下的htk安装编译

    HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理HMM的实验工具包[1],主要应用于语音识别领域,也可以应用于语音合成.字符识别和DNA排序等领域.HTK经过剑桥大学.Ent ...

  3. 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案

    本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进 ...

  4. ubuntu16.04下笔记本自带摄像头编译运行PTAM

    ubuntu16.04下笔记本自带摄像头编译运行PTAM 转载请注明链接:https://i.cnblogs.com/EditPosts.aspx?postid=9014147 个人邮箱:feifan ...

  5. Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)

    Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...

  6. Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件)

    Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件) https://blog.csdn.net/woainishifu/article/details/79712110 我们在做项 ...

  7. Ubuntu16.04下编译安装及运行单目ORBSLAM2

    官网有源代码和配置教程,地址是 https://github.com/raulmur/ORB_SLAM2 1 安装必要工具 首先,有两个工具是需要提前安装的.即cmake和Git. sudo apt- ...

  8. ubuntu16.04下caffe以cpu运行faster rcnn demo

    参考https://haoyu.love/blog404.html 获取并修改代码 首先,我们需要获取源代码: git clone --recursive https://github.com/rbg ...

  9. Ubuntu16.04下KeepAlived+Nginx 布署

    前言         网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办 ...

随机推荐

  1. 通过dd命令显示硬盘的读写性能

    测试vdb硬盘的读写速度 1.分区格式化挂载vdb硬盘 2.新建写入文件2 3.测试:文件2中写入数据,设置块大小为100M,拷贝块个数为5 经过测试:测试效果一般count越高越准确,建议为300, ...

  2. 06 元祖 字典 集合set

    元组 定义: ti=() print(ti,type(ti)) 参数:for可以循环的对象(可迭代对象) t2=tuple(") # ('1', '2', '3') <class 't ...

  3. ORACLE透明加密

    --官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...

  4. 关于main函数的参数问题

    我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...

  5. python并发编程之IO模型,

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

  6. 前端之css样式(选择器)。。。

    一.css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,对html标签的渲染和布局 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 例如 二.c ...

  7. 【kafka】confluent_kafka重置offset

    之前写过两篇关于重置offset的博文,后来使用过程中都有问题. 经过各种尝试,终于找到了解决方案. 直接上代码: # coding=utf8 from confluent_kafka import ...

  8. 《剑指offer》 跳台阶

    本题来自<剑指offer> 跳台阶 题目1: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: 同上一篇. C ...

  9. Dig skipfish proxystrike

    1.DNS域名信息收集,(Dig,挖掘局域网的信息之前的博客中已经做过介绍) 查询需要认证的域名服务器  dig -t ns    +   网址 使用工具 fierce 判断主机上存活的其他域名服务器 ...

  10. jQuery常见的几个文档处理方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...