linux内核模块的编译

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
614
文章
12
评论
2019年1月1日01:50:12 评论

一、linux内核模块

Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。之所以提供模块机制,是因为Linux本身是一个单内核。单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷。

Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。

一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表中,以便模块间的通信。

内核提供了接口函数来注册我们自己的模块:

module_initmodule_exit分别用于加载和卸载模块,其中的x的函数声明为:

二、编译一个自己的模块

2.1 编写一个模块

首先下载内核源码:yum groupinstall "Development Tools",、安装好后源码在/usr/src/kernels/2.6.32-754.9.1.el6.x86_64/注意最后面的一串内核版本,可能和uname -r不一致

然后准备测试代码test.c

其中linux/module.hlinux/init.h是必须包含的两个问头文件,MODULE_LICENSE是模块许可证声明,一般设置为GPL,可选。MODULE_AUTHOR是模块作者,可选。

2.2 Makefile编写

如果不出意外,执行make即可生成我们要的模块文件test.ko,但是一般情况下,第一次编译是会失败的,会报错,错误的解决方案在最下面。

2.3 挂载模块到系统

挂载驱动使用insmod,卸载使用rmmod,先开启另外一个窗口开始打印调试信息:

插入模块到系统:

输出:

卸载:

输出:

linux内核模块的编译

三、错误处理

3.1 Kernel configuration is invalid

进入到内核代码目录,执行sudo make oldconfig && sudo make prepare,一路回车确认。

3.2 Symbol version dump xxx is missing

还是在刚刚的目录执行:sudo make scripts

当一个模块编译完成之后,使用insmod加载,使用rmmod加载,lsmod可以查看已经挂载的模块,modinfo查看一个模块的详细信息。

3.3 insmod: error inserting 'test.ko': -1 Invalid module format

插入驱动报错:

dmesg错误:

检查驱动内核版本是否一致,最开始出现这个问题是因为内核代码是自己手动下载的,后面改成yum下载就好了。

未分类
马谦马谦马谦
  • 本文由 发表于 2019年1月1日01:50:12
  • 转载请务必保留本文链接:https://www.dyxmq.cn/uncategorized/linux%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e7%9a%84%e7%bc%96%e8%af%91.html
C++11中const_cast的真正用途 C/C++

C++11中const_cast的真正用途

一、const和成员函数的故事 const的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候const限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11中的override和final关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用virtual和overri...
创建自签名CA和SSL证书 计算机网络

创建自签名CA和SSL证书

一、创建CA CA全称是CertificateAuthority,意思是证书颁发机构。只有当CA被认为是受信任的颁发机构时,经过该CA颁发出来的证书才属于受信任的证书。否则,认为证书是不受信任的。 为...
路漫漫其修远兮,吾将上下而求索 这里是生活

路漫漫其修远兮,吾将上下而求索

博客从17年毕业开始建立,到现在维护了3年的时间,一直在断断续续的写着。对于这个博客,起初想的是记录下自己在技术道路上的点点滴滴。但写着写着就发现,除了记录下日常的学习和工作以外,还有一个更重要的作用...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: